Есть объект:
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.
Как такое может быть?