Как сохранить ViewModel при навигации в Android?

новичок в 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 творение на Navhost кажется, чтобы предотвратить повторное init.

Rippyae 17.12.2022 22:11

Вы хотите использовать один и тот же экземпляр вашей ViewModel для всех компонуемых и родительских действий?

z.g.y 18.12.2022 02:22
1
2
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите поделиться экземпляром 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 и настроить ее как это

Другие вопросы по теме