【问题标题】:Cannot create an instance of custom ViewModel无法创建自定义 ViewModel 的实例
【发布时间】:2017-08-02 11:41:26
【问题描述】:

我正在使用 dagger2 库。每当我尝试运行我的项目时,都会说无法创建视图模型类的实例。

我尝试创建实例的主要活动

   ((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");
}

我的日志

  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)

【问题讨论】:

    标签: android dependency-injection dagger-2 dagger android-architecture-components


    【解决方案1】:

    代替:

    mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
    

    执行:

    mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
    

    【讨论】:

    • viewModelFactory 是什么意思?
    【解决方案2】:

    我的解决方案是注入活动,因为我使用的是 Dagger2

            AndroidInjection.inject(this);
    

    【讨论】:

      【解决方案3】:

      如果您使用多个活动,需要在所有活动中添加以下代码

      AndroidInjection.inject(this);
      

      【讨论】:

        【解决方案4】:

        从您的 ViewModel 类中扩展 AndroidViewModel。

        public class YourViewModel extends AndroidViewModel {
        
            public YourViewModel(Application application) {
                super(application);
        
                //Todo: ...
            }
        }
        

        【讨论】:

          【解决方案5】:

          我是一名熟练的 Android 开发人员,我已经使用了 100 多次 ViewModel,没有任何问题。今天我遇到了这个问题。花了几个小时浏览各种 SO 帖子。没解决。

          然后我看到我拥有 ViewModel 的包名称包含 new。像这样:

          com.myapp.myfeature.new.feature

          我将 new 更改为 neww 进行这样的测试:com.myapp.myfeature.neww.feature

          它成功了!我希望有人觉得它有用。

          【讨论】:

            【解决方案6】:

            替换:

            private MoviesDataViewModel mViewModel;
            

            与:

            MoviesDataViewModel mViewModel;
            

            【讨论】:

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