我在本地检查中为regex
实现了email format
,
然后调用firebase登录/注册api,它返回ERROR_INVALID_EMAIL
,这意味着我提供的电子邮件格式未在firebase服务器中传递。
我当前使用的电子邮件正则表达式规则来自一家酒吧validators:code
我的测试简单电子邮件仅为aaa@aaa.a
RegExp _email = new RegExp(
r"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$");
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:validators/validators.dart';
class AuthState extends ChangeNotifier {
AuthState();
// NOTE: maybe need to use FirebaseApp(appName) to replace default.
final _auth = FirebaseAuth.instance;
User _userFromFirebase(FirebaseUser user, {bool isJustSignUp = false}) {
if (user == null) {
return null;
}
return User(
user.email,
imgUrl: '',
);
}
Future<User> getUser() async {
var user = await _auth.currentUser();
debugPrint('[+] -- $runtimeType: getUser:$user}');
return _userFromFirebase(user);
}
Future<User> signInWithEmailPassword(String email, String password) async {
try {
FirebaseUser user = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
return _userFromFirebase(user);
} catch (error, stackTrace) {
debugPrint(
'[+] -- $runtimeType: signInWithEmailPassword: error:$error, stackTrace:$stackTrace');
if (error.code == 'ERROR_USER_NOT_FOUND') {
// Login with email not found: to signUp with email password.
return _signUpWithEmailPassword(email, password);
}
}
}
Future<User> _signUpWithEmailPassword(String email, String password) async {
try {
FirebaseUser user = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
return _userFromFirebase(user, isJustSignUp: true);
} catch (error, stackTrace) {
debugPrint('error:$error, stackTrace:$stackTrace');
}
}
bool emailValidation(String email) {
if (email.isNotEmpty) {
if (email.length > 30) {
// assuem email length more then 30 will give false.
return false;
}
return isEmail(email);
}
return false;
}
}
class User {
const User(
this.email,{
this.imgUrl ='',
});
final String email;
final String imgUrl;
}
我想做的就是在用户点击登录之前收到此错误, 那可能吗 ?
答案 0 :(得分:0)
正如我们在评论中所讨论的,我们在电子邮件地址末尾的最后一个点之后需要两个字符,以与Firebase电子邮件有效格式匹配。为此,请将您的正则表达式更改为
^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$