在 kotlin 中,如何将 ViewModel 与 ViewModelProvider.AndroidViewMode



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

mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

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

为此目的有什么想法吗?

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

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

但是,如果您有一个视图模型使用任何其他构造函数参数扩展AndroidViewModel,则如下所示

  1. 使用任何其他构造函数扩展 AndroidViewModel 参数
class FooViewModel(application: Application, foo: Foo) : AndroidViewModel(application) {}
  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
            }
     }
  1. 在活动中创建视图模型
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)

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

val viewModel = ViewModelProvider(thisFragment).get(MyViewModel::class.java)

原答案如下。


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

使用它的方式是为您的用例调用其适当的of方法,传入FragmentActivity,然后在返回ViewModelProvider调用get

val viewModel = ViewModelProviders.of(thisFragment).get(MyViewModel::class.java)

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

class MyViewModel(application: Application) : AndroidViewModel(application) {
    // use application
}
你可以

试试这段代码

    ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(UserViewModel::class.java)

你可以像这样使用 AndroidViewModelFactory:

mViewModel = ViewModelProvider(this,
            ViewModelProvider.AndroidViewModelFactory(application))
            .get(MainViewModel::class.java)

所以,这很简单:

// This is the deprecated way to create a viewModel.
viewModel = ViewModelProviders.of(owner).get(MyViewModel::class.java)
//This is the deprecated way to create a viewModel with a factory.
viewModel = ViewModelProviders.of(owner, mViewModelFactory).get(MyViewModel::class.java)

// This is the new way to create a viewModel.
viewModel = ViewModelProvider(owner).get(MyViewModel::class.java)
//This is the new way to create a viewModel with a factory.
viewModel = ViewModelProvider(owner, mViewModelFactory).get(MyViewModel::class.java)
  1. Open build.gradle(Module:~.app)

  2. 将兼容版本编辑为 1.3.0-alpha02

     implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
    

最新更新