使用 Architecture Components MVVM 进行身份验证,将令牌从 Repository 传递到 ViewModel
Authentication with Architecture Components MVVM, passing token from Repository to ViewModel
我想根据 "official" MVVM、存储库模型进行登录 activity。
我查看了 Android Studio "Login" 模板并稍微了解了它的工作原理。下面的流程图展示了我如何规划类之间的数据流。该模板不包含 WebService 部分,而是立即 return 没有回调。
由于创建对 VM/Activity 的引用(在回调中)是不好的做法,有哪些选项可以将令牌传播回 VM(由虚线箭头表示)?
备注:
- 从 VM 到 Activity,使用 LiveData 传递数据。我明白那一步了。
- 我考虑过在存储库中创建 LiveData,然后在 Activity 中观察它,跳过 VM。但是,肯定需要对来自存储库的任何数据执行一些逻辑,因此它应该首先通过 VM,在那里进行处理,然后由 Activity.
观察到派生结果。
- 似乎很难使用 LiveData 将数据从 Repository 传递到 VM,因为在 VM 中对 .observe() 的任何调用都需要合适的 Context。好像只有Activity可以.observe?
- 为了更好地理解,我宁愿暂时避免使用 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;
}
}
我想根据 "official" MVVM、存储库模型进行登录 activity。
我查看了 Android Studio "Login" 模板并稍微了解了它的工作原理。下面的流程图展示了我如何规划类之间的数据流。该模板不包含 WebService 部分,而是立即 return 没有回调。
由于创建对 VM/Activity 的引用(在回调中)是不好的做法,有哪些选项可以将令牌传播回 VM(由虚线箭头表示)?
备注:
- 从 VM 到 Activity,使用 LiveData 传递数据。我明白那一步了。
- 我考虑过在存储库中创建 LiveData,然后在 Activity 中观察它,跳过 VM。但是,肯定需要对来自存储库的任何数据执行一些逻辑,因此它应该首先通过 VM,在那里进行处理,然后由 Activity. 观察到派生结果。
- 似乎很难使用 LiveData 将数据从 Repository 传递到 VM,因为在 VM 中对 .observe() 的任何调用都需要合适的 Context。好像只有Activity可以.observe?
- 为了更好地理解,我宁愿暂时避免使用 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;
}
}