如何使用抽象类分隔Firebase

时间:2019-05-18 16:27:03

标签: firebase dart flutter firebase-authentication refactoring

首先,我不确定我是否已正确回答该问题的标题,因此,如果您比我知道的更好,请随时纠正我。

我想做什么:

我正在尝试使用提供程序状态管理来实现基于Firebase的身份验证系统。但是我遇到这个问题...

因此,我想要一个名为BaseAuth的抽象类,在其中我将拥有所需的所有函数定义,而不会干扰任何Firebase。因为我想让它们保持尽可能的分离,所以这是一个棘手的部分。

BaseAuth:

abstract class BaseAuth {
  Future<String> login(String email, String password);
  Future<String> register(String email, String password);
  Future<void> onAuthStateChanged(void Function(FirebaseUser) callback);
  Future<void> logout();
  Future<UserData> getCurrentUser();
}

DatabaseFirebase:

class DatabaseFirebase implements BaseAuth {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  FirebaseUser _firebaseUser;

  //Some implementations bla bla bla

  @override
  Future<void> onAuthStateChanged(void Function(FirebaseUser) callback) async {
    _firebaseAuth.onAuthStateChanged.listen(callback);
  }
}

用户存储库:

class UserRepository with ChangeNotifier {
  Status _status = Status.Uninitialized;
  BaseAuth auth;
  UserData _user;

  UserRepository({@required this.auth}) {
    auth.onAuthStateChanged(_onAuthStateChanged);
  }
  //Some implementation bla bla bla

  Future<void> _onAuthStateChanged(FirebaseUser user) async {
    if (user == null || user.uid == null) {
      _status = Status.Unauthenticated;
    } else {
      auth.getCurrentUser().then((user) => _user = user);
      _status = Status.Authenticated;
    }
    notifyListeners();
  }
}

因此,如何查看才能使我的登录系统正常工作,我不得不在该函数中使用FirebaseUser。您是否知道如何分隔此功能?我想在我的BaseAuth中有一个名为onAuthStateChanged的函数,不带任何参数,或者有一个名为UserData的函数,这是我的用户模型。

换句话说,我有什么办法可以使我的 BaseAuth 类独立于firebase?重构后我的函数应该如何工作?

0 个答案:

没有答案