Jetpack 撰写惰性列不与列表重新组合

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

z.g*_*g.y 3

使用 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)