【问题标题】:Flutter, RawKeyboardListener to get text after Enter key pressFlutter,RawKeyboardListener 在 Enter 按键后获取文本
【发布时间】: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

标签: android flutter


【解决方案1】:

在下一个框架滴答之前延迟代码的更强大的方法是WidgetsBinding.instance.scheduleFrameCallback。在这里传递你的闭包而不是 Future.delayed。


也可能值得尝试Shortcuts 类而不是 RawKeyboardListener;关注this example

我刚刚发现了它,通常它似乎可以替代 RawKeyboardListener 来解决很多问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2010-10-08
    • 2018-07-21
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多