Mar*_*il4 5 android android-jetpack-compose kotlin-stateflow lazycolumn compose-recomposition
我有一个存储在Viewmodelvia内的列表Stateflow。
class FirstSettingViewModel : ViewModel() {
private val _mRoomList = MutableStateFlow<List<InitRoom>>(mutableListOf())
val mRoomList: StateFlow<List<InitRoom>> = _mRoomList
...
Run Code Online (Sandbox Code Playgroud)
我通过 观察流程collectAsState()。它LazyColumn由可以单击的框组成。
val roomList = mViewModel.mRoomList.collectAsState()
Dialog {
...
LazyColumn(...) {
items(roomList.value, key = { room -> room.room_seq}) { room ->
Box(Modifier.clickable {
**mViewModel.selectItem(room)**
}) {...}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当单击事件发生时,viewModel 通过复制列表更改“isSelected”值,如下所示。
fun selectItem(room: InitRoom) = viewModelScope.launch(Dispatchers.IO) {
try {
val cpy = mutableListOf<InitRoom>()
mRoomList.value.forEach {
cpy.add(it.copy())
}
cpy.forEach {
it.isSelected = it.room_seq == room.room_seq
}
_mRoomList.emit(cpy)
} catch (e: Exception) {
ErrorController.showError(e)
}
}
Run Code Online (Sandbox Code Playgroud)
当在xml基于视图和 a中时,此代码可以很好地工作,但在上面的组合代码中,它似乎根本ListAdapter没有重新组合。LazyColumn我能对 做re-compose什么LazyColumn?
使用 aSnapshotStateList代替普通的List
改变这个,
private val _mRoomList = MutableStateFlow<List<InitRoom>>(mutableListOf())
val mRoomList: StateFlow<List<InitRoom>> = _mRoomList
Run Code Online (Sandbox Code Playgroud)
对此
private val _mRoomList = MutableStateFlow<SnapshotStateList<InitRoom>>(mutableStateListOf())
val mRoomList: StateFlow<SnapshotStateList<InitRoom>> = _mRoomList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1924 次 |
| 最近记录: |