簡體   English   中英

在 Android 中導航時如何保留 ViewModel?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM