Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewModelFactory可以';在创建自定义ViewModelFactory类时不会创建实例错误_Android_Mvvm_Dagger 2_Android Viewmodel - Fatal编程技术网

Android ViewModelFactory可以';在创建自定义ViewModelFactory类时不会创建实例错误

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”中,您正在进行构造函数注

我正试图在MVVM架构中使用Dagger2、Rxjava2和Rxjava2设计一个应用程序。 我在model(repository)类中得到响应,我想将其传递给我的ViewModel,为此我必须设计自己的ViewModelFactory类。但我得到的是无法创建实例错误。以下是我的课程: 型号:

networkService是我的API放在那里的接口。我的模型和应用程序在这个模块类中提供


任何帮助都将不胜感激。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;
}