Предотвратите появление пузырьков на клавиатуре (распространение на родителей) во время флаттера

#flutter #events #keyboard #event-propagation

Вопрос:

Я использую RawKeyboardListener для обнаружения ключа escape для закрытия (всплывающих) окон, но я не могу использовать событие и предотвратить его пузырение (распространение) на родительские окна, поэтому все родительские окна получат escape и закроются!

Я попробовал использовать элемент фокусировки, и он тоже включен, но разницы нет.

 return Scaffold(
  body: RawKeyboardListener(
    focusNode: FocusNode(),
    onKey: (RawKeyEvent event) {
      if (event.logicalKey == LogicalKeyboardKey.escape) {
      Navigator.pop(context);
    }},
    autofocus: true,
    child: Container(
      child: Text("blah blah")
      ),
    ),
  ),
);
 

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

1. «Я использую RawKeyboardListener для обнаружения ключа escape» — ваш код никак не обнаруживает ключ escape: вы вызываете pop() метод безоговорочно

2. просто опечатка в вопросе, обновил его, спасибо.

3. события не всплывают в родительском окне (странице): теперь ваш onKey вызывается дважды (для нажатия клавиши вниз и вверх).

4. Да, он пузырился, я добавил бревна.

Ответ №1:

вы можете прикрепить прослушиватель ключей к узлу фокуса. Этот прослушиватель вернет перечисление KeyEventResult, которое определяет, обработано ключевое событие или нет

    var focus = FocusNode(onKey: (FocusNode node, RawKeyEvent event) {
      if (event.logicalKey == LogicalKeyboardKey.escape)
      {
        return KeyEventResult.handled;
      }
      return KeyEventResult.ignored;
    });
 

Также здесь приведено описание ключевого события :

 /// An enum that describes how to handle a key event handled by a
/// [FocusOnKeyCallback].
enum KeyEventResult {
  /// The key event has been handled, and the event should not be propagated to
  /// other key event handlers.
  handled,
  /// The key event has not been handled, and the event should continue to be
  /// propagated to other key event handlers, even non-Flutter ones.
  ignored,
  /// The key event has not been handled, but the key event should not be
  /// propagated to other key event handlers.
  ///
  /// It will be returned to the platform embedding to be propagated to text
  /// fields and non-Flutter key event handlers on the platform.
  skipRemainingHandlers,
}