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

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

Как такое может быть?
  • Вопрос задан
  • 12 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Android-разработчик с нуля
    14 месяцев
    Далее
  • Академия Eduson
    Android-разработчик
    6 месяцев
    Далее
  • Skillbox
    Профессия Разработчик игр на Unreal Engine с нуля до Middle
    12 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

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