Jetpack Compose迁移中如何获取不同作用域的ViewModel实例?
Jetpack Compose 获取不同作用域ViewModel的实现方法
Jetpack Compose 中可以通过指定viewModel()函数的viewModelStoreOwner参数来控制ViewModel的作用域,两种常用场景的实现方式和原Fragment中的API对应关系如下:
1. 获取Activity全局共享ViewModel(等价于by activityViewModels())
显式将宿主Activity作为viewModelStoreOwner传入即可,ViewModel生命周期将和宿主Activity完全绑定,整个应用内共享实例:
// 写法1:通过LocalContext强转 val activityViewModel: MainActivityViewModel = viewModel( viewModelStoreOwner = LocalContext.current as ComponentActivity ) // 写法2:使用LocalActivity(需依赖activity-compose库,更稳妥) val activityViewModel: MainActivityViewModel = viewModel( viewModelStoreOwner = LocalActivity.current )
2. 获取页面专属ViewModel(等价于by viewModels())
默认情况下直接调用viewModel()不需要传参即可实现:
- 如果你使用了Navigation Compose,默认
viewModelStoreOwner是当前导航目的地对应的NavBackStackEntry,ViewModel生命周期和当前导航页面绑定,页面出栈时才会销毁 - 如果你没有使用Navigation Compose,默认
viewModelStoreOwner是最近的上层容器(比如当前Composable所在的Activity/父级自定义ViewModelStoreOwner),作用域和上层容器绑定
代码示例:
// Navigation Compose场景 NavHost(navController = navController, startDestination = "main_page") { composable("main_page") { // 仅和main_page导航目的地绑定,不同页面之间实例独立 val mainPageViewModel: MainFragmentViewModel = viewModel() } } // 非Navigation场景,直接在Composable中调用 @Composable fun CustomIndependentPage() { // 绑定当前Page的作用域 val pageViewModel: CustomPageViewModel = viewModel() }
依赖说明
使用上述API需要在模块build.gradle中引入对应依赖:
- 核心viewModel支持:
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2" - LocalActivity支持:
implementation "androidx.activity:activity-compose:1.8.2"
内容的提问来源于stack exchange,提问作者Abhimanyu
相关产品推荐
相关产品推荐

