Как я могу обнаружить событие вставки в TextEditingController?

#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 . Но что касается использования postFrameCallback onChanged , я не уверен, что вы можете попробовать.

Ответ №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 символов. На данный момент я изменил логику и добавил кнопку вставить