#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,
}