#flutter
Вопрос:
У меня есть TextEditingController, который предназначен для телефонных номеров. Если в него вставлен текст, мне нужно обработать и изменить его, обрезав пробелы и т. Д. Но этого не должно произойти, если пользователь вводит пробелы. Как я могу различать эти два типа событий и вызывать свою функцию только тогда, когда пользователь вставляет текст в поле?
В настоящее время мой код выглядит так и использует onChanged
. Я ищу что-то вроде onPaste:
String getCorrectedPhone(String phone) {
phone = phone.replaceAll(RegExp(r"s "), "");
return phone;
}
FormBuilderTextField(
controller: _phoneController,
name: "phone",
onChanged: (String txt) {
print('Phone field changed! Is now $txt');
_phoneController.text = getCorrectedPhone(txt);
},
),
Комментарии:
1. если бы это была сеть, я бы сказал, используйте
LogicalKeySet
. Но что касается использования postFrameCallbackonChanged
, я не уверен, что вы можете попробовать.
Ответ №1:
Вы можете сделать что — то вроде объявления длины с помощью поля номер телефона и добавить прослушиватель в контроллер редактирования текста или в OnChanged, который проверяет, является ли его длина-старая длина >1. Затем его наклеили
int length = 0;
...
_phoneController.addListener((){
if (abs(textEditingController.text.length - length)>1){
// Do your thingy
}
length = _phoneController.length;
});
Таким образом, есть еще один способ-игнорировать любые прикосновения к текстовому полю с помощью виджета IgnorePointer, а затем использовать детектор жестов для реализации пользовательских длинных и коротких нажатий. Для длинных нажатий вам придется создать свое собственное небольшое всплывающее меню для копирования, вырезания, вставки и прочего. Вот несколько примеров кода для пользовательского интерфейса. Что касается функционирования, я бы рекомендовал использовать https://api.flutter.dev/flutter/services/Clipboard-class.html класс флаттера. Если вам нужна какая-либо помощь в этом, дайте мне знать, но это должно быть в основном просто
Комментарии:
1. Для обнаружения изменения длины, OnChanged, который я использую, уже работает нормально. Что я ищу, так это специально проверить, произошло ли событие вставки, как это можно сделать для html
2. Поэтому просто добавьте код вместо прослушивателя в OnChanged, и он будет работать. Прошлое событие может быть обнаружено, если его длина увеличивается более чем на 1
3. Вопрос конкретно касается обнаружения вставки в буфер обмена, а не определения того, изменилось поле или нет.
4. Но в этом случае, если поле изменяется более чем на 2 буквы за одно обновление, это означает, что пользователь что-то вставил. На самом деле это не прямое решение, а обходной путь. Но это работает практически во всех сценариях, которые я тестировал до сих пор. Если бы пользователь печатал, это изменило бы не более одной буквы за обновление. Я добавил еще один способ, который немного более прямой
5. Ах.. Это может сработать в моем случае, так как я ожидаю вставки телефонных номеров, которые содержат не менее 5 символов. На данный момент я изменил логику и добавил кнопку вставить