【问题标题】:Need help to refactor FIrebase phone authentication into MVVM architecture需要帮助将 FIrebase 电话身份验证重构为 MVVM 架构
【发布时间】:2019-06-06 11:21:02
【问题描述】:

我无法弄清楚如何在身份验证后处理从 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();
                }
            }
        });

}

【问题讨论】:

  • 您是说问题是因为 firebase API 需要回调并且您不确定如何将此回调的结果获取到您的 LiveData 对象中?
  • 是的,完全一样的东西,很抱歉无法更好地解释它,因为我是新手,所以学习和解决它
  • 如果您对干净的 Firebase 身份验证感兴趣,可以查看此article。

标签: android firebase-authentication android-mvvm


【解决方案1】:

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

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

【讨论】:

  • 我不太明白这对我的情况有什么帮助,因为我希望我的登录类独立于我只是在寻求一种更好的方法来返回登录结果的一切,但非常感谢回到我身边
  • 这会更改您的登录方法,以将登录结果同步返回到您的 livedata 对象。
  • 我确实明白了,但它不是仍然紧密耦合吗?请原谅我,因为我对干净代码和解耦的概念还不熟悉
  • mm 没有足够的代码让我评论耦合抱歉
猜你喜欢
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
相关资源
最近更新 更多