я создал 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 Пользователь
я пытаюсь не показывать экран приветствия на мгновение, а затем перейти к загрузке экрана или входа в систему
Спасибо