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
{ ... }
我在我的 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
{ ... }