更新后ViewModelProvider构造方法私有,无法访问该如何解决?
解决ViewModelProvider构造方法私有访问权限问题
问题原因
从Lifecycle 2.7.0版本开始,ViewModelProvider的无Factory参数构造方法(即ViewModelProvider(ViewModelStoreOwner))被标记为私有,无法通过new ViewModelProvider(this)直接实例化,这是官方为规范ViewModel创建流程的改动。
解决方案
根据你的ViewModel是否需要自定义参数,分两种情况处理:
1. ViewModel使用默认构造/继承AndroidViewModel
如果BeaconViewModel是无参构造,或者继承AndroidViewModel(需传入Application),直接使用官方提供的AndroidViewModelFactory:
// 方法1:通过ViewModelProvider构造器传入Factory BeaconViewModel beaconViewModel = new ViewModelProvider( LoginActivity.this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()) ).get(BeaconViewModel.class); // 方法2:直接通过Factory创建ViewModel(更简洁) BeaconViewModel beaconViewModel = ViewModelProvider.AndroidViewModelFactory .getInstance(getApplication()) .create(BeaconViewModel.class);
2. ViewModel需要自定义参数
如果BeaconViewModel需要传入自定义依赖(比如Repository实例),需自行实现ViewModelProvider.Factory:
第一步:实现自定义Factory
public class BeaconViewModelFactory implements ViewModelProvider.Factory { private final YourCustomDependency yourDependency; // 传入需要的依赖 public BeaconViewModelFactory(YourCustomDependency yourDependency) { this.yourDependency = yourDependency; } @NonNull @Override public <T extends ViewModel> T create(@NonNull Class<T> modelClass) { if (modelClass.isAssignableFrom(BeaconViewModel.class)) { // 实例化ViewModel并传入依赖 return (T) new BeaconViewModel(yourDependency); } throw new IllegalArgumentException("无法识别的ViewModel类"); } }
第二步:使用自定义Factory创建ViewModel
// 初始化你的依赖实例 YourCustomDependency dependency = new YourCustomDependency(); // 创建Factory BeaconViewModelFactory factory = new BeaconViewModelFactory(dependency); // 获取ViewModel BeaconViewModel beaconViewModel = new ViewModelProvider(LoginActivity.this, factory).get(BeaconViewModel.class);
额外注意事项
- 统一Lifecycle依赖版本:你当前的
lifecycle-common-java8版本是2.8.2,和其他Lifecycle依赖的2.7.0不一致,建议改成和lifecycle_version统一的版本,避免潜在冲突:
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
内容的提问来源于stack exchange,提问作者Biswas Khayargoli
相关产品推荐
相关产品推荐

