Что делать после входа в систему, но до того, как важные пользовательские данные будут возвращены во флаттере - PullRequest
0 голосов
/ 06 августа 2020

У меня есть приложение flutter, которое использует firebase для аутентификации.

return StreamBuilder<FirebaseUser>(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, snapshot) {
        if (snapshot.hasData) {
          return HomeScreen();
        } else {
          return LoginScreen();
        }
      },
    );

поэтому в основном, как только пользователь аутентифицируется, он переходит на главный экран. но я не хочу этого, я хочу дождаться другого фрагмента данных из моего api, скажем onboarded, если onboarded == true, то HomeScreen, иначе OnboardingScreen.

Итак, сложная часть перед этим данные поступают, я хочу оставаться на экране входа в систему. как сделать так, чтобы пользователь оставался на экране входа в систему? кажется, лучший способ - сделать так, чтобы другой поток слушал onboardedLoading и объединял эти 2 потока?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Создайте файл dart auth.dart, вставив в него эту строку кода,

final FirebaseAuth auth = FirebaseAuth.instance;

Future<FirebaseUser> handleSignInEmail(String email, String password) async {

    AuthResult result = await auth.signInWithEmailAndPassword(email: email, password: password);
    final FirebaseUser user = result.user;

    assert(user != null);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await auth.currentUser();
    assert(user.uid == currentUser.uid);

    print('signInEmail succeeded: $user');

    return user;

  }

Future<FirebaseUser> handleSignUp(email, password) async {

    AuthResult result = await auth.createUserWithEmailAndPassword(email: email, password: password);
    final FirebaseUser user = result.user;

    assert (user != null);
    assert (await user.getIdToken() != null);

    return user;

  } 

На странице входа / Sigup создайте экземпляр моего класса auth:

var authHandler = new Auth();

В onPressed () вашей кнопки

onPressed: () {
if(onboardedLoading==true){
    authHandler.handleSignInEmail(emailController.text, passwordController.text)
    .then((FirebaseUser user) {
         Navigator.push(context, new MaterialPageRoute(builder: (context) =>  HomeScreen()));
   }).catchError((e) => print(e));


} 
}else{
//Show An Animation, such as CirclularProgressIndicator.
}
0 голосов
/ 06 августа 2020

Вы можете создать простой экран загрузки, а затем использовать Navigator.pushAndRemoveUntil () для любого нужного вам экрана после получения AuthState.

...