Я реализовал regex
для email format
при локальной проверке, затем вызову firebase, войдите / зарегистрируйтесь в api, он вернет ERROR_INVALID_EMAIL
, что означает, что предоставленный мною формат электронной почты не передается на сервер firebase.
Правило регулярного выражения электронной почты, которое я в настоящее время использую, принадлежит пабу валидаторы : код
Мой тестовый простой электронный адрес - 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;
}
Что я хотел бы сделать, это получить эту ошибку до того, как пользователь нажмет на кнопку, это возможно?
- Я просто не могу найти правило по тексту или регулярному выражению.
- Или есть способ проверить электронную почту только на наличие firebase api?