Как правильно подойти к вопросу: compose: Откуда берется рассинхрон в mutableState при его изменении в LaunchedEffect?

Ссылка скопирована
0 ответов

Сейчас ситуация такая: друзья, только изучаю 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

Как такое может быть?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно