#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),
)
Комментарии:
1. onsaved не запускается, после завершения редактирования текста, когда я переключаюсь с одного textformfield на другое textfromfield , on saved не запускается