You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:57:02