我在屏幕上有一个可组合文件,它显示了曲目项目(收藏夹)的列表:
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可以在状态更改时自动重新组合。
来自官方文档:
注意:在Compose中使用
ArrayList<T>
或mutableListOf()
等可变对象作为状态会导致用户在应用程序中看到不正确或过时的数据。
在您的代码中使用
val favourites = remember { mutableStateListOf<Track>()}
而不是
var favourites: MutableList<Track> by mutableStateOf(mutableListOf())
在您的情况下,只需从lazyColumnFor
参数列表中删除state = rememberLazyListState()
即可。
根据文档,如果我们使用rememberLazyListState()
,则:-
对所提供初始值的更改不会导致状态被重新创建或以任何方式更改(如果状态已经创建)。
这样做之后,通常更新列表应该可以正常工作。另外,将不可变列表(list
)而不是mutableList
公开给compositable也是一种很好的做法。
例如使用:-
var favourites by mutableStateOf(listOf<FavoriteItem>())
则使用:-add/remove/update
列表
favourites = favourites + newList // add
favourites = favourites.toMutableList().also { it.remove(item) } // remove
如果你想使用mutableStateMapOf()
,你可以这样做
val setData = remember { mutableStateMapOf("1" to "Jayant","2" to "Manish") }
Text(text = "${setData["1"]}")
输出
Jayant