求助:无法通过ViewModelProvider获取Fragment对应的生命周期ViewModel类
我来帮你排查下这个问题,你用的是android.support.v4.app.Fragment,同时依赖android.arch.lifecycle相关包,调用ViewModelProvider.of(this).get(UserListViewModel.class)没生效,大概率是依赖配置或者ViewModel类的写法有问题,下面一步步来解决:
1. 检查依赖是否完整且匹配
因为你用的是support库(而非AndroidX),必须确保lifecycle依赖是support版本的,不能混AndroidX的包。在Module级别的build.gradle里添加这些依赖:
// Lifecycle组件(适配Support Library) implementation "android.arch.lifecycle:extensions:1.1.1" annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
如果你的项目已经迁移AndroidX,那得把Fragment换成androidx.fragment.app.Fragment,同时依赖AndroidX版本的lifecycle库:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0" implementation "androidx.lifecycle:lifecycle-livedata:2.2.0" annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.2.0"
2. 确认ViewModel类的写法正确
UserListViewModel需要正确继承ViewModel或AndroidViewModel,并且要有符合要求的构造函数:
// 继承ViewModel的写法(无参构造) public class UserListViewModel extends ViewModel { public UserListViewModel() { // 初始化逻辑 } } // 继承AndroidViewModel的写法(需接收Application参数) public class UserListViewModel extends AndroidViewModel { public UserListViewModel(Application application) { super(application); // 初始化逻辑 } }
如果ViewModel需要自定义构造参数,不能直接用ViewModelProvider.of(this).get(...),得自定义ViewModelFactory来创建实例。
3. 正确调用ViewModelProvider
要在Fragment生命周期的合适时机调用(比如onViewCreated()或onActivityCreated()之后,确保Fragment已和Activity关联),示例代码:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); UserListViewModel viewModel = ViewModelProvider.of(this).get(UserListViewModel.class); // 后续使用viewModel处理业务逻辑 }
同时要确认导入的是android.arch.lifecycle.ViewModelProvider(support库版本),而非AndroidX的androidx.lifecycle.ViewModelProvider。
4. 排查嵌套Fragment或上下文问题
如果当前Fragment是嵌套在其他Fragment里的,若想共享ViewModel到父Fragment或Activity,可以把ViewModelProvider.of(this)换成ViewModelProvider.of(getParentFragment())或ViewModelProvider.of(getActivity());如果只是当前Fragment自用,直接用this即可。
内容的提问来源于stack exchange,提问作者Mudasir Sharif

