как проверить поле формы на основе значения другого?

У меня есть 2 поля формы, я хочу проверить второе поле формы, чтобы он соответствовал паролю с первого, я пытался, но не имел успеха. Спасибо за ответ.

Обновлено: у меня уже есть кнопка отправки и ее работа, я хочу, чтобы валидатор во втором поле проверял первый текст поля, чтобы он соответствовал второму полю.

            new TextFormField(
          controller: _registerPassController,
          decoration: new InputDecoration(labelText: 'Password'),
          obscureText: true,
          validator: (value) =>
              value.isEmpty ? 'Password can\'t be empty' : null,
          onSaved: (value) => _password = value,
        ),
      ],
    ),
    new Stack(
      alignment: const Alignment(1.0, 1.0),
      children: <Widget>[
        new TextFormField(
          controller: _registerPassController2,
          decoration: new InputDecoration(labelText: 'Retype Password'),
          obscureText: true,
          validator: (value) {
            if (value.isEmpty) {
              return 'Please enter some text';
            }
          },),

Ответы

Ответ 1

Я наконец нашел ответ, это так просто на самом деле.

        new TextFormField(
          controller: _registerPassController2,
          decoration: new InputDecoration(labelText: 'Retype Password'),
          obscureText: true,
          validator: (value) {
            if (value != _registerPassController.text) {
              return 'Password is not matching';
            }
          },
        ),

Ответ 2

Поскольку вы используете formfield, будет целесообразно использовать ключ для доступа к значению другого поля. Вы можете объявить глобальный ключ таким образом

var passKey = GlobalKey<FormFieldState>();

Затем передайте его в поле пароля, чтобы получить его значение во время проверки.

TextFormField(
  key: passKey,
  obscureText: true,
  decoration: InputDecoration(
      labelText: "Password"
  ),
  validator: (password){
    var result = password.length < 4 ? "Password should have at least 4 characters" : null;
    return result;
  },
);

Затем вы можете использовать пароль в валидаторе подтверждения, как это

TextFormField(
  obscureText: true,
  decoration: InputDecoration(
      labelText: "Confirm Password"
  ),
  validator: (confirmation){
    var password = passKey.currentState.value;
    return equals(confirmation, password) ? null : "Confirm Password should match password";
  },
);

Ответ 3

То, как я это делаю, - это проверить на кнопке отправки, а затем показать сообщение.

  String _password;
  Widget _passwordField() {
    return new TextFormField(
        autocorrect: false,
        obscureText: true,
        decoration: InputDecoration(labelText: 'Password'),
        validator: (value) =>
          value.isEmpty ? "Password can't be empty" : null,
        onSaved: (val) => _password = val;
  }

  String _passwordConfirm;
  Widget _passwordConfirmField() {
    return new TextFormField(
        autocorrect: false,
        obscureText: true,
        decoration: InputDecoration(labelText: 'Retype Password'),
        validator: (value) =>
          value.isEmpty ? "Password can't be empty" : null,
        onSaved: (val) => _passwordConfirm = val;
  }

  final formKey = new GlobalKey<FormState>();
  Widget _buildForm() {
     return new Form(
      autovalidate: true, 
      key: formKey, 
      child: new Column(children: <Widget>[
         _passwordField(),
         _passwordConfirmField(),
         new RaisedButton(
            child: Text('Sign Up'),
            onPressed: () => submit()
         )
      ]

  }

void submit() {
   final form = formKey.currentState;

   if (form.validate()) {
      form.save();  //this will cause the onSaved method to get called

      //you will need to do some additional validation here like matching passwords
      if(_password != _passwordConfirm) {
         showDialog(....)
      } else {
         //complete
      }
   } 

}

Примечание. Это StatefulWidget

Ответ 4

Это мой метод, большое спасибо Suhair. Он основан на Suhair, но его не работает для меня...

(Первый пароль)

TextFormField(
                    key: passKey,
                    obscureText: true,
                    decoration: InputDecoration(labelText: "Password"),
                    validator: (password) {
                      var result = password.length < 4
                          ? "Password should have at least 4 characters"
                          : null;
                      return result;
                    },
                  ),

(Второй)

TextFormField(
                    obscureText: true,
                    decoration: InputDecoration(labelText: "Confirm Password"),
                    validator: (confirmation) {
                      if (confirmation != passKey.currentState.value) {
                        return 'Passwords do not match';
                      } else {
                        return null;
                      }
                    },
                  ),

и вам также нужно объявить переменную

 var passKey = GlobalKey<FormFieldState>();