通过 Flutter for Firebase 重新发送验证
Resend Verification through Flutter for Firebase
当用户尝试注册已创建的帐户时,我无法向他们发送电子邮件验证 link。我正在使用 Flutter 编写代码,使用 Firebase 作为后端数据库。
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
abstract class BaseAuth {
Stream<String> get onAuthStateChanged;
Future<String> currentUser();
Future<String> resendVerifyEmail(BaseAuth auth, String email);
}
class Auth implements BaseAuth {...}
Future<String> currentUser() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
print("Getting current user: " + user?.uid);
return user?.uid;
}
Future<String> resendVerifyEmail(BaseAuth auth, String email) async {
try {
final FirebaseUser user = await _firebaseAuth.currentUser();
user.sendEmailVerification();
return user?.uid;
} catch (e) {
print("An Error occurred while sending verification link");
print(e.toString());
return null;
}
}
在 try 块内,当调用方法 currentUser() 时,代码退出并 returns 到调用 resendVerifyEmail 的方法,而没有完成 try-catch 块。
我很难在调用 resendVerifyEmail 的弹出窗口中重新发送电子邮件验证。
请告诉我使用 Flutter 从 Firebase 发送电子邮件验证的任何替代方法或如何处理。
void _showVerifyEmailDialog(BuildContext context, String email) {
final BaseAuth auth = AuthProvider.of(context).auth;
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
title: new Text("Account Already Exists"),
content: new Text("Please verify account in the link sent to email"),
actions: <Widget>[
new FlatButton(
child: new Text("Resend verification email"),
onPressed: () {
Navigator.of(context).pop();
auth.resendVerifyEmail(); <- Called from this line in login.dart
为什么代码在下面的语句处退出,而没有移动到发送电子邮件的下一行?
final FirebaseUser user = await _firebaseAuth.currentUser();
您似乎在重新发送邮件功能中添加了不必要的项目。以下是我自己的实现方式:
Future<void> sendEmailVerification() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
user.sendEmailVerification();
}
注册用户后调用即可:
await Auth().sendEmailVerification();
await Auth().signOut();
确保将用户注销,以便他们在关闭和打开您的应用程序时无法自动登录。如果用户像这样验证了他的电子邮件,您也应该在登录中添加检查:
Future<bool> isEmailVerified() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
return user.isEmailVerified == null ? false : user.isEmailVerified;
}
登录时调用即可。
当用户尝试注册已创建的帐户时,我无法向他们发送电子邮件验证 link。我正在使用 Flutter 编写代码,使用 Firebase 作为后端数据库。
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
abstract class BaseAuth {
Stream<String> get onAuthStateChanged;
Future<String> currentUser();
Future<String> resendVerifyEmail(BaseAuth auth, String email);
}
class Auth implements BaseAuth {...}
Future<String> currentUser() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
print("Getting current user: " + user?.uid);
return user?.uid;
}
Future<String> resendVerifyEmail(BaseAuth auth, String email) async {
try {
final FirebaseUser user = await _firebaseAuth.currentUser();
user.sendEmailVerification();
return user?.uid;
} catch (e) {
print("An Error occurred while sending verification link");
print(e.toString());
return null;
}
}
在 try 块内,当调用方法 currentUser() 时,代码退出并 returns 到调用 resendVerifyEmail 的方法,而没有完成 try-catch 块。
我很难在调用 resendVerifyEmail 的弹出窗口中重新发送电子邮件验证。
请告诉我使用 Flutter 从 Firebase 发送电子邮件验证的任何替代方法或如何处理。
void _showVerifyEmailDialog(BuildContext context, String email) {
final BaseAuth auth = AuthProvider.of(context).auth;
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
title: new Text("Account Already Exists"),
content: new Text("Please verify account in the link sent to email"),
actions: <Widget>[
new FlatButton(
child: new Text("Resend verification email"),
onPressed: () {
Navigator.of(context).pop();
auth.resendVerifyEmail(); <- Called from this line in login.dart
为什么代码在下面的语句处退出,而没有移动到发送电子邮件的下一行?
final FirebaseUser user = await _firebaseAuth.currentUser();
您似乎在重新发送邮件功能中添加了不必要的项目。以下是我自己的实现方式:
Future<void> sendEmailVerification() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
user.sendEmailVerification();
}
注册用户后调用即可:
await Auth().sendEmailVerification();
await Auth().signOut();
确保将用户注销,以便他们在关闭和打开您的应用程序时无法自动登录。如果用户像这样验证了他的电子邮件,您也应该在登录中添加检查:
Future<bool> isEmailVerified() async {
final FirebaseUser user = await _firebaseAuth.currentUser();
return user.isEmailVerified == null ? false : user.isEmailVerified;
}
登录时调用即可。