MVVM & 绑定 & 上下文

MVVM & Binding & Context

我和同事吵架了。 我们正在将应用程序转换为 MVVM+Binding。 需要从片段开始对话。 我这样做:

片段中:

fragmentBinding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       // there's a bunch of code here 
     alertDialog.show();
}});

一位同事也声称您需要这样做:

在xml文件中我们这样写:

android:onClick="@{v -> viewModel.showDialog(context)}"

在 ViewModel 中:

fun showDialog(context: Context){
     AlertDialog.Builder builder = new AlertDialog.Builder(context);
       // there's a bunch of code here
     alertDialog.show();
}

请告诉我,哪一个是正确的?

ViewModel负责为UI准备数据,如Android Developer Guides.

所述

因此,一种最佳做法是从不处理 ViewModel 中的 UI 元素。尽管如果我们将 Context 传递给 ViewModel 并允许它显示 alertDialog,代码仍会执行,但您可能还需要注意 activity/fragment 和 ViewModel 具有不同的生命周期,因此在将 Context 传递给 ViewModel

时需要小心

一个更明智的处理方法是让 ViewModel 维护一个标志并使用 LiveData 或类似的东西准备所需的消息,以便 activity / 片段观察到并且实际上通过从ViewModel获取消息构建并显示一个AlertDialog,当dialog已经shown/clicked时通知ViewModel,以便ViewModel处理后续的业务逻辑。

对于您的特定情况,我会在 activity/fragment 中保留 AlertDialog 代码,而如果有必要,我将从 ViewModel 中检索数据。