MVVM i Przyciąganie i Kontekst

0

Pytanie

Jesteśmy z kolegą się pokłócili. Tłumaczymy aplikacja na przyciąganie MVVM+. Powstała konieczność rozpocząć dialog z fragmentu. Ja robię to tak:

We fragmencie:

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

Kolega twierdzi również, że trzeba to zrobić:

W pliku xml piszemy następujący:

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

I w modelu widoku:

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

Proszę mi powiedzieć, który z nich jest poprawny?

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

Najlepsza odpowiedź

2

ViewModel jest odpowiedzialny za przygotowanie danych dla interfejsu użytkownika, jak określono w instrukcjach dla programistów Androida.

Dlatego jedna z najlepszych praktyk-nigdy nie mieć do czynienia z elementami interfejsu użytkownika w ViewModel. Choć kody nadal będą działać, jeśli przekażemy Context do modelu prezentacji i pozwól jej wyświetlanie alertDialog, konieczne jest także wiedzieć, że akcja/fragment i model prezentacji mają różne cykle życia, więc trzeba być ostrożnym podczas biegu Context do modelu widoku

Bardziej inteligentny sposób radzenia sobie z tym by było, gdyby model prezentacji wspierała flaga i gotowała żądanej wiadomości za pomocą LiveData lub coś podobnego, aby akcja / fragment obserwował to i faktycznie tworzył i pokazywał AlertDialog po otrzymaniu wiadomości od modelu, widoku i powiadomić model widoku, gdy okno dialogowe wykazano/naciśnięty, aby model prezentacji obrabiała kolejny logiki biznesowej.

Dla danego przypadku bym zostawił AlertDialog kod w akcji/segmencie, natomiast w razie potrzeby otrzymam dane z modelu prezentacji.

2021-11-21 22:45:45

W innych językach

Ta strona jest w innych językach

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