如何在没有 RawKeyboardListener 的情况下检测颤动中的按键

Lac*_*lan 6 keyboard-events dart flutter

我正在尝试检测抖动中的“Enter”、“Delete”和“Backspace”等按键。我使用 a 的问题RawKeyboardListener是它会将注意力从任何子小部件上移开。

例如

RawKeyboardListener(
  focusNode: _focusNode,
  onKey: handleKey,
  child: TextField()
)
Run Code Online (Sandbox Code Playgroud)

这使得无法同时检测和使用两个按键Textfield

有没有人有检测按键的替代方法。

谢谢

Jos*_*ica 14

Flutter 有一个键盘服务,可以为 Flutter 提供来自硬件键盘的原始按键事件,您也可以要求该服务为您提供按键事件。

这种方法的好处是它不会阻止现有的 Flutter 焦点节点接收事件,因此您不必手动处理键盘事件传播。

您可以像这样向该服务添加侦听器:

import 'package:flutter/services.dart';

ServicesBinding.instance.keyboard.addHandler(_onKey);
Run Code Online (Sandbox Code Playgroud)

...哪里_onKeybool Function(KeyEvent). 这是一个事件处理程序示例:

bool _onKey(KeyEvent event) {
  final key = event.logicalKey.keyLabel;

  if (event is KeyDownEvent) {
    print("Key down: $key");
  } else if (event is KeyUpEvent) {
    print("Key up: $key");
  } else if (event is KeyRepeatEvent) {
    print("Key repeat: $key");
  }

  return false;
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处了解更多信息:https://api.flutter.dev/flutter/services/HardwareKeyboard/addHandler.html

请注意,此事件处理程序将始终接收按键事件,即使文本框当前处于焦点状态也是如此。


以下是在小部件中使用此技术的示例:

import 'package:flutter/services.dart';

// ...

class MyApp extends StatefulWidget {
  // ...
}

class _MyAppState extends State<MyApp> {
  // ...

  bool _onKey(KeyEvent event) {
    final key = event.logicalKey.keyLabel;

    if (event is KeyDownEvent) {
      print("Key down: $key");
    } else if (event is KeyUpEvent) {
      print("Key up: $key");
    } else if (event is KeyRepeatEvent) {
      print("Key repeat: $key");
    }

    return false;
  }

  @override
  void initState() {
    super.initState();
    ServicesBinding.instance.keyboard.addHandler(_onKey);
  }

  @override
  void dispose() {
    ServicesBinding.instance.keyboard.removeHandler(_onKey);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 4

您可以使用 dart_html 中的以下内容:

    window.onKeyPress.listen((KeyboardEvent e) {
      print(e.charCode.toString() + " " + new String.fromCharCode(e.charCode));
    });
Run Code Online (Sandbox Code Playgroud)