всегда перенаправляется на страницу входа - PullRequest
0 голосов
/ 13 апреля 2020

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

class MyApp extends StatelessWidget {
  Future<FirebaseUser> getCurrentUser() {
    FirebaseAuth.instance.currentUser().then((value) {
      if(value != null)
        UserSingleton().fireUser = value;
      return value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: getCurrentUser() == null ? SignInPage() : DescriptionPage(),
      debugShowCheckedModeBanner: false,
      routes: <String, WidgetBuilder>{
        '/SignInPage': (BuildContext context) => SignInPage(),
        '/DescriptionPage': (BuildContext context) => DescriptionPage(),
      },
    );
  }
}

То, что я хочу, это когда люди открывают приложение, они должны быть направлены на страницу описания, если они не вышли из системы до закрытия приложения. Если они вышли, я хочу, чтобы их попросили войти на страницу. Когда я запускаю приложение, меня перенаправляют на страницу входа независимо от того, вошел ли пользователь в систему или нет.

Как это исправить?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Вы всегда go переходите на страницу входа, потому что getCurrentUser() является асинхронным, поскольку вы можете видеть, что вызываете метод then() для него, что означает, что он возвращает Future<AuthResult>:

https://dart.dev/codelabs/async-await

Поэтому при выполнении getCurrentUser() == null всегда будет нулевым, поскольку Future все еще не завершил sh извлечения значения. Чтобы решить эту проблему, вам нужно использовать Stateful виджет вместо состояния, а затем внутри вашего State класса переопределить метод initState:

  @override
  void initState() {
    super.initState();
    FirebaseAuth.instance.currentUser().then((res) {
      print(res);
      if (res != null) {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => DescriptionPage(),
        );
      }
      else
      {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SignInPage()),
        );
      }
    });
  }

then() будет содержать обратный вызов, который будет вызывается, когда будущее завершается, и тогда вы можете перейти на правильную страницу.

1 голос
/ 13 апреля 2020

Вы должны использовать onAuthStateChanged,

Рекомендуемый способ получить текущего пользователя - установить наблюдателя на объект Auth

https://firebase.google.com/docs/auth/web/manage-users?authuser=0#get_the_currently_signed -in_user

class MyApp extends StatelessWidget {
  onAuthStateChanged() {
    FirebaseAuth _auth = FirebaseAuth.instance;
    return new StreamBuilder(
        stream: _auth.onAuthStateChanged,
        builder: (BuildContext context, snapshot) {
          if (snapshot.hasData) {
            return DescriptionPage();
          }
          return SignInPage();
        })
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: onAuthStateChanged(),
      debugShowCheckedModeBanner: false,
      routes: <String, WidgetBuilder>{
        '/SignInPage': (BuildContext context) => SignInPage(),
        '/DescriptionPage': (BuildContext context) => DescriptionPage(),
      },
    );
  }

}

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