class SignUpBloc {
final _fullNm = BehaviorSubject<String>();
final _userNm = BehaviorSubject<String>();
final _emailAd = BehaviorSubject<String>();
final _password = BehaviorSubject<String>();
//Get
Stream<String> get fullNm => _fullNm.stream.transform(validateFullName);
Stream<String> get userNm => _userNm.stream.transform(validateUserName);
Stream<String> get emailAd => _emailAd.stream.transform(validateEmailAddress);
Stream<String> get password => _password.stream.transform(validatePassword);
Stream<bool> get signUpInfoValid => Rx.combineLatest4(fullNm, userNm, emailAd,
password, (fullNm, userNm, emailAd, password) => true);
//Set
Function(String) get changeFullName => _fullNm.sink.add;
Function(String) get changeUserName => _userNm.sink.add;
Function(String) get changeEmailAddress => _emailAd.sink.add;
Function(String) get changePassword => _password.sink.add;
dispose() {
_fullNm.close();
_userNm.close();
_emailAd.close();
_password.close();
}
//Transformers
final validateFullName = StreamTransformer<String, String>.fromHandlers(
handleData: (fullNm, sink) {
if (validator.name(fullNm) != true)
sink.addError("Please enter a valid name");
else
sink.add(fullNm);
});
final validateUserName = StreamTransformer<String, String>.fromHandlers(
handleData: (userName, sink) {
bool validateStructure(String value) {
String pattern =
r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
RegExp regExp = new RegExp(pattern);
return regExp.hasMatch(value);
}
if (validateStructure(userName) != true)
sink.addError("Please enter a user name");
else
sink.add(userName);
});
final validateEmailAddress = StreamTransformer<String, String>.fromHandlers(
handleData: (emailAd, sink) {
if (validator.email(emailAd) != true)
sink.addError("Please enter a email address");
else
sink.add(emailAd);
});
final validatePassword = StreamTransformer<String, String>.fromHandlers(
handleData: (password, sink) {
if (validator.password(password) != true)
sink.addError("Please enter a password");
else
sink.add(password);
});
Future signUpUsr() async {
AuthResult user = await FirebaseAuth.instance
.createUserWithEmailAndPassword(
email: _emailAd.value, password: _password.value);
FirebaseUser fbUser = user.user;
await DatabaseService(uid: fbUser.uid)
.updataUserData(_fullNm.value, _userNm.value, _emailAd.value);
debugPrint("Name: ${_fullNm.value}");
debugPrint("\nUser name: ${_userNm.value}");
debugPrint("\nEmail Address: ${_emailAd.value}");
debugPrint("\nPassword: ${_password.value}");
}
}
As far the signup bloc goes,when the user finishes typing and presses the button it would go to the signUpUsr().
class LoginBloc {
final _userNm = BehaviorSubject<String>();
final _emailAd = BehaviorSubject<String>();
final _password = BehaviorSubject<String>();
//Get
Stream<String> get emailAd => _emailAd.stream;
Stream<String> get password => _password.stream;
Stream<bool> get loginInfoValid =>
Rx.combineLatest2(emailAd, password, (emailAd, password) => true);
//Set
Function(String) get changeEmailAddress => _emailAd.sink.add;
Function(String) get changePassword => _password.sink.add;
dispose() {
_userNm.close();
_emailAd.close();
_password.close();
}
Future loginUsr() async {
try {
AuthResult user = await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _emailAd.value, password: _password.value);
// Navigator.pushNamed(context, 'home')
} catch (error_msg) {
switch (error_msg.code) {
case "ERROR_USER_NOT_FOUND":
{}
break;
case "ERROR_WRONG_PASSWORD":
{}
break;
default:
var n = null;
}
}
debugPrint("\nUser name: ${_userNm.value}");
debugPrint("\nPassword: ${_password.value}");
}
}
With the loginBloc I have the problem of when the user logins in I cant go to the page I want because it doesn't have a context. So I navigate to the home page from the login page, regardless of the error that firebase may or may not gives back.