繁体   English   中英

使用架构组件 MVVM 进行身份验证,将令牌从 Repository 传递到 ViewModel

[英]Authentication with Architecture Components MVVM, passing token from Repository to ViewModel

我想基于“官方”MVVM 存储库模型进行登录活动。

我查看了 Android Studio 的“登录”模板,并有点了解它是如何工作的。 下面的流程图显示了我如何规划类之间的数据流。 该模板不包含 WebService 部分,而是立即返回令牌而无需回调。

登录流程图

由于创建对 VM/Activity 的引用(在回调中)是不好的做法,有哪些选项可以将令牌传播回 VM(由虚线箭头表示)?

笔记:

  1. 从 VM 到 Activity,数据使用 LiveData 传递。 我明白这一步。
  2. 我想过在Repository中创建LiveData,然后在Activity中观察,跳过VM。 但是,肯定可能需要对来自 Repository 的任何数据执行一些逻辑,因此它应该首先通过 VM,在那里进行处理,然后由 Activity 观察派生结果。
  3. 使用 LiveData 将数据从 Repository 传递到 VM 似乎很困难,因为在 VM 中对 .observe() 的任何调用都需要一个合适的上下文。 似乎只有 Activity 可以 .observe?
  4. 为了更好地理解,我现在宁愿避免使用 RxJava 和 Dagger,而是使用 Java。

谢谢

您不需要在存储库中创建LiveData 相反,您可以从 VM 调用repository.login(u,p)并等待结果到达。 结果到达后,只需更新 VM 内的LiveData实例。

无论如何,网络调用必须异步完成,或者您可以利用网络库(如 Retrofit)中的回调机制。

您的ViewModel将如下所示(伪代码):

class LoginViewModel: ViewModel{

    LiveData<Result> login(String username, String password){

        LiveData<Result> resultLiveData = new MutableLiveData<Result>();

        // Let it be an async. call from Retrofit
        Repository.login(username, password, new Callback<Result>{
            void onResult(Result result){
                resultLiveData.value = result  // update the livedata.
            }
        }

        return resultLiveData;

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM