繁体   English   中英

从jetpack compose中的房间数据库中删除项目时,UI未重新组合

[英]Ui Not recomposing when deleting items from room database in jetpack compose

我正在使用带有 jetpack compose 的房间数据库,删除所有项目后,除非我移动到另一个屏幕并再次返回,否则 UI 不会重新组合,任何帮助将不胜感激,谢谢

  • 这是我的代码
fun CheckOutScreen(shopViewModel: ShopViewModel, 
                   navHostController: NavHostController,
                   list : SnapshotStateList<PurchaseModel> ) {


    val firebaseAuth = FirebaseAuth.getInstance()
    val databaseReference = FirebaseDatabase.getInstance().reference
    val context = LocalContext.current
    val totalAmount = remember { mutableStateOf(0.0) }
    val count = remember { mutableStateOf(0) }
    val isDialogShowing = remember { mutableStateOf(false) }
    val isProgressShowing = remember { mutableStateOf(false) }
    val isDataSaving = remember { mutableStateOf(false) }
    val isMovingToAnotherScreen = remember { mutableStateOf(false)}

    list.forEach {
        if(count.value < list.size){
            totalAmount.value += it.totalPrice
            count.value++
        }
    }

    Scaffold{
        Column {
            Row(modifier = Modifier.fillMaxWidth()) {
                Text(text = "Cart", modifier = Modifier
                    .weight(1f)
                    .padding(10.dp), color = Color.DarkGray,
                    style = MaterialTheme.typography.h1, fontSize = 17.sp)
                IconButton(onClick = {
                    isDialogShowing.value = true
                }) {
                    Icon(Icons.Filled.Delete,"")
                }
            }
            if(list.size == 0){
                Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) {
                    Text("No Items In The Cart", style = MaterialTheme.typography.h1,
                        color = Color.DarkGray , fontSize = 17.sp)
                }
            }
            else {
                Box(contentAlignment = Alignment.Center){
                    Column() {
                        Text(text = "Purchase To : " + list[0].fullName, modifier = Modifier.padding(start = 10.dp,
                            end = 10.dp, top = 5.dp), fontSize = 17.sp,style = MaterialTheme.typography.body1)
                        LazyColumn(modifier = Modifier
                            .weight(1f)
                            .padding(top = 10.dp)){
                            items(list.size, key = { item -> item.hashCode()}){ pos ->
                                val dismissState = rememberDismissState(confirmStateChange = {
                                    if(it == DismissValue.DismissedToStart || it == DismissValue.DismissedToEnd){
                                        shopViewModel.deletePurchase(list[pos].purchaseId!!)
                                        Toast.makeText(context,"Item Successfully Dismissed",Toast.LENGTH_SHORT).show()
                                    }
                                    true
                                })

                                if(!isMovingToAnotherScreen.value){
                                    SwipeToDismiss(
                                        state = dismissState,
                                        background = {},
                                        dismissContent = {
                                            Card(elevation = 10.dp, modifier = Modifier
                                                .clip(shape = RoundedCornerShape(6.dp))
                                                .padding(5.dp)) {
                                                Row(modifier = Modifier.fillMaxWidth()) {
                                                    Box(contentAlignment = Alignment.Center) {
                                                        AsyncImage(model = ImageRequest.Builder(context).data(list[pos].productImage).build(),
                                                            contentScale = ContentScale.Crop,
                                                            modifier = Modifier
                                                                .width(80.dp)
                                                                .height(80.dp)
                                                                .padding(10.dp),
                                                            contentDescription = "")
                                                    }
                                                    Column(modifier = Modifier.weight(1f)) {
                                                        Text(list[pos].title, modifier = Modifier.padding(5.dp), fontWeight = FontWeight.Bold)
                                                        Text("Quantity : " + list[pos].totalQuantity)
                                                        Text("Due To : " + list[pos].totalPrice)
                                                    }
                                                }
                                            }
                                        },
                                        directions = setOf(DismissDirection.StartToEnd,DismissDirection.EndToStart))
                                }
                            }
                        }

                        Card(modifier = Modifier
                            .fillMaxWidth()
                            .clip(shape = RoundedCornerShape(topStart = 20.dp, topEnd = 20.dp))) {
                            Button(modifier = Modifier.padding(start = 20.dp, end = 20.dp),onClick = {
                                isProgressShowing.value = true
                            }) {
                                Text("Pay ${totalAmount.value}")
                            }
                        }


                    }
                }
                AnimatedVisibility(visible  = isProgressShowing.value) {
                    CircularProgressIndicator(color = Color.DarkGray)
                }
            }

        }

        if(isProgressShowing.value){

            val map = hashMapOf<String,Any>()
            map["list"] = list
            map["uid"] = firebaseAuth.currentUser!!.uid
            map["totalPrice"] = totalAmount.value.toString()

            val db = databaseReference.child("Purchases")
            db.child(firebaseAuth.currentUser!!.uid)
                .child(Calendar.getInstance().timeInMillis.toString())
                .setValue(map)
                .addOnSuccessListener {
                    isDataSaving.value = true
                }
                .addOnFailureListener {

                }
        }
        if(isDialogShowing.value){
            AlertDialog(
                onDismissRequest = { isDialogShowing.value = false },
                confirmButton = {
                    TextButton(onClick = {
                        shopViewModel.deletePurchases()
                        isDialogShowing.value = false
                        Toast.makeText(context,"All items are successfully removed",Toast.LENGTH_SHORT).show()
                    }) {
                        Text("Proceed")
                    }
                },
                dismissButton = {
                    TextButton(onClick = { isDialogShowing.value = false }) {
                        Text("Cancel")
                    }
                },
                title = { Text("Removing Items ") },
                text = { Text("Do you want to remove items from cart ! ") }
            )
        }
        if(isDataSaving.value){
            LaunchedEffect(Unit){
                delay(3000)
                isMovingToAnotherScreen.value = true
                shopViewModel.deletePurchases()
                isProgressShowing.value  = false
                isDataSaving.value = false
                navHostController.navigate(AppRouting.Payment.route)
            }
        }
    }
    BackHandler {
        isMovingToAnotherScreen.value = true
        navHostController.popBackStack()
    }

}

这很可能是因为没有更新State的值。 在您的示例中,它始终是相同的列表。 您需要使用新的 list 实例设置值或使用SnapshotStateList 你也可以检查这个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM