Вручную (повторно)запустите функцию ViewModel после извлечения другого составного элемента из backstack

#android #kotlin #mvvm #android-jetpack-compose #android-viewmodel

Вопрос:

У меня есть следующий поток: при запуске приложения отображается экран с популярными элементами. Пользователь входит в систему, при успешном входе в систему открывается backstack, и пользователь возвращается на экран с популярными элементами. Но при входе в систему также должны отображаться элементы, которые пользователю понравились/посмотрели в последний раз.

В режиме без создания я бы просто повторно запустил функцию в ViewModel, которая получает все элементы. Но в Compose я оказался бы в бесконечном цикле, если бы попытался вызвать функцию из Composable.

Мой вопрос — как я могу перезагрузить элементы после того, как пользователь вернется после успешного входа в систему на начальный экран? И какова наилучшая практика в таком случае?

Модель представления

 private val _itemsFlow = MutableStateFlow(emptyList())
val itemsFlow: StateFlow<List<Item>> = _itemsFlow

init {
   getItems()
}

private fun getItems() {
   viewModelScope.launch {
      itemRepository.getItems().collect { items ->
         _itemsFlow.value = items
      }
   }
}
 

Составная

 @Composable
fun Home(viewModel: HomeViewModel = hiltViewModel()) {
   val items by viewModel.itemsFlow.collectAsState()
   ...
   // used later in a LazyRow
}
 

Ответ №1:

Проверьте побочные эффекты

В вашем случае что-то подобное поможет:

 LaunchedEffect(Unit) {
    viewModel.getItems()
}