Как правильно подойти к вопросу: compose: Откуда берется рассинхрон в mutableState при его изменении в LaunchedEffect?
Сейчас ситуация такая: друзья, только изучаю compose, и столкнулся с проблемой:
Есть объект
SomeState(val result : SomeObject? = null)
По вводным: есть ViewModel, в которой:
val state = mutableStateOf<SomeState>(SomeState(null)) fun load() { state.value = SomeState(null) /// some operation state.value = SomeState(someNotNullResult) }
По вводным: и есть Composable функция
val vm = hiltViewModel<SomeViewModel>(key = "123") LaunchedEffect(Unit) { vm.load() } if(vm.state.value.result != null) { Show(vm.state.value.result) }
Сейчас ситуация такая: все это у меня показывается в модальном диалоге, то есть активити / фрегмент не меняется, соответсвенно ViewModel переиспользуется.
По вводным: наблюдаю следующее поведение.
По вводным: открываю модальное окно первый раз
По вводным: все работает нормально, метод load в LaunchedEffect загружает объект, и потом его успешно отображает.
По вводным: но при втором открытии модального окна происходит следующее (судя по дебагу):
Сейчас ситуация такая: изначально vm.state.value.result не равно NULL - так как он подгружен при прошлом открытии.
Это понятно.
По вводным: далее метод load в LaunchedEffect вызывает state.value = SomeState(null), то есть vm.state.value.result теперь должно быть null
По вводным: но в Composable функции условие vm.state.value.result!= null все равно проходит, ну и приложение падает, так как в этот момент vm.state.value.result в действительности равно null
Как такое может быть?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос