У меня есть диалоговое окно с трепетом TextFormField. Я хотел обработать пользователя в сети, нажав Enter, чтобы принять значение в поле. Метод onFieldSubmitted () работает для этого, но на самом деле работает очень хорошо. Если они даже снимают фокус с поля, это срабатывает. Я действительно хочу, чтобы вызвать только для клавиши ввода. Должен ли я использовать RawKeyboardListener () для этого? Или есть какой-то способ узнать, что это не клавиша Enter, а изменение фокуса, которое вызвало onFieldSubmitted ()? Вот мой пример кода для диалога. CustomTextField - это только я, расширяющий TextFormField, чтобы каждый раз выглядеть определенным образом.
var res = await showDialog<String>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Row(
children: <Widget>[
Text('Add '),
Container(
width: 8,
),
DropdownButton(
value: _currentAddType,
items: _addTypeDropDownMenuItems,
onChanged: (value) => _changeAddType(value),
),
],
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(8.0))),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
CustomTextField(
controller: _roomNameController,
textCapitalization: TextCapitalization.words,
autoFocus: true,
icon: Icon(Icons.text_fields),
hint: "Room Name",
onFieldSubmitted: (value) => { // <======== this is the problem, it works even if just losing focus
setState(() {
Navigator.of(context).pop('Add');
})
},
),
Container(
height: 12,
),
Text(
'Select Gateway:',
style: Theme.of(context).textTheme.headline6,
),
Container(
height: 4,
),
DropdownButton(
value: _currentGateway,
items: _gatewayDropDownMenuItems,
onChanged: (String gateway) {
_currentGateway = gateway;
setState(() {
Navigator.of(context)
.pop();
});
_addGatewayOrRoom();
},
),
],
),
),
actions: <Widget>[
FlatButton(
child: Text('Cancel'),
onPressed: () {
setState(() {
Navigator.of(context).pop('Cancel');
});
},
),
Container(
width: 20,
),
FlatButton(
child: Text('Add'),
onPressed: () {
setState(() {
Navigator.of(context).pop('Add');
});
},
),
],
);
},
);
if (res == 'Add') {
await doAddRoom();
_doRefresh();
}