【问题标题】:Cannot create an instance of class ViewModel in Fragment无法在 Fragment 中创建类 ViewModel 的实例
【发布时间】:2021-02-10 00:54:59
【问题描述】:

当我尝试从 Fragment 初始化 ViewModelProvider 时出现上述错误,如下所示:

    //This line gives me the error "Cannot create an instance of class..."
    SetViewModel setViewModel = new ViewModelProvider(this).get(SetViewModel.class);

    final MyListAdapter adapter = new MyListAdapter(this.getActivity(), setViewModel, items);

    theListView.setAdapter(adapter);

我的 SetViewModel 类:

public class SetViewModel extends AndroidViewModel {
    private Repository repository;
    private static Flowable<List<Set>> sets = null;

    public SetViewModel(Application application) {
        super(application);
        repository = new Repository(application);
    }...

我的错误:

2021-02-09 19:51:22.171 22202-22202/com.example.xxxxxxx E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.xxxxxxx, PID: 22202
    java.lang.RuntimeException: Cannot create an instance of class com.example.xxxxxxx.xxxxxxx.SetViewModel
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:275)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at com.example.xxxxxxx.xxxxxxx.MyFragment.onCreateView(MyFragment.java:88)
    

提前致谢。

附:我会添加更多错误,但它已经说我有太多代码要通过编辑发布。

【问题讨论】:

  • 请包括完整的例外情况以及您正在使用的片段版本(最好是您的build.gradle 文件中的整个dependencies 块)。

标签: java android android-studio android-fragments viewmodel


【解决方案1】:

因为我的 ViewModel 扩展了 AndroidViewModel,这需要我传递一个应用程序,所以我应该引用一个传递应用程序的 ViewModelFactory。

public class SetViewModelFactory implements ViewModelProvider.Factory {
    private Application mApplication;

    public SetViewModelFactory(Application application) {
        mApplication = application;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) new SetViewModel(mApplication);
    }
}

然后像这样初始化我的 ViewModel:

SetViewModel setViewModel = new ViewModelProvider(this, new SetViewModelFactory(getActivity().getApplication())).get(SetViewModel.class);

【讨论】:

  • 在扩展 AndroidViewModel 时,不必强制传递带有 Factory 对象的 Application 实例。我认为应该有另一个根本原因。
猜你喜欢
  • 2020-01-11
  • 2021-11-28
  • 2017-12-13
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多