繁体   English   中英

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

[英]Jetpack Compose: Update composable when list changes

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

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)
                }
            }
        }
    }
}

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

感谢您的投入!

您需要使用MutableStateList<T>以便 Compose 可以在 state 更改时自动重新组合。

来自官方文档

注意:在 Compose 中使用可变对象(例如ArrayList<T>mutableListOf()作为 state 将导致您的用户在您的应用中看到不正确或陈旧的数据。

在您的代码中使用

val favourites by mutableStateListOf<Track>()

代替

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

只需从lazyColumnFor参数列表中删除state = rememberLazyListState()就应该适用于您的情况。

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

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

这样做之后,通常更新列表应该可以正常工作。 将不可变列表( list )而不是mutableList给可组合对象也是一种好习惯。

例如使用:-

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM