by viewmodels与hiltviewmodel是否均可实现ViewModel实例共享?
关于Hilt ViewModel多视图共享实例的问题解答
首先明确结论:hiltViewModel完全支持多个视图共享同一个ViewModel实例,它并没有改变Android原生ViewModel的缓存逻辑,只是在原有逻辑基础上增加了依赖注入的能力。
常用的共享场景实现方式
同Activity下多个Fragment共享
只需要给目标ViewModel添加@HiltViewModel注解,构造函数添加@Inject注解,之后在所有需要共享的Fragment中使用by activityViewModels()获取实例即可,所有Fragment拿到的都是绑定到宿主Activity的同一个ViewModel实例。
示例代码结构:@HiltViewModel class SharedViewModel @Inject constructor() : ViewModel() { // 内部业务逻辑 } // 每个需要共享的Fragment中获取实例 val viewModel: SharedViewModel by activityViewModels()同导航图下多个目的地共享
如果你使用Navigation组件,需要同一个导航图下的多个Fragment/目的地共享ViewModel,只需要在获取实例时指定导航图ID,同时传入Hilt提供的默认ViewModel Factory即可:val viewModel: SharedViewModel by navGraphViewModels(R.id.target_nav_graph) { defaultViewModelProviderFactory }
注意事项
- 共享的核心前提是所有视图获取ViewModel时绑定的是同一个生命周期持有者(同一个Activity、同一个导航图的BackStackEntry等),和是否使用Hilt无关。
@HiltViewModel注解本身不会把ViewModel变成全局单例,如果你在两个不同的Activity中分别用by viewModels()获取同一个HiltViewModel实例,最终会得到两个完全独立的实例。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

