#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:
У вас есть два варианта, чтобы выполнить проверку, ваш код корректен, если вы не запускаете проверку:
- Вызывая
if (_formKey.currentState.validate()) {}
это вызовет проверку,
- Старое решение заключается в использовании
autovalidate:true
параметра toForm
(устарел после 1.19). теперь вам нужно использоватьAutovalidateMode
, и у вас есть несколько вариантов, таких какonUserInteraction
иalways
иdisabled
. Вы можете проверить документы для получения дополнительной информации.
Первый можно использовать, если вам нужна проверка при нажатии пользователем кнопки, а второй является динамическим в зависимости от параметра, который вы передали в `Форму`