Поток аутентификации флаттера для SplashScreen - PullRequest
0 голосов
/ 21 марта 2020

я создал AuthProivder, и у меня есть несколько статусов аутентификации, которые я слушаю

Я создал заставку, которая загружается первой и проверяет статус аутентификации и, основываясь на текущем состоянии, будет перемещать их на правильную страницу ,

class SplashScreen extends StatefulWidget {
  static const String id = "splashscreen";

  @override
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  @override
  void didChangeDependencies() async {
    final status = Provider.of<AuthProvider>(context).status;
    print(status.toString());
    WidgetsBinding.instance.addPostFrameCallback((_) {
      switch (status) {
        case Status.Uninitialized:
          Navigator.pushReplacementNamed(context, WelcomeScreen.id);
          break;
        case Status.Unauthenticated:
        case Status.Authenticating:
          Navigator.pushReplacementNamed(context, LoginScreen.id);
          break;
        case Status.Authenticated:
          Navigator.pushReplacementNamed(context, LoadAuthData.id);
          break;
      }
    });
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

AuthProvider

enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated }

class AuthProvider with ChangeNotifier {
  FirebaseAuth _auth;
  FirebaseUser _user;
  GoogleSignIn _googleSignIn;
  Status _status = Status.Uninitialized;
  Firestore _firestore = Firestore.instance;
  String _token;

  AuthProvider.instance()
      : _auth = FirebaseAuth.instance,
        _googleSignIn = GoogleSignIn() {
    _auth.onAuthStateChanged.listen(_onAuthStateChanged);
  }

  Status get status => _status;
  FirebaseUser get user => _user;
  String get token => _token;

  void updateIdToken() {
    if (_auth.currentUser() != null) {
      _auth.currentUser().then((val) {
        val.getIdToken(refresh: true).then((onValue) {
          _token = onValue.token;
          notifyListeners();
        });
      });
    }
  }

  Future<bool> signIn(String email, String password) async {
    try {
      _status = Status.Authenticating;
      notifyListeners();
      await _auth.signInWithEmailAndPassword(email: email, password: password);
      return true;
    } catch (e) {
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }

  Future<bool> registerUser(String email, String password) async {
    try {
      _status = Status.Authenticating;
      notifyListeners();
      final AuthResult _authResult = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);
      _firestore
          .collection('users')
          .document(_authResult.user.uid)
          .setData({'email': _authResult.user.email});
      return true;
    } catch (e) {
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }

  Future<bool> resetEmailLink(String email) async {
    try {
      _status = Status.Authenticating;
      notifyListeners();
      await _auth.sendPasswordResetEmail(email: email);
      return true;
    } catch (e) {
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }

  Future<bool> signInWithGoogle() async {
    try {
      _status = Status.Authenticating;
      notifyListeners();
      final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
      final GoogleSignInAuthentication googleAuth =
          await googleUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );
      await _auth.signInWithCredential(credential);
      return true;
    } catch (e) {
      print(e);
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }

  Future signOut() async {
    _auth.signOut();
    _googleSignIn.signOut();
    _status = Status.Unauthenticated;
    notifyListeners();
    return Future.delayed(Duration.zero);
  }

  Future<void> _onAuthStateChanged(FirebaseUser firebaseUser) async {
    if (firebaseUser == null) {
      _status = Status.Unauthenticated;
    } else {
      firebaseUser.getIdToken().then((onValue) => _token = onValue.token);
      _user = firebaseUser;
      updateIdToken();
      _status = Status.Authenticated;
    }
    notifyListeners();
  }
}

Я обнаружил, что изначально статус является унифицированным, и он отправляет страницу на экран приветствия, а через пару секунд статус меняется на Аутентифицированный затем он переходит на экран LoadAuthData

. Есть ли лучший способ реализовать это, чем то, как я это делал в настоящее время, мне нужно обработать «Новый пользователь == Uninialzied, CurrentUser == UnAuthenicated / Authenticating и Logged in Пользователь

я пытаюсь не показывать экран приветствия на мгновение, а затем перейти к загрузке экрана или входа в систему

Спасибо

1 Ответ

0 голосов
/ 04 апреля 2020

Я смог использовать shareprefferences и сохранить значение, если он впервые используется вместе с firebase auth и проверяет текущего пользователя! = Null

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