Я хочу понять, почему ссылка на объект состояния изменилась в updateCfg, но она по-прежнему не запускает рекомпозицию .
Этот объект состояния является нестабильным типом, поэтому он должен инициировать рекомпозицию при изменении ссылки, верно? Перед назначением в updateCfg _jsonCfg.value и cfg имеют равные значения, а элемент настроек ссылается на один и тот же список. Перед заданием я распечатал их хеш-коды, а они разные.
Код: Выделить всё
data class MyConfig(
var name: String,
var settings: mutableList
)
@Composable
fun Parents() {
val cfg:MyConfig by viewModelLocal.jsonCfg.observeAsState()
ChildComposableFunc(cfg) { newcfg ->
viewModelLocal.updateCfg(newcfg)
}
}
@Composable
fun ProgramEditor(
cfg: MyConfig,
modifyEnable: Boolean,
navController: NavHostController,
onCfgChange: (MyConfig) -> Unit
) {
...
cfg.settings.removeAt(0)
onCfgChange(cfg.copy())
}
class ViewModelLocal(inCfg: MyConfig) : ViewModel() {
val jsonCfg: LiveData
get() = _jsonCfg
private val _jsonCfg = MutableLiveData()
val tmpScene: LiveData
get() = _tmpScene
private val _tmpScene = MutableLiveData()
init {
Log.d("ViewModelLocal", "Create A ViewModelLocal")
_jsonCfg.value = inCfg
_jsonCfg.observeForever { newValue ->
Log.d("ViewModelLocal", "LiveData changed: $newValue")
}
_tmpScene.value = getNewDefaultScene()
}
fun updateCfg(cfg: MyConfig) {
Log.d("ViewModelLocal", "updateCfg: ${_jsonCfg.value}")
Log.d("ViewModelLocal", "updateCfg: $cfg")
Log.d("CPKCPK1", "" + System.identityHashCode(_jsonCfg.value))
Log.d("CPKCPK2", "" + System.identityHashCode(cfg))
_jsonCfg.value = cfg
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... er-compose
Мобильная версия