Проверка электронной почты Firebase Flutter - PullRequest
2 голосов
/ 04 апреля 2020

Я знаю, что этот вопрос задавали много, и я потратил много времени, читая и пытаясь реализовать ответы. Поэтому я пытаюсь получить ответ от isEmailVerified от Firebase Auth, и он работает, но сейчас он всегда возвращает false, если я не обновлю sh приложение или не закрою его и не открою снова. что явно плохо для пользователя. Как получить ответ на обновление без необходимости закрывать приложение.

Вот соответствующие фрагменты кода.

 Future<bool> isEmailVerified() async {
    FirebaseUser user = await _auth.currentUser();

    if (user == null) {
      return false;
    } else {
     await user.reload();
     user = await _auth.currentUser();
      return user.isEmailVerified;
    }
  }

main.dart

  child: Consumer<Auth>(
        builder: (_, auth, __) => MaterialApp(
          theme: Provider.of<ThemeNotifier>(context).getTheme(),
          home: FutureBuilder(
            future: Future.wait([auth.isEmailVerified(), auth.tryAutoLogin()]),
            builder: (BuildContext ctx, AsyncSnapshot authResultSnapshot) =>
                authResultSnapshot.connectionState == ConnectionState.done
                    ? authResultSnapshot.data[1]
                        ? authResultSnapshot.data[0]
                            ? HearingsScreen()
                            : SplashScreen(
                                emailVerified: true,
                              )
                        : LoginScreen()
                    : SplashScreen(),
          ),

Это не возвращает истину, пока я не перезапущу приложение
Что я пробовал, кроме этого:
1) await user.getIdToken(refresh: true);
2) зарегистрировать пользователя, затем вернуться в
3) пакет firebase_user_stream

Любая помощь приветствуется.

1 Ответ

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

Я реализовал тот же сценарий на экране spla sh с кодом ниже, вы можете изменить его в соответствии с вашими требованиями. :

//To check is User is logged in
  Future<bool> isLoggedIn() async {
    FirebaseUser user = await _fireBaseAuth.currentUser();
    if (user == null) {
      return false;
    }
    return user.isEmailVerified;
  }

и

countDownTime() async {
    return Timer(
      Duration(seconds: splashDuration),
      () async {
        if (await userAuth.isLoggedIn()) {
            Navigator.pushReplacement(
              context,
              ScaleRoute(
                widget: HomeScreen(),),
            );
          }
        } else {
          Navigator.pushReplacement(
            context,
            ScaleRoute(
              widget: LoginScreen(),),
          );
        }
      },
    );
  }

и

  @override
  void initState() {
    super.initState();
    countDownTime();
  }

Обновление
Необходимо реализовать isEmailVerified в initState () периодически, что может быть идеальным подходом для выполнения проверки с помощью firebase.

bool _isUserEmailVerified;
Timer _timer;

@override
void initState() {
    super.initState();
    // ... any code here ...
    Future(() async {
        _timer = Timer.periodic(Duration(seconds: 10), (timer) async {
            await FirebaseAuth.instance.currentUser()..reload();
            var user = await FirebaseAuth.instance.currentUser();
            if (user.isEmailVerified) {
                setState((){
                    _isUserEmailVerified = user.isEmailVerified;
                });
                timer.cancel();
            }
        });
    });
}

@override
void dispose() {
    super.dispose();
    if (_timer != null) {
        _timer.cancel();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...