【问题标题】:In kotlin how to use ViewModel With ViewModelProvider.AndroidViewModelFactory?在 kotlin 中如何使用 ViewModel 和 ViewModelProvider.AndroidViewModelFactory?
【发布时间】:2019-02-02 04:17:43
【问题描述】:

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

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 中已被弃用。

对此有什么想法吗?

【问题讨论】:

  • 你能分享一段你用来创建ViewModel实例的代码吗?
  • mViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

标签: android kotlin viewmodel


【解决方案1】:

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

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

但如果你有一个 ViewModel 扩展 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. 在 Activity 中创建视图模型
val viewModel = ViewModelProvider(this, FooViewModelFactory(application, foo)).get(FooViewModel::class.java)

【讨论】:

    【解决方案2】:

    编辑:原始问题现在无关紧要,因为您不应再使用 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?
    • 更新了我的答案。
    • 此类已弃用,请使用ViewModelProvider(不带 s)
    【解决方案3】:

    你可以试试这个代码

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

    【讨论】:

      【解决方案4】:

      您可以像这样使用 AndroidViewModelFactory:

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

      【讨论】:

        【解决方案5】:

        所以,这很简单:

        // 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)
        

        【讨论】:

          【解决方案6】:
          1. 打开 build.gradle(Module:~.app)

          2. 将 appcompat 版本编辑为 1.3.0-alpha02

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

          【讨论】:

          • 我认为使用 AndroidViewModelFactory 的另一个答案比这更好。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多