【问题标题】:Unable to create an instance of ViewModel无法创建 ViewModel 的实例
【发布时间】:2021-05-17 07:13:46
【问题描述】:

我创建了视图模型和存储库,在构造函数中我将 application 上下文作为参数传递给视图模型和存储库类,但它显示错误并且应用程序崩溃。

下面是我的堆栈跟踪:

2021-02-14 03:24:20.782 8516-8516/com.app.itunes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.itunes, PID: 8516
java.lang.RuntimeException: Cannot create an instance of class com.app.itunes.ViewModels.HistoryViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.app.itunes.fragments.HistoryFragment.onCreateView(HistoryFragment.java:38)
    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)

Caused by: java.lang.InstantiationException: java.lang.Class<com.app.itunes.ViewModels.HistoryViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)

下面是我的代码:

HistoryViewModel.java

public class HistoryViewModel extends ViewModel {

 public HistoryRepository historyRepository;
 public LiveData<List<Tracks>> allTracks;

 public HistoryViewModel(Application application){

    historyRepository = new HistoryRepository(application);
 }

 public LiveData<List<Tracks>> allTracks(){
     return historyRepository.myTracks();
  }
}

HistoryRepository.java

public class HistoryRepository {

public TrackDao trackDao;
public LiveData<List<Tracks>> allTracks;
public TrackDb db;

public HistoryRepository(Application application){

    db = TrackDb.getInstance(application);
    trackDao = db.trackDao();
    allTracks = trackDao.getAllTracks();
}

public LiveData<List<Tracks>> myTracks(){

    return allTracks;
 }

}

HistoryFragment.java

private void loadHistory(){

       historyViewModel = new ViewModelProvider(getActivity()).get(HistoryViewModel.class);

       fragmentHistoryBinding.historyRecycler.setHasFixedSize(true);
       fragmentHistoryBinding.historyRecycler.setLayoutManager(new GridLayoutManager(getActivity(),2,GridLayoutManager.VERTICAL, false));

       historyViewModel.allTracks().observe(getActivity(), new Observer<List<Tracks>>() {
           @Override
           public void onChanged(List<Tracks> tracks) {

               if(tracks.size() > 0){
                   HistoryAdapter adapter = new HistoryAdapter();
                   adapter.setTrackList(tracks);
               }
               else{

               }
           }
       });
}

我可以尝试什么来解决这个问题?

【问题讨论】:

  • 拥有HistoryViewModel 扩展AndroidViewModel,而不是ViewModel,我想你会有更好的运气。
  • 我已将其更改为AndroidViewModel,但仍然是同样的错误。
  • 您能告诉我为什么我们使用AndroidViewModel 代替ViewModel

标签: java android mvvm viewmodel


【解决方案1】:

如果您需要一个可以访问 Context 的 Jetpack ViewModel — 并且如果您没有使用 Dagger/Hilt 或 Koin 等依赖反转系统 — 您可以使用 AndroidViewModelViewModelProviders 和相关类知道如何使用 ViewModelAndroidViewModel “开箱即用”。

否则,具有带参数的构造函数的ViewModel 要求您创建自定义ViewModelProvider.Factory 实现并在请求视图模型实例时使用它。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多