Firebase 电子邮件验证 Flutter
Posted
技术标签:
【中文标题】Firebase 电子邮件验证 Flutter【英文标题】:Firebase email verification Flutter 【发布时间】:2020-07-16 07:52:06 【问题描述】:我知道这个问题被问了很多,我花了很多时间阅读并尝试实施答案。因此,我试图从 Firebase Auth 获取来自 isEmailVerified
的响应,它确实有效,但现在它总是返回 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;
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(),
),
在我重新启动应用程序之前它不会返回 true
除此之外我尝试过的事情:
1) await user.getIdToken(refresh: true);
2) 注销用户然后重新登录
3) firebase_user_stream 包
感谢任何帮助。
【问题讨论】:
尝试在isEmailVerified()
中添加notifylistener()
这是我的猜测
notifyListener()
在我的ConnectionState.waiting
中卡住FutureBuilder
你一般不能使用未来的建设者和提供者
作者自己试试这个***.com/questions/56359049/…
我显然不知道我会检查出来thx
【参考方案1】:
我已经用下面的代码在闪屏中实现了相同的场景,您可以根据您的要求进行更改。 :
//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();
更新 需要定期在 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();
【讨论】:
您是否在您的应用程序中进行电子邮件验证,这是我在您的示例中遇到问题的步骤,您的所有检查是用户是否不为空,这不能保证isEmailVerified
等于 true跨度>
您可以通过“user.isEmailVerified”访问。
我猜你不需要在其他部分创建新的用户实例。之前定义的同一个实例足以知道“user.isEmailVerified”。
是的,我实际上已经在我的应用程序中实现了与此非常相似的代码,但 user.isEmailVerified
总是返回 false,直到我关闭应用程序并重新启动它。
你应该试试这个:***.com/a/60471750/6911538以上是关于Firebase 电子邮件验证 Flutter的主要内容,如果未能解决你的问题,请参考以下文章
在电子邮件密码身份验证中进行额外的自定义检查 (Flutter - Firebase)
Flutter Firebase - 点击Firebase发送的电子邮件验证链接时如何打开应用程序?
在确认注册之前验证用户的电子邮件地址,使用 Flutter 和 Firebase