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

Android中子Fragment无法访问Activity共享ViewModel的问题

解决Fragment无法访问Activity中带依赖的ViewModel问题

问题根源

当Fragment使用activityViewModels()获取Activity的ViewModel时,若ViewModel存在自定义构造函数(需依赖注入),必须确保Fragment获取时指定与Activity一致的Factory。否则系统会尝试用无参构造创建ViewModel,从而抛出Cannot create an instance of class MyViewModel异常。

修复步骤

1. 修改Fragment的ViewModel声明

在ItemListFragment中显式传入Activity使用的Factory:

private val viewModel: MyViewModel by activityViewModels { MyViewModel.Factory }

2. 确认Application类配置

确保SharedViewModelApplication正确继承自Application:

class SharedViewModelApplication : Application() {
    // 可添加自定义初始化逻辑
}

同时在AndroidManifest.xml中指定该Application:

<application
    android:name=".SharedViewModelApplication"
    <!-- 其他原有配置 -->
>

3. 验证Factory初始化逻辑

  • 确保使用Jetpack ViewModel KTX提供的viewModelFactory扩展函数(需依赖androidx.lifecycle:lifecycle-viewmodel-ktx)
  • 确认APPLICATION_KEY导入正确:import androidx.lifecycle.viewmodel.CreationExtras.APPLICATION_KEY

完整Fragment代码示例

class ItemListFragment : Fragment() {
    // 关键修改:添加Factory参数
    private val viewModel: MyViewModel by activityViewModels { MyViewModel.Factory }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 调用方法不再崩溃
        val testResult = viewModel.viewModelTest()
        Log.d("ViewModelDebug", testResult)
    }
}

额外注意事项

  • 若使用Navigation组件,确保Fragment直接依附在目标Activity下,避免嵌套Fragment导致activityViewModels()指向错误宿主
  • 保持Jetpack相关依赖库版本一致,避免版本兼容问题引发Factory失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:37:35