【问题标题】:Passing application to AndroidViewModel将应用程序传递给 AndroidViewModel
【发布时间】:2017-11-11 10:17:55
【问题描述】:

我想为我的视图模型使用AndroidViewModel,以便访问Context。它需要Application 作为参数传递。我的 ViewModel 类如下所示:

class FooAndroidViewModel(application: Application?) : AndroidViewModel(aplication) {
  ...
}

它正在像这样被实例化:

val fooModel = ViewModelProviders.of(this).get(FooAndroidViewModel::class.java)

问题在于,这会产生一个错误,即无法实例化 FooAndroidViewModel - 可能是因为缺少 application 参数。


问题:如何将application 传递给ViewModelProviders.of(this).get(FooAndroidViewModel::class.java)

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    只需将application: Application? 替换为application: Application。以下代码应该可以工作:

    class FooAndroidViewModel(application: Application) : AndroidViewModel(application) {
      // class def
    }
    

    【讨论】:

    • 嗯,实际上刚刚发现,它可以双向工作。
    • @Oleg,你还记得问题是什么吗?我面临着类似的问题,我的代码与这个答案中的完全一样。
    • 已通过by viewModels() 检索视图模型修复。我之前在片段的onCreate() 中检索它,这显然是不行的。
    【解决方案2】:

    即使我们有这种方式,

    class FooAndroidViewModel(application: Application) : AndroidViewModel(aplication)
    

    但我们不使用by viewModels() 选项,而是尝试将其用作,

    val mViewModel = ViewModelProvider(this).get(FooAndroidViewModel::class.java)
    

    然后它给出一个异常,

    java.lang.RuntimeException: Cannot create an instance of class x.y.z.FooAndroidViewModel
    
    Caused by: java.lang.InstantiationException: java.lang.Class<x.y.z.FooAndroidViewModel> has no zero argument constructor
    

    我通过这种方式创建AndroidViewModel 的实例来解决它,

    val mViewModel = ViewModelProvider.AndroidViewModelFactory(application).create(FooAndroidViewModel::class.java)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2014-04-21
      • 2012-12-24
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多