Anonymous
PullToRefreshContainer не загружает
Сообщение
Anonymous » 24 ноя 2024, 18:08
Код: Выделить всё
fun ProductsListScreen(
navHostController: NavHostController,
cartViewModel: CartViewModel = hiltViewModel(),
`enter code here`productViewModel: ProductViewModel = hiltViewModel()
) {
val products by productViewModel.products.collectAsState()
val isLoading by productViewModel.isLoading.collectAsState()
val errorMessage by productViewModel.errorMessage.collectAsState()
var showDetailsBottomSheet by remember { mutableStateOf(false) }
var selectedProduct by remember { mutableStateOf
(null) }
val lazyListState: LazyGridState = rememberLazyGridState()
var isRefreshing by remember {
mutableStateOf(false)
}
val pullToRefreshState = rememberPullToRefreshState(enabled = { isRefreshing })
val scope = rememberCoroutineScope()
Scaffold(modifier = Modifier.fillMaxSize(), topBar = {
Box(
modifier = Modifier
.statusBarsPadding()
.padding(10.dp)
) {
SearchBox(onClick = {
navHostController.navigate(NavDestination.Search.route)
})
}
}) { paddingValues ->
Box(
Modifier
.verticalScroll(rememberScrollState())
.nestedScroll(pullToRefreshState.nestedScrollConnection)
.fillMaxSize()
.padding(paddingValues)
) {
if (isLoading && products.isEmpty()) {
CircularProgressIndicator(Modifier.align(Alignment.Center))
} else if (errorMessage != null || products.isEmpty()) {
EmptyState(modifier = Modifier.align(Alignment.Center))
} else {
LazyVerticalGrid(
state = lazyListState,
modifier = Modifier
.fillMaxSize()
.padding(10.dp)
.padding(bottom = paddingValues.calculateBottomPadding()),
columns = GridCells.Fixed(2),
contentPadding = PaddingValues(5.dp)
) {
item(span = { GridItemSpan(2) }) {
ImageBanner(itemsList = products.flatMap { it.product_image })
}
item(span = { GridItemSpan(2) }) {
Spacer(modifier = Modifier.height(10.dp))
}
items(products) { product ->
ProductItem(product = product) { _selectedProduct ->
selectedProduct = _selectedProduct
showDetailsBottomSheet = true
}
}
}
}
if (pullToRefreshState.isRefreshing) {
LaunchedEffect(true) {
scope.launch {
isRefreshing = true
productViewModel.loadProducts(forceRefresh = true)
isRefreshing = false
}
}
}
LaunchedEffect(isRefreshing) {
if (isRefreshing) {
pullToRefreshState.startRefresh()
} else {
pullToRefreshState.endRefresh()
}
}
PullToRefreshContainer(
state = pullToRefreshState,
modifier = Modifier
.align(Alignment.TopCenter),
)
}
if (selectedProduct != null && showDetailsBottomSheet) {
ProductDetailsBottomSheet(product = selectedProduct!!,
onDismissRequest = { showDetailsBottomSheet = false },
onAddToCart = { product, quantity ->
cartViewModel.addToCart(
CartItem(
id = product.product_id,
price = product.product_price,
quantity = quantity,
product = product
)
)
})
}
}
}
Я вижу индикатор PullRefreshIndicator сверху, но он не тянет. Я пытался использовать
pullToRefreshState с
LazyGrid и
Box , но безрезультатно. Я пытался отобразить индикатор из MainScreen с помощью функции Unit на ProductsScreen, но тоже безрезультатно, и я пытался следовать этим руководствам Medium, YouTube, но безрезультатно.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... ot-pulling
1732460930
Anonymous
[code] fun ProductsListScreen( navHostController: NavHostController, cartViewModel: CartViewModel = hiltViewModel(), `enter code here`productViewModel: ProductViewModel = hiltViewModel() ) { val products by productViewModel.products.collectAsState() val isLoading by productViewModel.isLoading.collectAsState() val errorMessage by productViewModel.errorMessage.collectAsState() var showDetailsBottomSheet by remember { mutableStateOf(false) } var selectedProduct by remember { mutableStateOf (null) } val lazyListState: LazyGridState = rememberLazyGridState() var isRefreshing by remember { mutableStateOf(false) } val pullToRefreshState = rememberPullToRefreshState(enabled = { isRefreshing }) val scope = rememberCoroutineScope() Scaffold(modifier = Modifier.fillMaxSize(), topBar = { Box( modifier = Modifier .statusBarsPadding() .padding(10.dp) ) { SearchBox(onClick = { navHostController.navigate(NavDestination.Search.route) }) } }) { paddingValues -> Box( Modifier .verticalScroll(rememberScrollState()) .nestedScroll(pullToRefreshState.nestedScrollConnection) .fillMaxSize() .padding(paddingValues) ) { if (isLoading && products.isEmpty()) { CircularProgressIndicator(Modifier.align(Alignment.Center)) } else if (errorMessage != null || products.isEmpty()) { EmptyState(modifier = Modifier.align(Alignment.Center)) } else { LazyVerticalGrid( state = lazyListState, modifier = Modifier .fillMaxSize() .padding(10.dp) .padding(bottom = paddingValues.calculateBottomPadding()), columns = GridCells.Fixed(2), contentPadding = PaddingValues(5.dp) ) { item(span = { GridItemSpan(2) }) { ImageBanner(itemsList = products.flatMap { it.product_image }) } item(span = { GridItemSpan(2) }) { Spacer(modifier = Modifier.height(10.dp)) } items(products) { product -> ProductItem(product = product) { _selectedProduct -> selectedProduct = _selectedProduct showDetailsBottomSheet = true } } } } if (pullToRefreshState.isRefreshing) { LaunchedEffect(true) { scope.launch { isRefreshing = true productViewModel.loadProducts(forceRefresh = true) isRefreshing = false } } } LaunchedEffect(isRefreshing) { if (isRefreshing) { pullToRefreshState.startRefresh() } else { pullToRefreshState.endRefresh() } } PullToRefreshContainer( state = pullToRefreshState, modifier = Modifier .align(Alignment.TopCenter), ) } if (selectedProduct != null && showDetailsBottomSheet) { ProductDetailsBottomSheet(product = selectedProduct!!, onDismissRequest = { showDetailsBottomSheet = false }, onAddToCart = { product, quantity -> cartViewModel.addToCart( CartItem( id = product.product_id, price = product.product_price, quantity = quantity, product = product ) ) }) } } } [/code] Я вижу индикатор PullRefreshIndicator сверху, но он не тянет. Я пытался использовать [b]pullToRefreshState[/b] с [b]LazyGrid[/b] и [b]Box[/b], но безрезультатно. Я пытался отобразить индикатор из MainScreen с помощью функции Unit на ProductsScreen, но тоже безрезультатно, и я пытался следовать этим руководствам Medium, YouTube, но безрезультатно. Подробнее здесь: [url]https://stackoverflow.com/questions/79220384/pulltorefreshcontainer-not-pulling[/url]