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

更新后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:35:56