flutter 当焦点在TextField中时,如何禁用KeyboardListener?

64jmpszr  于 2023-02-05  发布在  Flutter
关注(0)|答案(1)|浏览(184)

我需要使用箭头键在PageView页面之间移动,这是我用KeyboardListener实现的。但是,有些页面可能包含TextInput,如果TextInput是焦点,我希望阻止KeyboardListener处理箭头键。
我能想到的唯一解决方案是在TextInput获得焦点时设置一些标志,并限制箭头逻辑,但这看起来一点也不优雅(因为KeyboardListener位于Widget树的上游,我需要将该逻辑连接到每个TextInput)。
有更好的办法吗?

2ledvvac

2ledvvac1#

最后我做了这个:
1.扩展FocusNode,使其具有指示应忽略给定Widget全局键盘事件的类:

class IgnoreShortcutKeysFocusNode extends FocusNode {}

1.在包含TextInput的小部件中,我首先创建扩展的IgnoreShortcutKeysFocusNode并将其分配给TextInput

final _focusNode = IgnoreShortcutKeysFocusNode();

@override
Widget build(BuildContext context) {
  return TextField(
    focusNode: _focusNode,
    // ...
  );
}

1.在KeyboardListener处理程序中,我检查当前的焦点节点并相应地执行操作:

void _handleKeyEvent(KeyEvent value) {
  if (FocusManager.instance.primaryFocus is IgnoreShortcutKeysFocusNode) return;
  // arrow key handling
}

这并不理想,因为必须将IgnoreShortcutKeysFocusNode添加到每个TextInput,但它可以工作。

相关问题