Задать вопрос
mitaichik
@mitaichik

Compose: откуда берется рассинхрон в mutableState при его изменении в LaunchedEffect?

Есть объект: 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.

Как такое может быть?
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • AndroidSprint
    Android + Аутстаффинг: опыт работы в IT-команде
    8 месяцев
    Далее
  • Академия Эдюсон
    Android-разработчик + ИИ
    6 месяцев
    Далее
  • Нетология
    Android-разработчик
    14 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы