【问题标题】:Sharing one view model with multiple fragments与多个片段共享一个视图模型
【发布时间】:2018-09-20 15:35:32
【问题描述】:

我有一些常见的逻辑,我目前在 Util 类中有它。现在,我想将此逻辑移至 ViewModel 类。由于此 util 方法用于不同的片段,因此为多个片段创建公共视图模型(基于特征的视图模型)是否是一种好习惯。我知道 Google 建议对 1 个视图使用 1 个视图模型。请提出建议。

【问题讨论】:

  • ViewModel 应该从不有任何逻辑,它只是将Model 调整为View。它不用于此目的。在你需要的每一堂课中使用你的Util
  • 太好了!现在明白了,谢谢@juan

标签: android mvvm viewmodel


【解决方案1】:

如果您有通用代码,则可以有多个从包含共享代码的 baseViewModel 继承的 viewModel。

与 Util 类相比,它的优势在于共享代码仅对从基类派生的 ViewModel 可见,并且不会与其他任何内容混淆。

【讨论】:

    【解决方案2】:

    最好为每个fragment 创建一个viewmodel,但也可以为多个fragments 创建一个viewmodel。根据official documents

    class SharedViewModel : ViewModel() {
        val selected = MutableLiveData<Item>()
    
        fun select(item: Item) {
            selected.value = item
        }
    }
    
    class MasterFragment : Fragment() {
    
        private lateinit var itemSelector: Selector
    
        // Use the 'by activityViewModels()' Kotlin property delegate
        // from the fragment-ktx artifact
        private val model: SharedViewModel by activityViewModels()
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            itemSelector.setOnClickListener { item ->
                // Update the UI
            }
        }
    }
    
    class DetailFragment : Fragment() {
    
        // Use the 'by activityViewModels()' Kotlin property delegate
        // from the fragment-ktx artifact
        private val model: SharedViewModel by activityViewModels()
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
                // Update the UI
            })
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2020-09-19
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多