#flutter #dart
#трепетание #дротик
Вопрос:
Я пытаюсь выяснить разницу между onEdittingComplete
и onSubmitted
, я не знаю, когда следует использовать последнее, поскольку первое можно использовать для переключения фокуса или отправки содержимого формы.
Я попытался заглянуть в документацию, но там мало что сказано о onSubmitted
свойстве.
Ответ №1:
onSubmitted
Как следует из названия, он вызывается, когда пользователь заканчивает редактирование, например, нажимает «готово» или «отправить» на клавиатуре. Обратный вызов удобно передает вам значение, чтобы вы могли использовать его для своей бизнес-логики. В то же время, поскольку Flutter предполагает, что пользователь «закончил», он скроет экранную клавиатуру.
onEditingComplete
Это скорее «К вашему сведению», который сообщает вам, что пользователь закончил редактирование. Он запускается раньше onSubmitted
. Он не передает вам значение (хотя технически вы можете получить значение с помощью контроллера, это не является намерением здесь), потому что вы все еще можете обрабатывать бизнес-логику, связанную со значением, в onSubmitted
. Оба события будут запущены в любом случае.
Реальная цель, стоящая за этим onEditingComplete
, заключается в том, что в реализации по умолчанию Flutter скрывает экранную клавиатуру, когда действие клавиатуры считается «действием завершения», таким как «готово», «перейти», «отправить» или «поиск», но не скрывает клавиатуру, если действие «незавершено», например «следующее» или «предыдущее». (Действие клавиатуры указано в свойстве TextField
виджета textInputAction
.)
Если вам не нравится такое поведение, вы можете переопределить его. Например, «отправить» здесь считается «действием завершения», поэтому в приложении для обмена мгновенными сообщениями (в чате) каждый раз, когда пользователь отправляет короткое сообщение, клавиатура будет свернута, это нехорошо. Но если мы переопределим onEditingComplete
обратный вызов пустой функции, это остановит поведение по умолчанию и не скроет клавиатуру. Например:
TextField(
controller: _controller,
onSubmitted: (text) {
sendMessage(text);
_controller.clear();
},
onEditingComplete: () {}, // do not hide keyboard
textInputAction: TextInputAction.send,
)
ДЕМОНСТРАЦИЯ:
Комментарии:
1. существует также свойство onFieldSubmitted
2. @Ced это одно и то же, api.flutter.dev/flutter/material/TextFormField/…
Ответ №2:
onSubmitted:
final ValueChanged<String> onSubmitted
Он возвращает TextField
введенное значение в onSubmitted
обратном вызове, большую часть времени оно используется для кнопки следующего / предыдущего поля клавиатуры при использовании TextInputAction.next
и TextInputAction.previous
для textInputAction
выполнения.
onEditingComplete:
final VoidCallback onEditingComplete
Это похоже на onSubmitted
, но не возвращает значение внутри обратного вызова, вместо этого он обновляет текст controller
, и затем мы можем извлечь значение из controller
того, что когда-либо требовалось.
Комментарии:
1. вместо этого он обновляет текстовый контроллер разве контроллер не обновляется автоматически каждый раз, когда вводится или удаляется символ?
2. Я думаю, что textController делает это, но onEditingComplete — это своего рода механизм обратного вызова, который сообщает нам, что редактирование текста завершено, и теперь мы можем использовать это значение.