Как отделить Firebase от абстрактного класса - PullRequest
0 голосов
/ 18 мая 2019

Во-первых, я не уверен, правильно ли я назвал этот вопрос, поэтому не стесняйтесь поправлять меня, если вы знаете другой лучше, чем мой.

ЧТОЯ ПЫТАЮСЬ СДЕЛАТЬ:

Я пытаюсь внедрить систему аутентификации на основе 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);
  }
}

UserRepository:

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?Как должна выглядеть моя функция, чтобы она работала после рефакторинга?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...