首页 > 解决方案 > 需要帮助将 FIrebase 电话身份验证重构为 MVVM 架构

问题描述

我无法弄清楚如何在身份验证后处理从 FirebaseLoginRepository 类返回到 LoginViewModel 的登录结果,例如它是否成功,我应该像在 MVP 模式中那样使用回调侦听器吗?

如果有误解或一些非常规问题,请原谅我,因为这是我在 StackOverflow 上的第一个问题

我不知道我没有丝毫的想法,在互联网上找不到任何有用的东西

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

}

标签: androidfirebase-authenticationandroid-mvvm

解决方案


假设您在后台线程上执行此操作,您可以执行以下操作:

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

这允许您阻塞线程并等待回调发生,因此它是一种抽象回调和使用 LiveData 的方法。你只需要知道它对线程做了什么。

除此之外,您应该查看 firebase API 是否具有相同 API 的同步方法。

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


推荐阅读