как я могу подтвердить пароль с помощью formz в flutter

#flutter #validation #dart #bloc

Вопрос:

Когда я хочу подтвердить свой пароль, но не могу сравнить первый и последний пароли.

Вот мой класс паролей. Это работает нормально, но раздел 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-zd@$!%*?amp;]{8,}

Вы можете спросить, какое значение имеет валидатор. Позвольте мне показать вам.

   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-zd@$!%*?amp;]{8,}

и значение в валидаторе:

   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?


Комментарии:

1. Вы нашли какое-нибудь решение этой проблемы?

2. нет, я этого не делал...

Ответ №1:

Это валидатор

  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 _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,
          ),
        );
      },
    );
  }
}
 

);

@override
PasswordValidationError? validator(String value) {
if (value.isEmpty) {
return PasswordValidationError.empty;
}
return _passwordRegExp.hasMatch(value)
? null
: PasswordValidationError.invalid;
}
}
Вы можете спросить, какое значение имеет валидатор. Позвольте мне показать вам.


Это мое обычное поле пароля. Теперь давайте посмотрим раздел подтверждения.


и значение в валидаторе:


Как я могу перейти к полю первого (обычного) значения в разделе confirmPassword? Или есть какой-нибудь способ использовать formz?

Комментарии:

1. Вы нашли какое-нибудь решение этой проблемы?

2. нет, я этого не делал...

Ответ №1:

Это валидатор


функциональный блок государственного управления


Класс виджетов


);

@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;
}
}
и значение в валидаторе:


Как я могу перейти к полю первого (обычного) значения в разделе confirmPassword? Или есть какой-нибудь способ использовать formz?

Комментарии:

1. Вы нашли какое-нибудь решение этой проблемы?

2. нет, я этого не делал…

Ответ №1:

Это валидатор


функциональный блок государственного управления


Класс виджетов


);

@override
PasswordValidationError? validator(String value) {
if (value.isEmpty) {
return PasswordValidationError.empty;
}
return _passwordRegExp.hasMatch(value)
? null
: PasswordValidationError.invalid;
}
}Вы можете спросить, какое значение имеет валидатор. Позвольте мне показать вам.


Это мое обычное поле пароля. Теперь давайте посмотрим раздел подтверждения.


и значение в валидаторе:


Как я могу перейти к полю первого (обычного) значения в разделе confirmPassword? Или есть какой-нибудь способ использовать formz?

Комментарии:

1. Вы нашли какое-нибудь решение этой проблемы?

2. нет, я этого не делал…

Ответ №1:

Это валидатор


функциональный блок государственного управления


Класс виджетов