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

如何在父Fragment与作为标签页的两个子Fragment间共享ViewModel

不需要粘贴完全相同的代码,且你当前FragmentA的ViewModel初始化代码存在错误,按以下步骤调整即可实现三个Fragment共享同一个ViewModel实例:

  • 修正FragmentA的ViewModel初始化逻辑
    你当前在FragmentA中指定ownerProducer = { requireParentFragment() },会让FragmentA尝试从它自己的父Fragment中获取ViewModel存储实例,无法将ViewModel绑定到FragmentA自身的生命周期。调整为以下写法即可,让FragmentA作为ViewModel的生命周期宿主:
private val viewModel: MyViewModel by viewModels {
    createVMFactory {
        MyViewModel(MyRepo())
    }
}
  • FragmentB和FragmentC的获取逻辑
    子Fragment不需要重复写ViewModel的工厂创建逻辑,只需要指定ViewModel的所有者为父Fragment(即FragmentA),系统会自动复用FragmentA中已经创建好的ViewModel实例:
// fragmentB、fragmentC中统一使用该声明即可
private val viewModel: MyViewModel by viewModels(ownerProducer = { requireParentFragment() })
  • 验证前提条件
    你当前的ViewPager适配器初始化逻辑是正确的,给MyCustomStateAdapter传入的是FragmentA实例,只要适配器内部使用的是FragmentA的childFragmentManager创建子Fragment,就能保证fragmentB和fragmentC是FragmentA的子Fragment,调用requireParentFragment()可以正确拿到FragmentA实例,共享ViewModel的逻辑就能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:06