使用Android ViewModel跨Fragment共享数据遇报错:Cannot resolve method of(android.app.Activity)
解决ViewModelProviders.of()无法解析方法的问题
嘿,这个问题我之前也碰到过!原因是你用的ViewModelProviders类已经被Android官方废弃了——从AndroidX Lifecycle 2.2.0版本开始,官方就推荐直接用ViewModelProvider类来获取ViewModel实例,所以旧的写法才会报“无法解析方法”的错误。下面给你一步步讲怎么解决:
1. 先确认依赖版本正确
首先检查你的Module级别build.gradle(或者build.gradle.kts)里,有没有引入正确的AndroidX Lifecycle依赖,版本至少要2.2.0以上,建议用最新稳定版:
dependencies { def lifecycle_version = "2.6.2" // Java项目用这个 implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // Kotlin项目推荐用ktx版本,更简洁 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" // 可选:如果需要用到生命周期观察,再加这个 implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" }
2. 替换旧代码为新写法
把你原来的代码:
ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
直接替换成:
new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
要是你用的是Kotlin,写法会更简洁:
ViewModelProvider(requireActivity())[SharedViewModel::class.java]
3. 几个关键注意点
- 一定要用
requireActivity()代替getActivity():getActivity()有可能返回null,而requireActivity()会确保拿到非空的Activity实例,能避免潜在的空指针问题。 - 两个Fragment都要通过同一个Activity的ViewModelProvider获取SharedViewModel:这样两个Fragment拿到的才是同一个ViewModel实例,才能实现数据共享的目的。
额外小科普
官方废弃ViewModelProviders是为了简化API——原来的of()方法其实就是帮你创建ViewModelProvider实例,现在直接暴露构造方法,代码逻辑更直观,也减少了一层封装。
内容的提问来源于stack exchange,提问作者Tobias420d
相关产品推荐
相关产品推荐

