简体   繁体   English

在 Android 中导航时如何保留 ViewModel?

[英]How to persist ViewModel when navigating in Android?

new to android, and doing it the Compose way. android 的新手,并以Compose的方式进行。

I have a BottomNavigation and three taps, each draw a different screen.我有一个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)
}

Using the backbutton or just tapping through each viewModel of the different screens seems to re init .使用后退按钮或只是点击不同屏幕的每个 viewModel 似乎重新init Is that the expected behavior?这是预期的行为吗? I like to persist the viewModel when switching routes.我喜欢在切换路由时保留 viewModel。

I don't have fragments, just one activity with composable我没有片段,只有一个可组合的活动

TIA TIA

If you want to share viewModel instance across your Nav Graph and your host activity you can do 2 things如果你想在你的导航图和你的主机活动中共享 viewModel 实例,你可以做两件事

one is assigning the local ViewModelStoreOwner一个是分配本地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
        }
    }
}

or another approach is creating a Local composition of your Activity instance and set it up like this或者另一种方法是创建 Activity 实例的 Local 组合并像这样设置它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 返回时刷新viewmodel中的数据,android - refresh data in viewmodel when navigating back, android 通过 navGraphViewModel 导航返回时保留 ViewModel 实例 - Keep ViewModel instance when navigating back with by navGraphViewModel 使用导航组件在 BottomNavigationView 中导航时如何防止 ViewModel 被清除 - How to prevent ViewModel from being cleared when navigating away in BottomNavigationView using Navigation Component 导航时Android应用程序停止 - Android app stops when navigating 如何在最小化应用程序后坚持导航组件目的地 - How to persist navigating component destination after minimizing the app 如何在android中持久化对象? - how to persist an object in android? 当 Android 需要 memory 并杀死您的应用程序时,如何保留数据? - How to persist data when Android needs memory and kills your app? 如何证明Android ViewModel - How to Prove Android ViewModel 当应用程序被杀死时,如何最好地清除 Android ViewModel? - How to best clear an Android ViewModel when the app is killed? 如何在使用viewmodel时将动态参数传递给android中的api - How to pass dynamic parameters to rest api in android when using viewmodel
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM