【问题标题】:Removed From the lazy column list从惰性列列表中删除
【发布时间】:2021-10-06 15:04:01
【问题描述】:

每当我尝试从惰性列列表中删除时,我都会得到 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->{

                                       }

我在其余代码中访问相同的列表,但我认为它与问题无关

【问题讨论】:

  • 至少要准确说出异常发生在哪一行。
  • 或者代码块,如果你因为一些模糊的原因不确定确切的行。
  • logcat 没有显示哪一行最有可能出现异常,因为我正在使用约束布局。它只是告诉我 arraysize=2 和 index=2 所以它是 indexOutOfBoundException。

标签: android kotlin android-jetpack-compose


【解决方案1】:

您没有提供正确的代码示例,但听起来您没有正确更新列表和惰性列,因此该项目已从列表中删除,但惰性列不知道。

【讨论】:

  • 那怎么让懒专栏知道呢?
【解决方案2】:

在我看来,您的代码通常有一些不好的做法。例如:

LaunchedEffect(key1 = Unit){
   myProductsViewModel.getShop()
    productsList.addAll(myProductsViewModel.productsList)
    currentImage.addAll(List(productsList.size) {0})
}

这一切看起来都应该在视图模型中完成。一般来说,composable 应该将状态转换为 UI,这意味着它不应该包含任何业务逻辑。我刚刚展示的代码片段看起来像是可以在视图模型中完成的。

有这样的东西

var productsList = remember { mutableStateListOf<Product>() }

然后添加带有 LaunchedEffect 的元素并不是可组合的使用方式。

首先,您的myProductsViewModel.productsList 应该是一个包含您的产品列表的 LiveData 对象。那么你应该做以下事情:

val productList by myProductsViewModel.productsList.observeAsState(emptyList())

然后你在你的可组合中展示它。如果你想改变列表内容,你应该在视图模型上调用一个方法,然后相应地更新列表的 livedata 对象。

我希望我解释得足够清楚。如果您有任何问题,请告诉我。

【讨论】:

  • 如何调用viewmodel中做逻辑的函数?
  • 您需要定义一个方法:让我们在您的视图模型中说fun removeProduct(index: Int),然后您在单击视图模型的项目上调用该方法。
  • 加载所有现有产品的函数在哪里调用它
  • 很可能在视图模型的初始化块中
  • 从列表中删除元素后,尽管视图模型中的数组已更新,但列表不会更新并且 compose 函数不会重组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多