Ely*_*lye 2 android android-jetpack-compose jetpack-compose-swipe-to-dismiss
我有一个简单的示例应用程序可以
如果我
它将崩溃,如下面的 GIF 所示(您可以从这里获取代码设计https://github.com/elye/issue_android_jetpack_compose_swipe_to_dismiss_ Different_data_same_id )
原因是崩溃,因为在滑动关闭第 2 项(第二次加载数据)时,它找到的项仍然是第一次加载数据的第 2 项。
似乎解雇状态(如下面的代码所示)总是记住第一次加载的数据(而不是加载的新数据)
val dismissState = rememberDismissState(
confirmStateChange = {
Log.d("Track", "$item\n${myListState.value.toMutableList()}")
viewModel.removeItem(item)
true
}
)
Run Code Online (Sandbox Code Playgroud)
因此,这会导致删除发送错误的项目进行删除,从而导致失败和崩溃。
完整的LazyColumn和SwipeToDismiss代码如下
LazyColumn(modifier = Modifier.fillMaxHeight()) {
items(
items = myListState.value,
key = { todoItem -> todoItem.id }
) { item ->
val dismissState = rememberDismissState(
confirmStateChange = {
viewModel.removeItem(item)
true
}
)
SwipeToDismiss(
state = dismissState,
background = {
dismissState.dismissDirection ?: return@SwipeToDismiss
Box(modifier = Modifier.fillMaxSize().background(Color.Red))
},
dismissContent = {
// The row view of each item
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
这是
key = { todoItem -> todoItem.id }
为 key = { todoItem -> todoItem.title }
,那么一切都会好的rememberDismissState()
会记住confirmStateChange
lambda,它是DismissState
. 在你的情况下,item
可以改变,但 lambda 只捕获初始item
值,导致崩溃。
您可以使用以下方法rememberUpdatedState
来解决这个问题:
val currentItem by rememberUpdatedState(item)
val dismissState = rememberDismissState(
confirmStateChange = {
viewModel.removeItem(currentItem)
true
}
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2252 次 |
最近记录: |