与多个片段共享一个视图模型

时间:2018-09-20 15:35:32

标签: android mvvm viewmodel

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

2 个答案:

答案 0 :(得分:1)

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

与Util类相比,这样做的优势在于,共享代码仅对从基类派生的ViewModels可见,而不会与其他任何东西混淆。

答案 1 :(得分:0)

最好为每个viewmodel创建一个fragment,但是可以为多个viewmodel创建一个fragment。根据{{​​3}}:

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