0

我目前正在开发适用于 Windows 的 Flutter 应用程序,并尝试检测键盘输入(如空格、箭头、回车...)。

为此,我RawKeyboardListener在我的小部件中使用:

class _WaveformWidgetState extends State<WaveformWidget>
{

  FocusNode _focusNode = FocusNode();

  @override
  Widget build(BuildContext context)
  {
    return RawKeyboardListener(
      autofocus: true,
      focusNode: _focusNode,
      onKey: (event) {
        if (event.isKeyPressed(LogicalKeyboardKey.enter))
        {
          print("value : enter");
        }
      },
      child: Container(...),
    );
  }
}

问题是:该小部件位于另一个小部件内部,该小部件包含一个表单,带有多个TextFormFields按钮等。

正因为如此,似乎以TextFormFields某种方式保持焦点并阻止我RawKeyboardListener工作。

所以我尝试通过FocusScope.of(context).requestFocus(_focusNode);build()该小部件的方法中添加,但现在TextFormFields当我点击它们时我总是失去焦点。很确定这是一个与焦点相关的问题,但我不知道如何处理它。

那么如何在不影响表单的情况下正确收听当前小部件中的原始键盘事件?

谢谢。

4

1 回答 1

0

好的,所以我找到了 2 个解决我的问题的方法:

RawKeyboardListener

  1. 在小部件中添加一个点击监听器,当点击时,调用:FocusScope.of(context).requestFocus(_focusNode);
  2. 在 的onKey回调中RawKeyboardListener,还添加:FocusScope.of(context).requestFocus(_focusNode);

使用FocusNode(感谢该链接):

class _WaveformWidgetState extends State<WaveformWidget>
{
  FocusNode _focusNode = FocusNode();
  late FocusAttachment _focusAttachment;
  
  @override
  void initState()
  {
    super.initState();
    _focusAttachment = _focusNode.attach(context, onKeyEvent: (node, event) {
      if (event.logicalKey == LogicalKeyboardKey.enter)
      {
        print("value : enter");
      }
      return KeyEventResult.handled;
    });
    _focusNode.requestFocus();
  }

  @override
  void dispose()
  {
    _focusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context)
  {
    _focusAttachment.reparent();
    return Container(...);
  }
}

我个人更喜欢第二种解决方案,因为它似乎工作得很好,并且还允许您轻松处理像 shift+click 这样的事件(再次检查该链接以获取更多信息)。

于 2021-09-09T08:40:55.483 回答