我需要使用箭头键在PageView页面之间移动,这是我用KeyboardListener实现的。但是,有些页面可能包含TextInput,如果TextInput是焦点,我希望阻止KeyboardListener处理箭头键。我能想到的唯一解决方案是在TextInput获得焦点时设置一些标志,并限制箭头逻辑,但这看起来一点也不优雅(因为KeyboardListener位于Widget树的上游,我需要将该逻辑连接到每个TextInput)。有更好的办法吗?
PageView
KeyboardListener
TextInput
2ledvvac1#
最后我做了这个:1.扩展FocusNode,使其具有指示应忽略给定Widget全局键盘事件的类:
FocusNode
class IgnoreShortcutKeysFocusNode extends FocusNode {}
1.在包含TextInput的小部件中,我首先创建扩展的IgnoreShortcutKeysFocusNode并将其分配给TextInput:
IgnoreShortcutKeysFocusNode
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,但它可以工作。
1条答案
按热度按时间2ledvvac1#
最后我做了这个:
1.扩展
FocusNode
,使其具有指示应忽略给定Widget全局键盘事件的类:1.在包含
TextInput
的小部件中,我首先创建扩展的IgnoreShortcutKeysFocusNode
并将其分配给TextInput
:1.在
KeyboardListener
处理程序中,我检查当前的焦点节点并相应地执行操作:这并不理想,因为必须将
IgnoreShortcutKeysFocusNode
添加到每个TextInput
,但它可以工作。