MVVM & de Liaison et Contexte

0

La question

Mon collègue et j'ai eu un argument. Nous sommes en train de traduire l'application de MVVM+de Liaison. Il y avait un besoin pour démarrer un dialogue à partir d'un fragment. Je fais comme ça:

Dans le fragment:

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

Un collègue affirme également que vous devez faire ceci:

Dans le fichier xml, nous l'écrire comme suit:

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

Et dans le ViewModel:

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

S'il vous plaît, dites-moi, lequel est correct?

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

La meilleure réponse

2

ViewModel est responsable de la préparation des données pour l'INTERFACE utilisateur, comme indiqué dans l' Android Developer Guides.

Par conséquent, une bonne pratique est de ne jamais traiter avec des éléments d'INTERFACE utilisateur dans le ViewModel. Bien que les codes soient toujours exécuter si nous passons le Context pour le ViewModel et lui permettre de montrer un alertDialog, vous devez également être conscient que l'activité ou du fragment et du ViewModel ont différents cycles de vie, de sorte que vous devez être prudent lors du passage de la Context pour le ViewModel

Une plus meilleure façon de gérer cela, serait pour le ViewModel de maintenir un drapeau et de préparer un message à l'aide de LiveData ou quelque chose de similaire, de sorte que l'activité / fragment observe que, et de créer et d'afficher une AlertDialog par faire passer le message à partir de ce Dernier, et d'informer le ViewModel lorsque la boîte de dialogue a été montré/cliqué, alors que le ViewModel va gérer l'subséquente de la logique métier.

Pour votre cas particulier, je laisse la AlertDialog code de l'activité/fragment, alors que si c'est nécessaire, je récupère les données à partir de ce Dernier.

2021-11-21 22:45:45

Dans d'autres langues

Cette page est dans d'autres langues

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