MVVM и Привязка и Контекст

0

Вопрос

Мы с моим коллегой поссорились. Мы переводим приложение на привязку MVVM+. Возникла необходимость начать диалог с фрагмента. Я делаю это вот так:

Во фрагменте:

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

И в модели представления:

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

Пожалуйста, скажите мне, какой из них правильный?

android binding mvvm
2021-11-21 22:26:10
1

Лучший ответ

2

ViewModel отвечает за подготовку данных для пользовательского интерфейса, как указано в руководствах для разработчиков Android.

Поэтому одна из лучших практик-никогда не иметь дело с элементами пользовательского интерфейса в ViewModel. Хотя коды все равно будут выполняться, если мы передадим Context к модели представления и разрешить ей отображать alertDialog, вам также может потребоваться знать, что действие/фрагмент и модель представления имеют разные жизненные циклы, поэтому вам нужно быть осторожным при передаче Context к модели представления

Более разумным способом справиться с этим было бы, если бы модель представления поддерживала флаг и готовила требуемое сообщение с помощью LiveData или что-то подобное, чтобы действие / фрагмент наблюдал это и фактически создавал и показывал AlertDialog получив сообщение от модели представления, и уведомите модель представления, когда диалоговое окно было показано/нажато, чтобы модель представления обрабатывала последующую бизнес-логику.

Для вашего конкретного случая я бы оставил AlertDialog код в действии/фрагменте, в то время как при необходимости я получу данные из модели представления.

2021-11-21 22:45:45

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................