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 中检索数据。
我和同事吵架了。 我们正在将应用程序转换为 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 中检索数据。