MVVM & Vinculação & Contexto

0

Pergunta

Meu colega e eu tinha um argumento. Estamos a traduzir o aplicativo para o MVVM+Ligação. Houve a necessidade de iniciar um diálogo a partir de um fragmento. Eu faço assim:

No fragmento:

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

Um colega também alegações de que você precisa para fazer isso:

No arquivo xml podemos escrever da seguinte forma:

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

E em ViewModel:

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

Por favor, me diga, qual é a correta?

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

Melhor resposta

2

ViewModel é responsável pela preparação de dados para a INTERFACE do usuário, como mencionado no Android Developer Guias.

Portanto, uma boa prática é nunca para lidar com os elementos da INTERFACE do usuário em ViewModel. Embora os códigos ainda execução, se passar Context para o ViewModel e deixe-o mostrar um alertDialog, você pode também precisa estar ciente de que a atividade/fragmento e o ViewModel têm diferentes ciclos de vida, então você precisa ser cuidadoso ao passar o Context para o ViewModel

Uma maneira mais sensata de lidar para lidar com isso, seria para o ViewModel para manter um sinalizador e preparar o necessário mensagem usando LiveData ou algo semelhante, para que a actividade / fragmento observa que e realmente construir e mostrar um AlertDialog obtendo a mensagem do ViewModel, e notificar o ViewModel quando a caixa de diálogo tem sido mostrado clicou, de modo que o ViewModel irá lidar com a subsequente lógica de negócios.

Para o seu caso em particular, eu gostaria de deixar o AlertDialog código da atividade/fragmento, enquanto se necessário vou recuperar os dados do ViewModel.

2021-11-21 22:45:45

Em outros idiomas

Esta página está em outros idiomas

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