gpt4 book ai didi

android - Flutter RawKeyboardListener 听两次?

转载 作者:IT王子 更新时间:2023-10-29 06:36:09 26 4
gpt4 key购买 nike

我想要实现的是,当查看此小部件时,RawKeyboardListenerTextField 未被选中/处于焦点时立即开始监听。它运行 HandleKey 函数 来处理我想用 keyCode 做的事情。

我遇到的问题是第一次运行该应用程序时,handleKey 函数 似乎运行了两次。因此,在下面的示例中,当我只输入 1 个键时,它会打印 why does this run twice $_keyCode TWICE。我认为它听 keyUp 和 keyDown。我想要的结果是它只运行一次...

但是,当我选择 TextField 并使用模拟器键盘进行常规提交时,代码也能正常工作。

我很难理解为什么只有在与 TextField 交互后才会出现问题。我觉得它需要一个 Futureawait 某处?但我不知道。

请帮忙。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';

class KeyboardListener extends StatefulWidget {

KeyboardListener();

@override
_RawKeyboardListenerState createState() => new _RawKeyboardListenerState();
}

class _RawKeyboardListenerState extends State<KeyboardListener> {

TextEditingController _controller = new TextEditingController();
FocusNode _textNode = new FocusNode();


@override
initState() {
super.initState();
}

//Handle when submitting
void _handleSubmitted(String finalinput) {

setState(() {
SystemChannels.textInput.invokeMethod('TextInput.hide'); //hide keyboard again
_controller.clear();
});
}

handleKey(RawKeyEventDataAndroid key) {
String _keyCode;
_keyCode = key.keyCode.toString(); //keycode of key event (66 is return)

print("why does this run twice $_keyCode");
}

_buildTextComposer() {
TextField _textField = new TextField(
controller: _controller,
onSubmitted: _handleSubmitted,
);

FocusScope.of(context).requestFocus(_textNode);

return new RawKeyboardListener(
focusNode: _textNode,
onKey: (key) => handleKey(key.data),
child: _textField
);
}


@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text("Search Item")),
body: _buildTextComposer(),
);
}
}

最佳答案

您的回调正在为具有以下类实例的 keydown 和 keyup 事件调用:

  • 原始按键按下事件
  • 原始键更新事件

您可以将整个对象传递给 handleKey,并根据对象的运行时类型进行过滤。例如

  handleKey(RawKeyEvent key) {
print("Event runtimeType is ${key.runtimeType}");
if(key.runtimeType.toString() == 'RawKeyDownEvent'){
RawKeyEventDataAndroid data = key.data as RawKeyEventDataAndroid;
String _keyCode;
_keyCode = data.keyCode.toString(); //keycode of key event (66 is return)

print("why does this run twice $_keyCode");
}
}

_buildTextComposer() {
TextField _textField = new TextField(
controller: _controller,
onSubmitted: _handleSubmitted,
);

FocusScope.of(context).requestFocus(_textNode);

return new RawKeyboardListener(
focusNode: _textNode,
onKey: handleKey,
child: _textField
);
}

如果这仍然没有帮助,请检查从 handleKey 方法记录的实际运行时类型,并根据这些进行过滤。

关于android - Flutter RawKeyboardListener 听两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50985342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com