Flutter Web 未触发 RawKeyDownEvent

RawKeyDownEvent not triggered for Flutter Web

我在我的 Flutter 应用程序中实现了 RawKeyboardListener,它在调试时在 Android 和 Chrome 上完美运行。当 Firebase 托管时,它不会捕获任何按键事件。

RawKeyboardListener(
      autofocus: true,
      focusNode: focusNode,
      onKey: (RawKeyEvent event) {
        if (event.runtimeType.toString() == 'RawKeyDownEvent') {
            //some action
        }
      },
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 10.0, 0, 10.0),
        child: Text(keyedText,
            style: TextStyle(color: Colors.black, fontSize: 40.0)),
      ),
    )

我研究并发现我可以寻找 RawKeyEventDataWeb。更改了 RawKeyEventDataWeb 而不是 RawKeyDownEvent 的代码,但问题是 RawKeyEventDataWeb 上下都听了关键事件,因此输入的任何内容都会出现两次。

我该如何解决?

我不知道解决这个问题的“正确”方法。但这是我想出的解决方法。任何一对 'Up' 和 'Down' 键事件都会在 200 毫秒内触发。所以我使用这个事实来忽略 200 毫秒左右的任何事件。不是最好的解决方案,但有效。

RawKeyboardListener(
      autofocus: true,
      focusNode: focusNode,
      onKey: (RawKeyEvent event) {
        int currentKeyPressTime = DateTime.now().millisecondsSinceEpoch;
        if (event.runtimeType.toString() == 'RawKeyDownEvent' ||
            event.data is RawKeyEventDataWeb &&
                currentKeyPressTime > lastKeyPressTime + 200) {
          lastKeyPressTime = currentKeyPressTime;
          // some action
        }
      },
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 10.0, 0, 10.0),
        child: Text(keyedText,
            style: TextStyle(color: Colors.black, fontSize: 40.0)),
      ),
    ),

记得在之前的某个时间初始化 lastKeyPressTime

使用 Flutter-Web(在我的案例中没有托管 Firebase),key.runtimeType 在调试模式下与在 pre-compiled 代码中不同。这就是它对我有用的方式:

onKey: (key) {
    if (key.runtimeType.toString() == 'RawKeyDownEvent' ||  // debug mode
        key.runtimeType.toString() == 'minified:kW')        // compiled mode
        { ... }