Простой валидатор текстовых полей, но ничего не возвращает

#flutter

#flutter

Вопрос:

У меня вопрос о том, как использовать валидатор. Я не вижу, где я ошибся. Код, который я написал, заключается в том, что при нажатии кнопки появляется диалоговое окно и пользователю предлагается ввести имя.

 final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

FlatButton(
  onPressed: () {
    showDialog(
      context: context,
      builder: (_) => Dialog(
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                key: _formKey,
                controller: roomController,
                validator: (String value) {
                  if (value.isEmpty) {
                    return 'Please create name';
                    } else if (NameList.contains(value)) {
                      return 'Existed';
                  }
                  return null;
                },
              ),
              RaisedButton(
                onPressed: () {},
                child: Text('Create'),
              ),
            ],
          ),
        ),
      ),
    );
  },
  child: Text('Create'),
),
  

Коды работают нормально, делают все, что я намеревался, кроме части проверки.
Я что-нибудь пропустил здесь?

Спасибо.

Ответ №1:

вы должны проверить проверку внутри кнопки onPress следующим образом

 final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

FlatButton(
  onPressed: () {
    showDialog(
      context: context,
      builder: (_) => Dialog(
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                key: _formKey,
                controller: roomController,
                validator: (String value) {
                  if (value.isEmpty) {
                    return 'Please create name';
                    } else if (NameList.contains(value)) {
                      return 'Existed';
                  }
                  return null;
                },
              ),
              RaisedButton(
                onPressed: () {
           if(_formKey.currentState.validate()){
           return //someting
                     }
              },
                child: Text('Create'),
              ),
            ],
          ),
        ),
      ),
    );
  },
  child: Text('Create'),
),
  

Ответ №2:

У вас есть два варианта, чтобы выполнить проверку, ваш код корректен, если вы не запускаете проверку:

  1. Вызывая
 if (_formKey.currentState.validate()) {}
  

это вызовет проверку,

  1. Старое решение заключается в использовании autovalidate:true параметра to Form (устарел после 1.19). теперь вам нужно использовать AutovalidateMode , и у вас есть несколько вариантов, таких как onUserInteraction и always и disabled . Вы можете проверить документы для получения дополнительной информации.

Первый можно использовать, если вам нужна проверка при нажатии пользователем кнопки, а второй является динамическим в зависимости от параметра, который вы передали в `Форму`