所以,我有一個mutableStateListOf在viewModel:
var childTravellersList = mutableStateListOf<TravellersDetails>()
TravellersDetails是一個資料類,有一個名為 的欄位error。
這childTravellersList在 UI 中用作:
val list = remember{viewModel.childTravellersList}
LazyColumn(state = lazyColumnState) {
itemsIndexed(list) { index, item ->
SomeBox(show = if(item.error) true else false)
}
}
我在TravellersDetails 的viewModel更新error中撰寫了一個函式index,childTravellersList如下所示:
fun update(index){
childTravellersList[index].error = true
}
所以,每當我呼叫這個函式時,串列都應該更新。
這會更新串列,但不會觸發 UI 重組 ??。我哪里做錯了?
uj5u.com熱心網友回復:
僅當您更改整個串列時才會進行重組。你可以這樣做。
var childTravellersList by mutableStateOf(emptyList<TravellersDetails>())
fun update(indexToUpdate: Int) {
childTravellersList = childTravellersList.mapIndexed { index, details ->
if(indexToUpdate == index) details.copy(error = true)
else details
}
}
此外,您無需像在此處所做的那樣記住可組合中的此串列val list = remember{viewModel.childTravellersList}。由于 MutableState 在視圖模型中,它將始終在所有重組中幸存下來。只需使用viewModel.childTravellersList內部的 LazyColumn。
uj5u.com熱心網友回復:
mutableStateListOf只能通知添加/洗掉/替換串列中的某些元素。當您更改串列中的任何類時,可變狀態無法知道它。
資料類非常適合在單向資料流中存盤不可變狀態,因為您始終可以使用 來“更改”它copy,同時您看到需要將新資料傳遞給視圖或可變狀態。因此,避免將var變數與資料類一起使用,始終宣告它們val以防止此類錯誤。
var childTravellersList = mutableStateListOf<TravellersDetails>()
fun update(index){
childTravellersList[index] = childTravellersList[index].copy(error = true)
}
另一個問題是您正在使用val list = remember{viewModel.childTravellersList}:它保存第一個串列值并防止將來更新。查看視圖模型可以直接使用itemsIndexed(viewModel.childTravellersList)
uj5u.com熱心網友回復:
改用 LiveData 來觸發更新。您的串列應該僅作為普通變數可用。您可以添加/洗掉/洗掉串列中的專案,甚至更新每個專案的屬性。對串列進行這些更新后,只需通過生成亂數重新觸發 LiveData:
搖籃:
implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
科特林:
import androidx.lifecycle.MutableLiveData
class MyViewModel: ViewModel() {
var childTravellersList = mutableListOf<TravellersDetails>()
var onUpdate = MutableLiveData(0)
fun update(index){
childTravellersList[index].error = true
onUpdate.value = (0..1_000_000).random()
}
}
@Composable
fun MyComposableHandler() {
viewmodel.onUpdate.observeAsState(0).value
MyComposable(
travelersList = viewmodel.childTravellersList
)
}
@Composable
fun MyComposable(
travelersList: List<TravellersDetails>
) {
}
您應該避免在視圖模型中為需要更新的不同變數創建多個 LiveData 變數。只需創建一個 LiveData 變數,如上所示。每當您需要重構可組合項時,您只需觸發 LiveData。視圖模型中的邏輯應該決定需要更新什么,但將實際更新機制留給單個 LiveData observable。這是一個干凈的模式,將使您的可組合更新更容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/336847.html
標籤:安卓 科特林 android-jetpack-compose android-jetpack
