我计划在 MVP 中使用干净的架构。
我正在使用鲍勃叔叔认可的干净架构方法开始一个 android 项目。我已经下载了一个类似于入门模板的模板项目,可以在使用干净的架构方法时启动您。git hub 在这里:https ://github.com/dmilicic/Android-Clean-Boilerplate.git
所以我们将有 3 层;每个模板的域、表示和线程。
我的问题是关于我正在设计的登录活动。我正在创建一个“使用 google 登录”按钮。但我不确定将 googleAPIClient、googleSignInOptions 和 googleSignInResult 调用放在哪里。在我获得谷歌帐户身份验证后,我将其传递给 firebaseAuth 以将用户登录到我的网站,这样这也是另一个 API 调用,我不确定它是如何工作的。要了解如何使用 google 帐户登录 firebase 应用程序,您可以在此处查看:https ://www.androidtutorialpoint.com/firebase/android-firebase-authentication-tutorial-using-firebase-google-login/
所以让我解释一下为什么我在使用模板时遇到问题。假设他想使用 google 帐户登录,让我们开始跟踪用户的步骤:
- 用户点击“使用谷歌登录”按钮。这应该会触发 UI 要求演示者开始尝试 google 登录。所以此时我应该为演示者使用交互器(用例)还是应该直接在演示者中初始化 googleAPICient ?令人担忧的是,谷歌登录 Api 通过创建意图并将 googleApiClient 作为参数传递给它来工作。然后,您使用 startActivityForResult 启动该 Intent。这就是所有的android代码,那么它不应该在表示层中,特别是在活动本身中吗?所以看来我别无选择,只能从视图/活动本身调用谷歌标志。正确的 ?
然后,在我从该呼叫中获得活动结果后,我计划像这样登录到 firebase:
//this block of code is in the activity
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// Google Sign In was successful, authenticate with Firebase
googleSignInAccount account = result.getSignInAccount();
//******* make the presenter log into firebase not the view
presenter.firebaseAuthWithGoogle(account); }
else {
// Google Sign In failed, update UI appropriately
// ...
}
}
}
然后在演示者代码中:
//this code will be in the presenter class itself, should it be in in a interactor instead ?
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
}
});
}