我如何在 flutter 中使用 formz 确认密码
how can i confirm password using formz in flutter
当我想确认我的密码,但我无法比较第一个和最后一个密码时
这是我的密码 class。它工作正常,但 confirmPassword 部分不行。
class Password extends FormzInput<String, PasswordValidationError> {
const Password.pure() : super.pure('');
const Password.dirty([String value = '']) : super.dirty(value);
static final _passwordRegExp = RegExp(r'^[A-Za-z\d@$!%*?&]{8,}$');
@override
PasswordValidationError? validator(String value) {
if (value.isEmpty) {
return PasswordValidationError.empty;
}
return _passwordRegExp.hasMatch(value)
? null
: PasswordValidationError.invalid;
}
}
你可以问验证器中的值是多少。让我告诉你。
void passwordChanged(String value) {
final password = Password.dirty(value);
emit(state.copyWith(
password: password,
status: Formz.validate(
[state.name, state.email, password, state.confirmPassword]),
));
}
这是我的普通密码字段。现在让我们看看确认部分。
class ConfirmPassword
extends FormzInput<String, ConfirmedPasswordValidationError> {
const ConfirmPassword.pure() : super.pure('');
const ConfirmPassword.dirty([String value = '']) : super.dirty(value);
static final _confirmPasswordRegExp = RegExp(r'^[A-Za-z\d@$!%*?&]{8,}$');
@override
ConfirmedPasswordValidationError? validator(String value) {
if (value.isEmpty) {
return ConfirmedPasswordValidationError.empty;
} else if (!_confirmPasswordRegExp.hasMatch(value)) {
return ConfirmedPasswordValidationError.invalid;
}
return (password**I mentioned here** == value)
? null
: ConfirmedPasswordValidationError.mismatch;
}
}
验证器中的值:
void confirmPasswordChanged(String value) {
final confirmPassword =
ConfirmPassword.dirty(value);
emit(state.copyWith(
confirmPassword:
state.password.valid ? confirmPassword : const ConfirmPassword.pure(),
status: Formz.validate(
[state.name, state.email, state.password, confirmPassword]),
));
}
如何到达 confirmPassword 部分的第一个(正常)值字段?或者有什么方法可以和formz一起使用吗?
这是一个验证器
import 'package:formz/formz.dart';
enum ConfirmedPasswordValidationError {
invalid,
mismatch,
}
class ConfirmedPassword extends FormzInput<String, ConfirmedPasswordValidationError> {
final String password;
const ConfirmedPassword.pure({
this.password = ''
}) : super.pure('');
const ConfirmedPassword.dirty({
required this.password,
String value = ''
}) : super.dirty(value);
@override
ConfirmedPasswordValidationError? validator(String value) {
if (value.isEmpty) {
return ConfirmedPasswordValidationError.invalid;
}
return password == value
? null
: ConfirmedPasswordValidationError.mismatch;
}
}
extension Explanation on ConfirmedPasswordValidationError {
String? get name {
switch(this) {
case ConfirmedPasswordValidationError.mismatch:
return 'passwords must match';
default:
return null;
}
}
}
状态管理功能块
void _passwordConfirmationChanged(PasswordConfirmationChangede,Emitter<SignUpFormState> emit){
final confirmedPassword = ConfirmedPassword.dirty(
password: state.password.value,
value: e.passwordConfirmStr,
);
emit(state.copyWith(
confirmedPassword: confirmedPassword,
status: Formz.validate([
state.email,
state.password,
confirmedPassword,
]),
));
}
小部件class
class _ConfirmPasswordInput extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<SignUpFormBloc, SignUpFormState>(
buildWhen: (previous, current) =>
previous.password != current.password ||
previous.confirmedPassword != current.confirmedPassword,
builder: (context, state) {
return TextField(
key: const Key('signUpForm_confirmedPasswordInput_textField'),
onChanged: (confirmPassword) => context.read<SignUpFormBloc>()
.add(SignUpFormEvent.passwordConfirmationChanged(confirmPassword)),
obscureText: true,
decoration: InputDecoration(
labelText: 'confirm password',
helperText: '',
errorText: state.confirmedPassword.invalid
? 'passwords do not match'
: null,
),
);
},
);
}
}
当我想确认我的密码,但我无法比较第一个和最后一个密码时
这是我的密码 class。它工作正常,但 confirmPassword 部分不行。
class Password extends FormzInput<String, PasswordValidationError> {
const Password.pure() : super.pure('');
const Password.dirty([String value = '']) : super.dirty(value);
static final _passwordRegExp = RegExp(r'^[A-Za-z\d@$!%*?&]{8,}$');
@override
PasswordValidationError? validator(String value) {
if (value.isEmpty) {
return PasswordValidationError.empty;
}
return _passwordRegExp.hasMatch(value)
? null
: PasswordValidationError.invalid;
}
}
你可以问验证器中的值是多少。让我告诉你。
void passwordChanged(String value) {
final password = Password.dirty(value);
emit(state.copyWith(
password: password,
status: Formz.validate(
[state.name, state.email, password, state.confirmPassword]),
));
}
这是我的普通密码字段。现在让我们看看确认部分。
class ConfirmPassword
extends FormzInput<String, ConfirmedPasswordValidationError> {
const ConfirmPassword.pure() : super.pure('');
const ConfirmPassword.dirty([String value = '']) : super.dirty(value);
static final _confirmPasswordRegExp = RegExp(r'^[A-Za-z\d@$!%*?&]{8,}$');
@override
ConfirmedPasswordValidationError? validator(String value) {
if (value.isEmpty) {
return ConfirmedPasswordValidationError.empty;
} else if (!_confirmPasswordRegExp.hasMatch(value)) {
return ConfirmedPasswordValidationError.invalid;
}
return (password**I mentioned here** == value)
? null
: ConfirmedPasswordValidationError.mismatch;
}
}
验证器中的值:
void confirmPasswordChanged(String value) {
final confirmPassword =
ConfirmPassword.dirty(value);
emit(state.copyWith(
confirmPassword:
state.password.valid ? confirmPassword : const ConfirmPassword.pure(),
status: Formz.validate(
[state.name, state.email, state.password, confirmPassword]),
));
}
如何到达 confirmPassword 部分的第一个(正常)值字段?或者有什么方法可以和formz一起使用吗?
这是一个验证器
import 'package:formz/formz.dart';
enum ConfirmedPasswordValidationError {
invalid,
mismatch,
}
class ConfirmedPassword extends FormzInput<String, ConfirmedPasswordValidationError> {
final String password;
const ConfirmedPassword.pure({
this.password = ''
}) : super.pure('');
const ConfirmedPassword.dirty({
required this.password,
String value = ''
}) : super.dirty(value);
@override
ConfirmedPasswordValidationError? validator(String value) {
if (value.isEmpty) {
return ConfirmedPasswordValidationError.invalid;
}
return password == value
? null
: ConfirmedPasswordValidationError.mismatch;
}
}
extension Explanation on ConfirmedPasswordValidationError {
String? get name {
switch(this) {
case ConfirmedPasswordValidationError.mismatch:
return 'passwords must match';
default:
return null;
}
}
}
状态管理功能块
void _passwordConfirmationChanged(PasswordConfirmationChangede,Emitter<SignUpFormState> emit){
final confirmedPassword = ConfirmedPassword.dirty(
password: state.password.value,
value: e.passwordConfirmStr,
);
emit(state.copyWith(
confirmedPassword: confirmedPassword,
status: Formz.validate([
state.email,
state.password,
confirmedPassword,
]),
));
}
小部件class
class _ConfirmPasswordInput extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<SignUpFormBloc, SignUpFormState>(
buildWhen: (previous, current) =>
previous.password != current.password ||
previous.confirmedPassword != current.confirmedPassword,
builder: (context, state) {
return TextField(
key: const Key('signUpForm_confirmedPasswordInput_textField'),
onChanged: (confirmPassword) => context.read<SignUpFormBloc>()
.add(SignUpFormEvent.passwordConfirmationChanged(confirmPassword)),
obscureText: true,
decoration: InputDecoration(
labelText: 'confirm password',
helperText: '',
errorText: state.confirmedPassword.invalid
? 'passwords do not match'
: null,
),
);
},
);
}
}