Трепетание: разница в текстовом поле между onEdittingComplete и onSubmitted

#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,
)
  

ДЕМОНСТРАЦИЯ:

демонстрационный GIF

Комментарии:

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 — это своего рода механизм обратного вызова, который сообщает нам, что редактирование текста завершено, и теперь мы можем использовать это значение.