Android ViewModelFactory可以';在创建自定义ViewModelFactory类时不会创建实例错误
我正试图在MVVM架构中使用Dagger2、Rxjava2和Rxjava2设计一个应用程序。 我在model(repository)类中得到响应,我想将其传递给我的ViewModel,为此我必须设计自己的ViewModelFactory类。但我得到的是无法创建实例错误。以下是我的课程: 型号: networkService是我的API放在那里的接口。我的模型和应用程序在这个模块类中提供Android ViewModelFactory可以';在创建自定义ViewModelFactory类时不会创建实例错误,android,mvvm,dagger-2,android-viewmodel,Android,Mvvm,Dagger 2,Android Viewmodel,我正试图在MVVM架构中使用Dagger2、Rxjava2和Rxjava2设计一个应用程序。 我在model(repository)类中得到响应,我想将其传递给我的ViewModel,为此我必须设计自己的ViewModelFactory类。但我得到的是无法创建实例错误。以下是我的课程: 型号: networkService是我的API放在那里的接口。我的模型和应用程序在这个模块类中提供 任何帮助都将不胜感激。3> 我不确定,但在“CakeViewModelFactory”中,您正在进行构造函数注
任何帮助都将不胜感激。3> 我不确定,但在“CakeViewModelFactory”中,您正在进行构造函数注入,其中您正在注入模型和应用程序的实例,但您的模块类没有提供应用程序上下文的@Provides方法。 因此,将其添加到模块类可能会有所帮助:
@Provides
public Context provideApplicationContext(Application application) {
return applicaton;
}
并在CakesActivity类中调用super.onCreate()之前尝试注入依赖项
如果有任何解决方案可以解决您的问题,请告诉我。:) ViewModel工厂的参数是什么?您提供了吗?添加了我的模块类。在您的模块类中,将
provideViewModel
设置为public,我认为这是因为它。@lieforbanana更改了它。不走运。然后我不知道:)也许你可以在ViewModelFactory中设置断点。
public class CakeViewModelFactory implements ViewModelProvider.Factory{
private final Model model;
private final Application application;
@Inject
public CakeViewModelFactory(Model model, Application application) {
this.model = model;
this.application = application;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(Model.class)) {
return (T) new CakeViewModel(model, application);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
public class CakeViewModel extends AndroidViewModel {
private final LiveData<CakeResponse> cakeListObservable;
public CakeViewModel(@NonNull Model model, @NonNull Application application) {
super(application);
cakeListObservable = model.getCakeList();
}
public LiveData<CakeResponse> getCakeListObservable() {
return cakeListObservable;
}
@Inject
CakeViewModelFactory factory;
@BindView(R.id.recyclerView)
RecyclerView recyclerView;
List<CakeResponseCakes> cakes;
CakesAdapter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cakes);
CakeViewModel viewModel = ViewModelProviders.of(this, factory).get(CakeViewModel.class);
DaggerCakeComponent.builder()
.cakeModule(new CakeModule(this))
.applicationComponent(CakeApplication.get(this).getComponent())
.build().inject(this);
ButterKnife.bind(this);
initializeList();
observeViewModel(viewModel);
}
private void observeViewModel(CakeViewModel cakeViewModel){
cakeViewModel.getCakeListObservable().observeForever(new Observer<CakeResponse>() {
@Override
public void onChanged(@Nullable CakeResponse cakeResponse) {
cakes = new ArrayList<>();
if(cakeResponse != null) {
CakeResponseCakes[] cakeList = cakeResponse.getCakes();
if(cakeList != null) {
for(CakeResponseCakes caky: cakeList){
CakeResponseCakes cake = new CakeResponseCakes();
cake.setId(caky.getId());
cake.setDetailDescription(caky.getDetailDescription());
cake.setPreviewDescription(caky.getPreviewDescription());
cake.setTitle(caky.getTitle());
cake.setImage(caky.getImage());
cakes.add(cake);
}
}
}
adapter.addCakes(cakes);
adapter.notifyDataSetChanged();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void initializeList() {
recyclerView.hasFixedSize();
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
adapter = new CakesAdapter(getLayoutInflater());
recyclerView.setAdapter(adapter);
}
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.athenaishere.cakemvvm/ir.athenaishere.cakemvvm.activities.base.CakesActivity}: java.lang.RuntimeException: Cannot create an instance of class ir.athenaishere.cakemvvm.activities.base.mvvm.CakeViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2656)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
at android.app.ActivityThread.access$900(ActivityThread.java:168)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5753)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
Caused by: java.lang.RuntimeException: Cannot create an instance of class ir.athenaishere.cakemvvm.activities.base.mvvm.CakeViewModel
at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:201)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at ir.athenaishere.cakemvvm.activities.base.CakesActivity.onCreate(CakesActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6112)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1117)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
at android.app.ActivityThread.access$900(ActivityThread.java:168)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5753)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
Caused by: java.lang.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor(Class.java:531)
at java.lang.Class.getConstructor(Class.java:495)
at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:199)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at ir.athenaishere.cakemvvm.activities.base.CakesActivity.onCreate(CakesActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6112)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1117)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
at android.app.ActivityThread.access$900(ActivityThread.java:168)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5753)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
@Module
public class CakeModule {
private CakesActivity cakesActivity;
public CakeModule(CakesActivity cakesActivity) {
this.cakesActivity = cakesActivity;
}
@CakeContext
@BaseScope
@Provides
public CakesActivity providesCakeActivity() {
return this.cakesActivity;
}
@BaseScope
@Provides
public Model providesModel(NetworkService networkService) {
return new Model(networkService);
}
@BaseScope
@Provides
CakeViewModelFactory provideViewModel(Model model) {
return new CakeViewModelFactory(model, cakesActivity.getApplication());
}
}
@Provides
public Context provideApplicationContext(Application application) {
return applicaton;
}