提问者:小点点

喷气背包撰写:列表更改时更新可组合


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

var favourites: MutableList<Track> by mutableStateOf(mutableListOf())
@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)
                }
            }
        }
    }
}

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

感谢您的投入!


共2个答案

匿名用户

您需要使用可变状态列表

来自官方文档:

警告:使用可变对象,如 ArrayList

在代码使用

val favourites = remember { mutableStateListOf<Track>()}

而不是

var favourites: MutableList<Track> by mutableStateOf(mutableListOf())

匿名用户

只需从 lazyColumnFor params 列表中删除状态 = 记住LazyListState() 应该适用于您的情况。

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

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

这样做之后,通常更新列表应该可以正常工作。此外,向可组合对象公开不可变列表(列表)而不是可变列表也是一种很好的做法。

例如使用:-

var favourites by mutableStateOf(listOf<FavoriteItem>())

然后使用添加/删除/更新列表:-

favourites = favourites + newList // add 
favourites = favourites.toMutableList().also { it.remove(item) } // remove