在 kotlin 中如何将 ViewModel 与 ViewModelProvider.AndroidViewModelFactory 一起使用?

Rau*_*spe 4 android viewmodel kotlin

在我当前的项目中,我使用下一行:

mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

例如,ViewModel但在https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders.html#ViewModelProviders() 中推荐使用,ViewModelProvider.AndroidViewModelFactory因为ViewModelProviders()在 API 级别 1.1.0 中已弃用。

为此目的有什么想法吗?

sm *_*bas 5

如果你有一个简单的 ViewModel 扩展 AndroidViewModel没有任何额外的构造函数参数,它如下

  1. 无需任何额外的构造函数参数即可扩展 AndroidViewModel
class FooViewModel(application: Application) : AndroidViewModel(application) {}
Run Code Online (Sandbox Code Playgroud)
  1. 在活动中创建视图模型
val viewModel = ViewModelProvider(this).get(FooViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

但是如果你有一个 ViewModel 扩展 AndroidViewModel与任何额外的构造函数参数,它如下

  1. 使用任何额外的构造函数参数扩展 AndroidViewModel
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个新的视图模型工厂扩展 ViewModelProvider.AndroidViewModelFactory
class FooViewModelFactory(val application: Application, val foo: Foo): ViewModelProvider.AndroidViewModelFactory(application) {

            override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                return FooViewModel(
                    application, foo
                ) as T
            }

     }
Run Code Online (Sandbox Code Playgroud)
  1. 在活动中创建视图模型
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)


zsm*_*b13 4

编辑:原来的问题现在无关紧要,因为您不应该再使用ViewModelProviders实用程序类。相反,您应该ViewModelProvider像这样创建一个实例:

val viewModel = ViewModelProvider(thisFragment).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

原答案如下。


ViewModelProviders只是一个具有静态方法的实用程序类,无需实例化它(无论如何,其中没有实例方法),因此不推荐使用构造函数。

使用它的方式是根据of您的用例调用适当的方法,传入 a Fragmentor Activity,然后调用getViewModelProvider返回的值:

val viewModel = ViewModelProviders.of(thisFragment).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

如果您没有在方法的第二个参数中提供自己的工厂ofAndroidViewModelFactory则将默认使用。此实现可以创建没有构造函数参数的 ViewModel 子类,也可以创建扩展的 ViewModel 子类AndroidViewModel,如下所示:

class MyViewModel(application: Application) : AndroidViewModel(application) {

    // use application

}
Run Code Online (Sandbox Code Playgroud)