новичок в Android, и делать это Compose
способом.
У меня есть BottomNavigation
и три нажатия, каждое из которых рисует другой экран.
@Composable
fun SetupNavigation(navHostController: NavHostController) {
NavHost(navController = navHostController, startDestination = "home") {
composable(route = "first") {
FirstScreen()
}
composable(route = "second") {
SecondScreen()
}
composable(route = "third") {
ThirdScreen()
}
}
}
@Composable
fun FirstScreen(
firstScreenViewModel: FirstScreenViewModel = hiltViewModel()
) {
val uiState by firstScreenViewModel.uiState.collectAsState()
Log.i("FirstScreen", "uiState: $uiState")
val coins = uiState.coinsList
ItemsList(items = items)
}
Использование кнопки «Назад» или просто нажатие на каждую модель представления на разных экранах, кажется, повторноinit
. Это ожидаемое поведение? Мне нравится сохранять viewModel при переключении маршрутов.
У меня нет фрагментов, только одно действие с компонуемым
ТИА
Вы хотите использовать один и тот же экземпляр вашей ViewModel для всех компонуемых и родительских действий?
Если вы хотите поделиться экземпляром viewModel в вашем навигационном графике и вашей активности хоста, вы можете сделать 2 вещи.
один назначает местный ViewModelStoreOwner
@Composable
fun SetupNavigation(navHostController: NavHostController) {
val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
}
NavHost(navController = navHostController, startDestination = "home") {
composable(route = "first") {
FirstScreen(firstScreenViewModel = hiltViewModel(viewModelStoreOwner))
}
composable(route = "second") {
SecondScreen() // you can also do it here if you want
}
composable(route = "third") {
ThirdScreen() // you can also do it here if you want
}
}
}
или другой подход - создать локальную композицию вашего экземпляра Activity и настроить ее как это
Поднять
viewModel
творение наNavhost
кажется, чтобы предотвратить повторноеinit
.