firebase - Flutter:如何收听 FirebaseUser 是电子邮件验证的布尔值?
问题描述
我的想法: 我想在 Flutter 中使用 Firebase Auth 插件来注册用户。但在他们可以访问应用程序之前,他们必须验证他们的电子邮件地址。因此,我在注册后将 Firebase 用户推送到验证屏幕。这只是一个加载屏幕,告诉用户他必须验证他的电子邮件。
但是现在:如果用户的电子邮件经过验证并将他(如果为真)发送到主屏幕,我该如何持续收听?
我是 Flutter 的新手,我不知道是否必须使用 Streams 或 Observables 或 while 循环或 setState() 或其他东西来进行这种布尔检查。而且我也不知道如何设置解决方案。
这是我注册用户的基本代码:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
final Firestore _db = Firestore.instance;
Future<FirebaseUser> get getUser => _auth.currentUser();
Stream<FirebaseUser> get user => _auth.onAuthStateChanged;
Future<FirebaseUser> edubslogin(String email, String password) async {
try {
final FirebaseUser user = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
await user.sendEmailVerification();
//email verification somewhere here
updateUserData(user);
return user;
} catch (error) {
print(error);
return null;
}
}
我试过这个:
if (user.isEmailVerified == true) {
//go to Homescreen
return true;
} else {
//show verification screen(loading spinner)
return false;
}
但我没有得到布尔值true
。isEmailVerified
我需要做什么?
解决方案
我刚刚在我的应用程序中遇到了同样的情况。我的解决方案是在策略路由的 initState 方法中创建一个周期性计时器,以保持应用程序直到电子邮件得到验证。它不像使用监听器那么优雅,但工作正常。
bool _isUserEmailVerified;
Timer _timer;
@override
void initState() {
super.initState();
// ... any code here ...
Future(() async {
_timer = Timer.periodic(Duration(seconds: 5), (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();
}
}
推荐阅读
- django - 如何从列表中提取 JSON 值并以 django 模型形式呈现?
- sas - 如何在 SAS 中使用 WHERE 函数?
- hangouts-chat - 使用 Google Chat API 创建的 Bot 的 URI/超链接
- git - Rubocop:从命令行给出的列表中排除文件
- python - 使用协程和函数作为 python 中的方法保持 SOLID 和 DRY
- entity-framework-core - Entity Framework Core 递归加载自引用结果
- ios - 如何在 Codenameone 中禁用 IOS 应用内购买功能
- node.js - nodejs利用路由中的路由访问数据示例
- r - 使用 ggplot2 的气球图
- javascript - 如何在 HTML 中显示输出而不是文本