Как предотвратить исчезновение PopupMenu, когда я нажимаю пробел в текстовом поле в нем во Flutter Web? - PullRequest
0 голосов
/ 12 июля 2020

Вот фрагмент кода в PopupMenuButton (во Flutter Web):

PopupMenuButton(
   offset: Offset(100, 100),
   elevation: 5.0,
   child: ListTile(
   dense: true,
   leading: Icon(
      Icons.filter_vintage,
      size: 16,
     ),
   title: Text('Menu'),

   itemBuilder: (context) => [
       PopupMenuItem(child: Container(
           padding: EdgeInsets.all(20.0),
           child: TextField(
              autofocus: true,
              cursorColor: kLeadingOrangeColor,
              style: kFilterButtonTextStyle,      
              onChanged: (input) => searchNameString = input,
              onEditingComplete: onEditingCompleteCallBack,
              controller: searchController,
         )),
       ]),

Тогда вот короткая запись. Обратите внимание, что PopupMenu исчезает, когда я нажимаю

введите описание изображения здесь

Проблема в том, что каждый раз, когда я нажимаю клавишу пробела, PopupMenu исчезает. Мне нужно, чтобы PopupMenu сохранялось, пока я не нажал или не щелкнул где-нибудь еще. Кто-нибудь знает, в чем может быть проблема?

Вот мой flutter doctor:

[✓] Flutter (Channel master, 1.20.0-7.0.pre, on Mac OS X 10.15.5 19F101, locale en-US)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.47.0)
[✓] Connected device (2 available)

• No issues found!

1 Ответ

1 голос
/ 13 июля 2020

Я нашел решение.

Проблема связана с методом handleTap в классе PopupMenuItem.

 @protected
  void handleTap() {
    Navigator.pop<T>(context, widget.value);
  }

Итак, я сделал следующее:

  1. Скопируйте весь класс PopupMenuItem
  2. Переименуйте его во что-нибудь другое. (например: TextFieldPopupMenuItem)
  3. Измените метод handleTap на:
 @protected
  void handleTap() {}
Используйте этот новый класс для текстовых полей.

Тогда он работает!

Я думаю, это из-за абстракции того, что мы можем поместить внутрь PopupMenuItem, это трудно определить, какие исходные данные можно предпринять, чтобы отклонить его. Однако, поскольку я использую жесткую клавиатуру, я думаю, что она не должна определять ее как «касание», но, возможно, это зависит от команды Flutter.

В любом случае, эта работа работает.

Надеюсь, это кому-то поможет.

...