Android 无法创建自定义ViewModel的实例
我正在使用dagger2库。每当我试图运行我的项目时,都会说无法创建视图模型类的实例Android 无法创建自定义ViewModel的实例,android,dependency-injection,dagger-2,dagger,android-architecture-components,Android,Dependency Injection,Dagger 2,Dagger,Android Architecture Components,我正在使用dagger2库。每当我试图运行我的项目时,都会说无法创建视图模型类的实例 public class YourViewModel extends AndroidViewModel { public YourViewModel(Application application) { super(application); //Todo: ... } } 我尝试创建实例的主要活动 ((MovieApplication) getApp
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
我尝试创建实例的主要活动
((MovieApplication) getApplication()).getAppComponent().inject(this);
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
我的工厂班
public class ViewModelFactory implements ViewModelProvider.Factory {
private MoviesDataViewModel mViewModel;
@Inject
public ViewModelFactory(MoviesDataViewModel viewModel) {
this.mViewModel = viewModel;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(MoviesDataViewModel.class)) {
return (T) mViewModel;
}
throw new IllegalArgumentException("Unknown class name");
}
公共类ViewModelFactory实现ViewModelProvider.Factory{
私有电影数据视图模型mViewModel;
@注入
公共ViewModelFactory(MoviesDataViewModel视图模型){
this.mViewModel=viewModel;
}
@凌驾
公共T创建(类modelClass){
if(modelClass.isAssignableFrom(MoviesDataViewModel.class)){
返回(T)MVIEW模型;
}
抛出新的IllegalArgumentException(“未知类名”);
}
我的日志
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.moviedata.viewmodel.MoviesDataViewModel
at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145)
at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96)
at com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28)
at android.app.Activity.performCreate(Activity.java:6321)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
at android.app.ActivityThread.access$1100(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1396)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5582)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.InstantiationException: java.lang.Class<com.moviedata.viewmodel.MoviesDataViewModel> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
原因:java.lang.RuntimeException:无法创建com.moviedata.viewmodel.MoviesDataViewModel类的实例
位于android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145)
在android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143)
位于android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)
位于android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96)
位于com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28)
位于android.app.Activity.performCreate(Activity.java:6321)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
在android.app.ActivityThread.access$1100(ActivityThread.java:154)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1396)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5582)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
原因:java.lang.InstanceException:java.lang.Class没有零参数构造函数
位于java.lang.Class.newInstance(本机方法)
而不是:
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
执行:
mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
而不是:
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
执行:
mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
替换:
private MoviesDataViewModel mViewModel;
与:
MoviesDataViewModel mViewModel;
替换:
private MoviesDataViewModel mViewModel;
与:
MoviesDataViewModel mViewModel;
我的解决方案是注射活动,因为我使用的是Dagger2
AndroidInjection.inject(this);
我的解决方案是注射活动,因为我使用的是Dagger2
AndroidInjection.inject(this);
如果您使用多个活动,则需要在所有活动中添加以下代码
AndroidInjection.inject(this);
如果您使用多个活动,则需要在所有活动中添加以下代码
AndroidInjection.inject(this);
从ViewModel类扩展AndroidViewModel
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
从ViewModel类扩展AndroidViewModel
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
我是一名熟练的Android开发人员,使用ViewModel 100次都没有问题。今天我遇到了这个问题。花了几个小时浏览了各种SO帖子。没有得到解决 然后我看到我拥有ViewModel的包名包含new,如下所示: com.myapp.myfeature.new.feature 我将new改为neww进行如下测试:com.myapp.myfeature.neww.feature
它成功了!我希望有人觉得它有用。我是一名熟练的Android开发人员,使用ViewModel 100次都没有问题。今天我遇到了这个问题。花了几个小时浏览了各种SO帖子。没有得到解决 然后我看到我拥有ViewModel的包名包含new,如下所示: com.myapp.myfeature.new.feature 我将new改为neww进行如下测试:com.myapp.myfeature.neww.feature
它成功了!我希望有人觉得它有用。什么是
viewModelFactory
?什么是viewModelFactory
?