这是正确的 Android MVVM 设计吗?

Is this proper Android MVVM design?

我是 Android 开发的初学者,我正在尝试使用 MVVM 制作练习应用程序。这是我第一次体验这种架构,所以我对到目前为止所做的一切都不太确定。

我正在尝试以编程方式设置 CollapsingToolBar 的滚动标志。当 RecyclerView 的列表为空时,我想禁用滚动效果。当它有项目时,我重新启用它。

在我的 ViewModel 中,我有:

@HiltViewModel
class MealsViewModel @Inject constructor(
    private val mealDao : MealDao
) : ViewModel() {

    \ depending on the calendar day, grab the list of meals from the Room Database
    private val currentDay: MutableLiveData<Date> = MutableLiveData(Date())
    val meals = Transformations.switchMap(currentDay){ date -> mealDao.getMeals(date).asLiveData() }

    \ this is observed in the fragment; if meals is empty from database, return this int (scroll flag)
    val enableOrDisableScroll = meals.map {
        if (it.isNullOrEmpty()) AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL else
                    AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP or
                            AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or
                                AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
    }

在片段中,enableOrDisableScroll 是这样观察的:

            viewModel.enableOrDisableScroll.observe(viewLifecycleOwner) {
                val params: AppBarLayout.LayoutParams = collapsingToolBar.layoutParams
                        as AppBarLayout.LayoutParams

                \ it is the returned value from the ViewModel observation
                params.scrollFlags = it
                collapsingToolBar.layoutParams = params
            }

(此解决方案修改自

这是正确的 MVVM 设计吗?是否所有“业务逻辑”都与视图(片段)正确分离?我可能无法理解这个词本身。在 Android 编程中,业务逻辑是否会决定如何创建视图和 UI 更新视图?如何改进我的 MVVM 方法?它按预期工作,但我不知道它是否是最佳的。

谢谢!

这就是基本 MVVM 模式的样子。它非常简单,视图(片段,Activity,自定义视图)应该只与 ViewModel 通信,它不应该调用任何其他 类。 ViewModel 充当数据和视图的中间人。因此,数据应该从您的数据源(查看您的代码似乎是房间数据库)传递到 viewModel,然后从那里传递到 View。为了将数据从 ViewModel 传递到视图,应该使用 LiveData /StateFlow /共享流量。现在,如果要严格遵循 MVVM,viewModel 中的数据不应直接来自 DataSource。如图所示,在您的数据源和 viewModel 之间必须有另一个名为 Repository 的层。在您的代码中,在 ViewModel 中,您以 (dao) 的形式直接调用了数据源,这是不允许的。存储库充当数据在数据源和 ViewModel 之间流动的中间人。这就是 MVVM 的工作原理。

您问题的答案:

1.Is 这个正确的 MVVM 设计: ViewModel -Fragment 逻辑处理得很好,但是您在 viewModel 中直接调用了 dao,这是错误的。您必须创建一个 Repository ,您必须在其中调用 Dao 并且必须在 ViewModel 中传递该存储库。

  1. 什么是业务逻辑? 答案部分取决于项目的复杂性和开发人员的品味。但要确保它没有任何与 View 相关的代码,并且它应该通过 ViewModel 流动。业务逻辑应该是可重用的,并且应该远离其他 类