Друзья, только изучаю 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
Как такое может быть?