Jetpack Compose:列表更改时更新可组合项

Rem*_*emo 41 android listview kotlin android-jetpack-compose

我在屏幕上有一个可组合项,其中显示了跟踪项目(收藏夹)的列表:

var favourites: MutableList<Track> by mutableStateOf(mutableListOf())
Run Code Online (Sandbox Code Playgroud)
@ExperimentalFoundationApi
@Composable
private fun ResultList(model: FreezerModel) {
    with(model) {
        if (favourites.isEmpty()) NoDataMessage("No favourites yet")
        else {
            LazyColumn(state = rememberLazyListState()) {
                items(favourites) {
                    TrackCard(it, model)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在点击事件中,我正在更新我的收藏夹列表(添加/删除项目)。如何让我的可组合项立即反映这些更改(例如重新绘制自身或类似的东西)?到目前为止,它仅在我第一次切换到另一个屏幕时才有效。

感谢您的投入!

Gab*_*tti 69

您需要使用a MutableStateList<T>,以便Compose能够在状态改变时自动重新组合。

来自官方文档

注意:在 Compose 中使用可变对象(例如ArrayList<T>mutableListOf()状态)将导致您的用户在您的应用程序中看到不正确或过时的数据。

在您的代码中使用

val favourites = remember { mutableStateListOf<Track>()}
Run Code Online (Sandbox Code Playgroud)

代替

var favourites: MutableList<Track> by mutableStateOf(mutableListOf())
Run Code Online (Sandbox Code Playgroud)

  • 我们不能将“by”关键字与 mutableStateListOf() 一起使用。请改用“=”符号。 (28认同)
  • MutableStateList 在 Android 中不再可用 (4认同)

San*_*Sur 10

只需state = rememberLazyListState()lazyColumnFor参数列表中删除就可以适合您的情况。

根据文档,如果我们使用rememberLazyListState()then :-

如果状态已经创建,则对提供的初始值的更改不会导致状态被重新创建或以任何方式更改。

这样做之后,通常更新列表应该可以正常工作。将不可变列表 ( list) 而不是 amutableList暴露给可组合项也是一个很好的做法。

例如使用:-

var favourites by mutableStateOf(listOf<FavoriteItem>())
Run Code Online (Sandbox Code Playgroud)

然后add/remove/update使用以下列表:-

favourites = favourites + newList // add 
favourites = favourites.toMutableList().also { it.remove(item) } // remove
 
Run Code Online (Sandbox Code Playgroud)