3 votes

Besoin d'aide pour refactoriser l'authentification téléphonique FIrebase en architecture MVVM

Je n'arrive pas à comprendre comment gérer le résultat de la connexion depuis la classe FirebaseLoginRepository vers le LoginViewModel après l'authentification, pour savoir si elle est réussie ou non, dois-je utiliser un callback listener comme nous le faisons dans le modèle MVP ?

Pardonnez-moi en cas d'incompréhension ou de problème non conventionnel car c'est ma première question sur StackOverflow.

Je ne sais pas, je n'en ai pas la moindre idée et je n'ai rien trouvé d'utile sur l'internet.

public void login{

        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful()){
                    //using login Result callback as unable to figure out how 
                    //to hand back result to LoginViewModel 
                   //i am certain that doing this breaks the principle of MVVM
                    loginResultCallback.onSuccess();
                }else {
                    loginResultCallback.onError();
                }
            }
        });

}

0voto

Blundell Points 28342

En supposant que vous fassiez cela sur un fil de discussion en arrière-plan, vous pourriez faire quelque chose comme :

public void login{
        CountDownLatch latch = new CountDownLatch(1);
        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful()){
                    //using login Result callback as unable to figure out how 
                    //to hand back result to LoginViewModel 
                   //i am certain that doing this breaks the principle of MVVM
                   viewModel.something = something;
                }else {
                    loginResultCallback.onError();
                }
                latch.countDown();
            }
        });
        try {
          latch.await(30000);
        } catch (TimeoutException e) {
          Log.e("TUT", "Error timeed out", e);
        }
}

Cela vous permet de bloquer un thread et d'attendre qu'un callback se produise, c'est donc un moyen d'abstraire un callback et d'utiliser LiveData. Vous devez juste être conscient de ce que cela fait aux threads.

En dehors de cela, vous devez vérifier si l'API Firebase dispose d'une méthode synchrone pour la même API.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X