Firebase 电子邮件验证 Flutter

wcy*_*424 4 firebase firebase-authentication flutter

我知道这个问题已经被问了很多,我花了很多时间阅读并尝试实现答案。所以我试图让isEmailVerifiedFirebase Auth的响应工作并且它确实工作但现在它总是返回 false 除非我刷新应用程序或关闭它并重新打开它。这显然是一种糟糕的用户体验。如何在无需关闭应用程序的情况下获得更新响应。

这是相关的代码片段。

 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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

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(),
          ),
Run Code Online (Sandbox Code Playgroud)

在我重新启动应用程序之前它不会返回 true
除了这个之外我还尝试过的事情:
1)await user.getIdToken(refresh: true);
2)将用户注销然后重新登录
3)firebase_user_stream 包

任何帮助表示赞赏。

San*_*iya 6

我已经使用以下代码在初始屏幕中实现了相同的场景,您可以根据需要进行更改。:

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

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(),),
          );
        }
      },
    );
  }
Run Code Online (Sandbox Code Playgroud)

  @override
  void initState() {
    super.initState();
    countDownTime();
  }
Run Code Online (Sandbox Code Playgroud)

更新
一需要定期在 initState() 函数中实现 isEmailVerified ,这可能是使用 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();
    }
}
Run Code Online (Sandbox Code Playgroud)