[英]How to persist ViewModel when navigating in 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)
}
使用后退按鈕或只是點擊不同屏幕的每個 viewModel 似乎重新init
。 這是預期的行為嗎? 我喜歡在切換路由時保留 viewModel。
我沒有片段,只有一個可組合的活動
TIA
如果你想在你的導航圖和你的主機活動中共享 viewModel 實例,你可以做兩件事
一個是分配本地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 實例的 Local 組合並像這樣設置它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.