每当我尝试从惰性列列表中删除时,都会得到arrayIndexOutOfBoundException,这是
var productsList = remember { mutableStateListOf<Product>() }//I load products in this list每当用户按下某个按钮时,我都会执行以下操作
productsList.remove(item) 我得到数组arrayIndexOutOfBoundException,这也是我循环的方式
itemsIndexed(productsList) { index, item ->不管怎样,为了避免这个错误
对于那些感兴趣的人来说,完整的代码:
fun MyProducts(navController: NavController,myProductsViewModel: MyProductsViewModel= viewModel()) {
var productsList = remember { mutableStateListOf<Product>() }
val scope = rememberCoroutineScope()
val listState = rememberLazyListState()
var currentImage = remember { mutableStateListOf<Int>() }
LaunchedEffect(key1 = Unit){
myProductsViewModel.getShop()
productsList.addAll(myProductsViewModel.productsList)
currentImage.addAll(List(productsList.size) {0})
}
var pickedImage: MutableState<String?> =remember { mutableStateOf("") }
BackHandler() {
navController.popBackStack()
}
LazyColumn(
Modifier
.fillMaxSize()
.padding(start = 16.dp),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(8.dp)
,state = listState
) {
itemsIndexed(productsList) { index, item ->
.clickable {when(icon){
Icons.Default.Delete->{
scope.launch {
myProductsViewModel.removeProducts(item.product_id,item.shop_id,item)
productsList.remove(item)
}
}
Icons.Default.Edit->{
}我在其余代码中访问相同的列表,但我认为它与问题无关
发布于 2021-10-06 16:24:47
您没有提供正确的代码示例,但是听起来您没有正确地更新列表和lazy列,因此该项将从列表中删除,但是lazy列并不知道这一点。
发布于 2021-10-06 19:08:10
在我看来,您的代码中通常存在一些不好的做法。例如:
LaunchedEffect(key1 = Unit){
myProductsViewModel.getShop()
productsList.addAll(myProductsViewModel.productsList)
currentImage.addAll(List(productsList.size) {0})
}这一切看起来都像是应该在视图模型中完成的事情。一般来说,composable应该将状态转换为UI,也就是说,它不应该包含任何业务逻辑。我刚刚展示的代码看起来像是可以在视图模型中完成的操作。
拥有像这样的东西
var productsList = remember { mutableStateListOf<Product>() }然后,使用LaunchedEffect添加元素并不是使用composables的方式。
首先,您的myProductsViewModel.productsList应该是一个保存产品列表的LiveData对象。然后,您应该执行以下操作:
val productList by myProductsViewModel.productsList.observeAsState(emptyList())然后在您的composable中显示它。如果你想改变列表内容,你应该在视图模型上调用一个方法,然后它会相应地更新列表的livedata对象。
我你希望我说得够清楚了。如果你有什么问题,请告诉我。
https://stackoverflow.com/questions/69468191
复制相似问题