0

从 a 中删除项目mutableStateListOf它保留删除的值,TextField将此值传递给TextField下面的另一个。我不知道这是否是 Jetpack Compose 的错误。

这有点令人困惑,因为我删除了第一行。

我的代码:

private var ids = mutableStateListOf<ShoppingCart>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent{
            i = intent.getParcelableArrayListExtra("produtos")!!
            ids=i.toMutableSet().toMutableStateList()

            ids = remember { ids }
                
            MainContent()
        }
    }

LazyColumn(
    modifier = Modifier
    .padding(top = 50.dp)
    .weight(1f)
    .border(4.dp, colorResource(id = R.color.pastel_green))
    ) {
        itemsIndexed(ids) { index, item ->

            var quantidades by rememberSaveable(stateSaver = TextFieldValue.Saver) {
                mutableStateOf(TextFieldValue(item.product_quant.toString()))
            }


            TextField(
                    value = quantidades,
                    onValueChange = {
                        quantidades = it

                        if (it.text.isNotEmpty()) {
                            item.product_quant = it.text.toInt()
                            calcular()
                        }
                    },
                    shape = RoundedCornerShape(8.dp),
                    colors = TextFieldDefaults.textFieldColors(
                            focusedIndicatorColor = Color.Transparent,
                            unfocusedIndicatorColor = Color.Transparent,
                            disabledIndicatorColor = Color.Transparent

                    ),
                    keyboardOptions = KeyboardOptions(
                            keyboardType = KeyboardType.Number
                    ),
                    modifier = Modifier
                        .width(70.dp)
                        .height(70.dp)
                        .padding(top = 20.dp)

            )


            Button(
                    onClick = {
                        ids.removeAt(index)
                        
                    },
                    modifier = Modifier
                        .padding(top = 20.dp, end = 20.dp)
            ) {
                Icon(
                        Icons.Default.Delete,
                        stringResource(id = R.string.deletar)
                )
            }
        }

在此处输入图像描述

4

1 回答 1

1

当您使用items惰性视图时,它会根据key.

而当你不传递key时,默认值为item index。

里面的所有remember值都绑定到该键,因此当您删除第一个单元格时,第二个单元格会重用它记住值,这就是您的情况。您可以通过一些项目id来防止这种情况。

但是,如果您有很多项目并且想要滚动您的列表,您会看到这些项目没有得到保存。您可以创建一个可变状态列表,但它会在屏幕旋转期间被清除。

我强烈建议您不要将状态变量存储为全局变量。

取而代之的是,所有应该共享且您不想丢失的数据都应该在视图模型中。除非您使用组合导航,否则它将在整个可组合树中共享。对于这种情况,请查看此答案如何共享它。

由于您需要修改product_quant,我建议您将其设为可变状态,因此更改将触发重组。

如果你不能更新ShoppingCart,你可以创建一个ShoppingCartState包装器,它有一个可变的状态和更新ShoppingCart值(如果你需要的话):

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val produtos = intent.getParcelableArrayListExtra("produtos")!!
    setContent{
        // initializing view model with produtos
        viewModel<ScreenViewModel>(
            factory = object : ViewModelProvider.Factory {
                override fun <T : ViewModel?> create(modelClass: Class<T>) =
                    ScreenViewModel(produtos) as T
            }
        )
        TestView()
    }
}
class ShoppingCartState(val shoppingCart: ShoppingCart) {
    private val _product_quant = mutableStateOf(shoppingCart.product_quant)
    var product_quant: Int
        get() = _product_quant.value
        set(value) {
            _product_quant.value = value
            shoppingCart.product_quant = value
        }
}

class ScreenViewModel(ids: List<ShoppingCart>) : ViewModel() {
    val shoppingCartStates = ids.map(::ShoppingCartState).toMutableStateList()

    fun calcular() {
        // do your calculations
    }
}

@Composable
fun TestView() {
    // you can pass view model as a parameter, but this also
    // will return same view model across whole composable tree
    val viewModel = viewModel<ScreenViewModel>()
    LazyColumn(
        modifier = Modifier
            .padding(top = 50.dp)
            .border(4.dp, Color.Green)//colorResource(id = R.color.pastel_green))
    ) {
        itemsIndexed(viewModel.shoppingCartStates) { index, item ->
            Row {
                TextField(
                    value = item.product_quant.toString(),
                    onValueChange = {
                        if (it.isNotEmpty()) {
                            item.product_quant = it.toInt()
                            viewModel.calcular()
                        }
                    },
                    shape = RoundedCornerShape(8.dp),
                    colors = TextFieldDefaults.textFieldColors(
                        focusedIndicatorColor = Color.Transparent,
                        unfocusedIndicatorColor = Color.Transparent,
                        disabledIndicatorColor = Color.Transparent

                    ),
                    keyboardOptions = KeyboardOptions(
                        keyboardType = KeyboardType.Number
                    ),
                    modifier = Modifier
                        .width(70.dp)
                        .height(70.dp)
                        .padding(top = 20.dp)

                )


                Button(
                    onClick = {
                        viewModel.shoppingCartStates.removeAt(index)
                    },
                    modifier = Modifier
                        .padding(top = 20.dp, end = 20.dp)
                ) {
                    Icon(
                        Icons.Default.Delete,
                        "delete"
                        //stringResource(id = R.string.deletar)
                    )
                }
            }
        }
    }
}
于 2021-08-31T13:17:13.867 回答