Flutter qr_code_scanner 关于成功扫描数据更新导航?

use*_*054 3 dart flutter

这是一个小部件,具有每次我们扫描二维码时触发的功能。

  import 'package:qr_code_scanner/qr_code_scanner.dart';

 @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Column(
            children: <Widget>[
              Expanded(
                flex: 4,
                child: QRView(
                  key: qrKey,
                  onQRViewCreated: _onQRViewCreated,
                  overlay: QrScannerOverlayShape(
                    borderColor: Colors.red,
                    borderRadius: 10,
                    borderLength: 30,
                    borderWidth: 10,
                    cutOutSize: 300,
                  ),
                ),
              ),
Run Code Online (Sandbox Code Playgroud)

在功能上,我想导航到下一个屏幕。

  void _onQRViewCreated(QRViewController controller) {
    this.controller = controller;
    controller.scannedDataStream.listen((scanData) {
           Navigator.push(
           context,
          MaterialPageRoute(builder: (context) => SecondRoute()),
         );
    });
  }
Run Code Online (Sandbox Code Playgroud)

这里的问题是,监听事件触发多次,第一次成功扫描数据后是否可以停止此功能?我试试

controller.scannedDataStream.first;
Run Code Online (Sandbox Code Playgroud)

但是在扫描真实数据时返回空字符串并且不会触发。

我需要点击 40 次才能从第二条路线返回到 QR 扫描仪小部件。谢谢!

Tim*_*iev 7

如果有人仍然遇到这个问题,请尝试这个解决方案:)它对我来说效果很好!

onQRViewCreated: (QRViewController qrViewController) {
        this.qrViewController = qrViewController;
        qrViewController.scannedDataStream.listen((qrData) {
          qrViewController.pauseCamera();
          final String qrCode = qrData.code;
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => SecondPage(
                        qrCode: '$qrCode',
                      ))).then((value) => qrViewController.resumeCamera());
        });
      }
Run Code Online (Sandbox Code Playgroud)


小智 6

为了将来参考,我发现暂停相机效果更好:)

void _onQRViewCreated(QRViewController controller) {
this.controller = controller;
controller.scannedDataStream.listen((scanData) {
    qrText = scanData;
    SecondPageRoute();
   });
 }


SecondPageRoute() async {
       controller?.pauseCamera();
       var value = await Navigator.push(context,
           MaterialPageRoute(builder: (context) {
             return SecondPage(qrText);
           })).then((value) => controller.resumeCamera());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您只需添加一个哨兵即可

void _onQRViewCreated(QRViewController controller) {
    this.controller = controller;
    bool scanned = false;
    controller.scannedDataStream.listen((scanData) {
      if (!scanned) {
        scanned = true;
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondRoute()),
        );
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

  • 对我有用!非常感谢,我现在可以使用参数弹出导航器 (2认同)