【问题标题】:RawKeyboardListener not working on Flutter for WindowsRawKeyboardListener 在 Flutter for Windows 上不起作用
【发布时间】:2021-11-05 20:38:47
【问题描述】:

我目前正在开发适用于 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 工作。

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

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

谢谢。

【问题讨论】:

    标签: flutter flutter-desktop


    【解决方案1】:

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

    RawKeyboardListener:

    1. 在小部件中添加点击监听,点击时调用:FocusScope.of(context).requestFocus(_focusNode);
    2. RawKeyboardListeneronKey回调中,还添加:FocusScope.of(context).requestFocus(_focusNode);

    FocusNode(感谢that link):

    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 这样的事件(再次查看 that link 以获取更多信息)。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多