Как вызвать метод один раз, когда редактирование текста полностью завершено в flutter TextFormField?

#flutter

#flutter

Вопрос:

В Flutter TextFormField я хочу вызвать метод после полного завершения редактирования, я не хочу вызывать метод, пока пользователь изменяет текст в поле текстовой формы (с помощью прослушивателя или функции onchanged), С помощью функции OnEditingComplete я могу выполнить это требование, но проблема в том, что oneditingcomplete вызывается только при нажатии кнопки готово на клавиатуре, при изменении фокуса после редактирования из одного текстового поля к другому текстовому полю функция onEditingComplete не работает, так каков наилучший способ определить, как только редактирование будет полностью завершено пользователем.

 `TextField(
      onEditingComplete: () {//this is called only when done or ok is button is tapped in keyboard
        print('test');
      },
  

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

1. Может быть, onSubmitted работает лучше? Документация довольно расплывчата, и у меня нет настройки для проверки этого прямо сейчас, так что это всего лишь комментарий 🙂

2. Если вы хотите что-то сделать с размытием (потерей фокуса) текстового поля, взгляните на этот поток github

3. Решение этой проблемы на удивление громоздко, учитывая, насколько она распространена…

Ответ №1:

Использование FocusScopeWidget помогает мне решить эту проблемуhttps://api.flutter.dev/flutter/widgets/FocusNode-class.html,

Когда пользователь нажимает кнопку готово на клавиатуре, вызывается функция onsubmitted и когда пользователь изменяет фокус, используется виджет области фокусировки.

  FocusScope(
    onFocusChange: (value) {
      if (!value) {
       //here checkAndUpdate();
      }
    },
    child: TextFormField(
      key: Key('productSet${DateTime.now().toIso8601String()}'),
      getImmediateSuggestions: true,
      textFieldConfiguration: TextFieldConfiguration(
          onSubmitted: (cal) {
          //here  checkAndUpdate();
          },
  

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

1. Работает при потере фокуса, однако имейте в виду, что для вывода на экран также требуется специальная обработка… Весь этот класс TextField, похоже, не очень хорошо проработан.

Ответ №2:

Используйте TextFormField и какой-то триггер, подобный нажатию кнопки. Используйте глобальный ключ для сохранения состояния формы при сохранении формы

 ...
class _Form extends State<Initialize> {
  final _formKey = GlobalKey<FormState>();//create global key with FormState type
  String _variableValue; //to hold data after save the form
  @override
  Widget build(BuildContext context) {
    return form(
      key: _formkey,
      child: Column(
        children: [
              TextFormField(
                onSaved: (value) {
                  _variableValue= value;
                }
              ),
              OutlineButton.icon(
                onPressed: () {
                  _formKey.currentState.save();//should call this method to save value on _variableValue
                },
                icon: Icon(Icons.plus)
              ),
        ],
      ),
    ),
  }
}
  

удачи

Ответ №3:

Вы можете использовать TextFormField вместо TextField :

 TextFormField(
    decoration: InputDecoration(labelText: 'First Name'),
    onSaved: (val) => setState(() => _firstName = val),
)
  

Реалистичные формы в Flutter

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

1. onsaved не запускается, после завершения редактирования текста, когда я переключаюсь с одного textformfield на другое textfromfield , on saved не запускается