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

使用navGraphViewModels时如何在父Activity中获取同一ViewModel实例

实现方案

你在Activity中可以通过绑定同一份导航图作用域的方式获取到完全相同的HomeViewModel实例,具体实现如下:

前置要求

确保你的项目引入的 Navigation Component 版本不低于 2.2.0,该版本开始支持Activity层面直接使用navGraphViewModels委托。

标准实现代码

首先找到你布局中承载home_navigation_xml导航图的FragmentContainerView的ID(示例假设ID为R.id.home_nav_host),然后在Activity中编写如下代码:

// 先获取对应导航图的NavController实例,懒加载避免初始化时机异常
private val homeNavController by lazy {
    findNavController(R.id.home_nav_host)
}

// 绑定和Fragment相同的导航图作用域,获取同一实例ViewModel
private val homeViewModel: HomeViewModel by navGraphViewModels(R.id.home_navigation_xml, { homeNavController }) {
    defaultViewModelProviderFactory
}

注意:不要在onCreate方法调用setContentView之前访问homeViewModel,此时NavHost还未初始化完成,会抛出异常。

兼容低版本的实现方式

如果你的Navigation版本低于2.2.0,可以直接通过导航图的回退栈条目手动获取ViewModel:

val navBackStackEntry = homeNavController.getBackStackEntry(R.id.home_navigation_xml)
val homeViewModel = ViewModelProvider(navBackStackEntry, defaultViewModelProviderFactory)[HomeViewModel::class.java]

原理解释

navGraphViewModels本质是将ViewModel的生命周期绑定到指定导航图的回退栈条目上,只要导航图没有被销毁,所有绑定该导航图作用域的组件(Fragment、宿主Activity)获取到的都是同一个ViewModel实例。


内容的提问来源于stack exchange,提问作者Bincy Baby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:42:03