Android 干净架构中的登录流程

Login Flow in Android Clean Architecture

我正在寻找使用干净架构实现简单的 Firebase 身份验证 Android 应用程序,因此根据 Firebase 文档可以检查用户是否已登录

@Override
public void onStart() {
    super.onStart();
    // Check if user is signed in (non-null) and update UI accordingly.
    FirebaseUser currentUser = mAuth.getCurrentUser();
    updateUI(currentUser);
}

所以我很困惑应该把这个条件放在哪里, 它应该在 UseCase 中还是在 Presenter 中,在同一源对象的帮助下独立调用

类似于

public interface FirebaseAuthDataSource {
    Single<User> loginUser(String username, String password);
    Single<User> isUserLoggedIn();
}
public class LoginUserUseCase {
  public Observable<ResponseValues> buildUseCase(RequestValues requestValues) {
   return firebaseAuthDataSource.loginUser(username,password);
  }
}
public class LoginPresenter{
 public void onStart(){
  firebaseAuthDataSource.isUserLoggedIn()
  .subscribe(LoginView::navigateToMenuScreen);
 }
}

像这样的条件,它们是否符合业务逻辑?或流程逻辑?

根据 Bob 叔叔的说法,UI 应该对数据库一无所知。这些条件属于框架层,您的所有数据库内容都应该在该层中。并且通信通过用例和数据访问接口。

如果这对您来说太费力了,那么您也可以将将来可能会更改的敏感部分转移到"Clean Architecture"。但那只是我的个人意见。希望对您有所帮助

在简洁架构中,您将尽可能多的逻辑放入用例层,即交互器。通过在用例层中定义并在 framework/interface 适配器层中实现的接口抽象出对数据库等细节的访问。演示者应尽可能简单 - 理想情况下仅 "data converters"。

在你的情况下,交互者将决定何时进行登录检查并使用 firebase 数据库的接口执行它。交互者还将决定登录检查失败时会发生什么。

如果您想了解更多关于实现演示者的信息,请查看我的 post:https://plainionist.github.io/Implementing-Clean-Architecture-Controller-Presenter/