【问题标题】:ViewModelFactory and ViewModel with no constructor args没有构造函数参数的 ViewModelFactory 和 ViewModel
【发布时间】:2021-03-14 12:22:36
【问题描述】:

我得到了 MyViewModel,构造函数是空的

public class MyViewModel extends ViewModel {
    private MutableLiveData<RxBleClient> rxBleClient = new MutableLiveData<RxBleClient>();


    public MyViewModel() {

    }
    
    public MutableLiveData<RxBleClient> getRxBleClient() {
        return rxBleClient;
    }

    public void setRxBleClient(MutableLiveData<RxBleClient> rxBleClient) {
        this.rxBleClient = rxBleClient;
    }
}

我想提供这样的新模型,但是有问题:

MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);

error: no suitable constructor found for ViewModelProvider(MainActivity)
        MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
                            ^
    constructor ViewModelProvider.ViewModelProvider(ViewModelStoreOwner,Factory) is not applicable
      (actual and formal argument lists differ in length)
    constructor ViewModelProvider.ViewModelProvider(ViewModelStore,Factory) is not applicable
      (actual and formal argument lists differ in length)

我确实实现了 ViewModelProvider.Factory

public class ViewModelFactory implements ViewModelProvider.Factory {

    ViewModelFactory() {
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        try {
//            what do I need to do here?
            return modelClass.newInstance();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

但我不知道该怎么做,返回没有参数的工厂。 如何做到这一点?
谢谢

【问题讨论】:

  • 你在哪里创建你的MyViewModel

标签: java android android-viewmodel


【解决方案1】:

看起来您可能缺少此工作所需的依赖项。确保你有 appcompat 依赖:

implementation 'androidx.appcompat:appcompat:1.2.0'

另外,一些 Google 库实际上已经将 appcompat 作为依赖项提供。例如:

implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.material:material:1.3.0'

【讨论】:

  • MainActivity 确实继承自 AppCompactActivity,我也确实像这样迁移到 AndroidX:重构 > 迁移到 AndroidX。 ViewModelProvider 也来自 androidx: import androidx.lifecycle.ViewModelProvider;有没有办法创建一个没有参数的工厂?或者一些技巧来解决这个问题?
  • 这很奇怪,我在测试时对您的代码没有任何问题。
  • 您的项目是否有appcompat 依赖项?在我的项目中删除它会重新创建您描述的错误
  • 我没有 appcompact 依赖。你能在 gradle.build 中写下你的 ViewModel 实现版本吗?
  • 没有任何改变。答案是添加这些行: def lifecycle_version = "2.2.0" // ViewModel implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
猜你喜欢
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多