【发布时间】:2020-03-05 14:59:56
【问题描述】:
我有一个颤振应用程序,我需要在将条形码扫描到 TextFormField 后查找详细信息(使用物理 Android 移动设备)。扫描仪只是将条形码作为键盘输入发送(末尾带有“\n”)。
我正在使用 RawKeyboardListener,当我手动输入文本并按 Enter 时它工作正常,但是,扫描仪以更高的速率发送击键,并且当 Enter 键到达 RawKeyboardListener 时 TextEditingController 仍然为空。
我目前正在使用 Future.delayed 在尝试阅读文本之前等待 500 毫秒,这很有效,但我不太喜欢这个解决方案(太脆弱):
handleKey(RawKeyEvent event) {
var isEnter = event.logicalKey.keyId == LogicalKeyboardKey.enter.keyId || event.logicalKey.keyId == 1108101563381;
if (event.runtimeType.toString() == 'RawKeyDownEvent' && isEnter) {
print('- Text: ' + _textController.text); <--- Empty here
Future.delayed(const Duration(milliseconds: 500), () {
print('- Text after delay: ' + _textController.text); <--- '013803266986' here
});
}
}
我的问题:在 Enter 键后获取扫描的条形码(文本)的更稳健的方法是什么?
这是一个完整的可运行示例:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TextEditingController _textController = new TextEditingController();
FocusNode _textNode = new FocusNode();
handleKey(RawKeyEvent event) {
var isEnter = event.logicalKey.keyId == LogicalKeyboardKey.enter.keyId || event.logicalKey.keyId == 1108101563381;
if (event.runtimeType.toString() == 'RawKeyDownEvent' && isEnter) {
print('- Text: ' + _textController.text);
Future.delayed(const Duration(milliseconds: 500), () {
print('- Text after delay: ' + _textController.text);
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SizedBox(
width: double.infinity,
height: 300,
child: RawKeyboardListener(
focusNode: FocusNode(),
onKey: (event) => handleKey(event),
child: TextFormField(
controller: _textController,
focusNode: _textNode,
),
),
),
),
);
}
}
注意:这个方法对我不起作用(因为它会使文本字段变大):Detect 'enter key' press in flutter
【问题讨论】:
-
我将撤回我的答案,因为它不能解决您的问题。但是,我建议您使用问题跟踪的链接更新问题,并说明您正在寻找解决方法,因为 api 有一个错误,而不是它应该工作的官方方式。
-
RawKeyboardListener 在与 TextField 一起使用时似乎存在焦点问题。这是 GitHub 上的一个未解决问题 github.com/flutter/flutter/issues/67915