【问题标题】:What is the difference between passing"this" and "activity!!" as a ViewModelStoreOwner while creating ViewModelProvider instance传递“这个”和“活动!!”有什么区别?在创建 ViewModelProvider 实例时作为 ViewModelStoreOwner
【发布时间】:2020-05-30 17:47:34
【问题描述】:

您好,我是一名 Kotlin 学习者,想了解传递“this”和“activity!!”之间的区别作为 ViewModelStoreOwner,同时在片段中为 ex 创建 ViewModelProvider 实例

 viewModel = ViewModelProvider(
        this,
        InventoryDetailsFragmentViewModelFactory.getInstance(activity!!.application)
    )
        .get(InventoryDetailsFragmentViewModel::class.java)

当我作为所有者使用它时,有时观察者不工作 请帮助我了解使用此功能和活动的区别!

【问题讨论】:

标签: android kotlin android-activity android-viewmodel viewmodelproviders


【解决方案1】:

您可以将thisFragment)或activity!!FragmentActivity)传递给ViewModelProvider 构造函数,因为两者都实现了the ViewModelStoreOwner 接口。

ViewModelStoreOwner 的作用是能够在需要时提供ViewModelStore,其中ViewModelStore 代表现有视图模型的集合:

  • 如果您使用this 并将Fragment 传递给ViewModelProvider 构造函数,则ViewModelStore 将绑定到Fragment。此片段和子片段可能共享视图模型,但这些视图模型不应与其他对等片段或父片段共享。

  • 如果您使用activity!! 并将FragmentActivity 传递给ViewModelProvider 构造函数,则ViewModelStore 将与FragmentActivity 绑定。该活动不仅可以使用视图模型,而且该活动中使用的任何片段也可以共享该视图模型。

您需要确定InventoryDetailsFragmentViewModel 的正确范围。

【讨论】:

    【解决方案2】:

    “this”的意思是“Context”,也就是你在viewModel中实例化的Fragment。

    从您提供的代码中,我可以理解“this”=“InventoryDe​​tailsFragment”,即>您实例化 viewModel 的类。

    您的代码应如下所示

    val application = requireNotNull(activity).application
    viewModelFactory = InventoryDetailsFragmentViewModelFactory(application)
    viewModel = ViewModelProviders.of(this, viewModelFactory)
                .get(InventoryDetailsFragmentViewModel::class.java)
    

    如果您想查看在项目中使用 ViewModel 和 ViewModelFactory 的示例,请访问此链接sample

    【讨论】:

    • ""this" 的意思是“上下文”,它是你被实例化的视图模型的片段”——片段不是Context
    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 2020-11-16
    • 2017-05-11
    • 2010-09-18
    • 2014-06-09
    • 2020-11-18
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多