Flutter: поток авторизации firebase не работает с маршрутами - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь убедиться, что пользователи приложений, которые не авторизованы (вошли в систему), перенаправляются на страницу входа. Вот как выглядит мой main.dart:

class App extends StatelessWidget {

  Widget build(BuildContext context) {

    return StreamBuilder<FirebaseUser>(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (context, snapshot) {
        if (snapshot.connectionState != ConnectionState.active) {
          // some loading widget 
          return MaterialApp(home: Scaffold(),);
        }
        FirebaseUser user = snapshot.data;
        if (user == null) {
          return MaterialApp(home: SignIn(),);
        }
        // this is the main app
        return MaterialApp(
          initialRoute: '/',
          routes: {
            '/': (context) => HomeScreen(),
            '/new_game': (context) => NewGame(),
            '/join_session': (context) => JoinSession(),
            '/my_rankings': (context) => MyRankings(),
            '/settings': (context) => Settings(),
          },
        );
      }
    );
  }
}

Когда я запускаю приложение (на chrome с помощью веб-функции), я начинаю со страницы входа (как и ожидалось), которая просто содержит кнопка анонимного входа. Когда я вхожу в систему, появляется сообщение об ошибке, в котором указано, что построитель начального маршрута (маршрут '/' с HomeScreen() в качестве построителя) возвращает null. Когда я меняю свое основное приложение на простое

return MaterialApp(home: Scaffold(body: Text('This Works')));

, оно действительно работает. При использовании простого MaterialApp(), который делает то же самое, но с использованием routes, он снова выдает ошибку, поэтому проблема, похоже, связана с маршрутизацией. В чем дело?

1 Ответ

0 голосов
/ 28 мая 2020

Не думаю, что так будет работать. main.dart следует использовать только как точку входа в приложение.

class App extends StatelessWidget {

Сборка виджета (контекст BuildContext) {

    return MaterialApp(
      initialRoute: '/',
      routes: {
        '/': (context) => SplashScreen(),
        '/home': (context) => HomeScreen(),
        '/new_game': (context) => NewGame(),
        '/join_session': (context) => JoinSession(),
        '/my_rankings': (context) => MyRankings(),
        '/settings': (context) => Settings(),
      },
    );
  }

}

класс SplashScreen расширяет StatelessWidget {

void isLogged StreamBuilder<FirebaseUser>(
  stream: FirebaseAuth.instance.onAuthStateChanged,
  builder: (context, snapshot) {
    if (snapshot.connectionState != ConnectionState.active) {
      // some loading widget 
      Navigator.pushReplacementNamed(context, '/home');
    }
    FirebaseUser user = snapshot.data;
    if (user == null) {
      Navigator.pushReplacementNamed(context, '/SignIn');
    }
    // this is the main app
);

initiatState(){
    isLogged();
}

Widget build(BuildContext context){

}

}

Вы можете использовать этот метод, чтобы проверить, зарегистрирован ли пользователь auth.currentUser (), он возвращает null, если пользователь не подписан

 FirebaseAuth auth = FirebaseAuth.instance;
await auth.currentUser() == null ? false : true;
...