首页 > 解决方案 > 仅在 IOS 上的 StateError (Bad state: No element)

问题描述

此错误不会在 Android 或 Web 上发生,而只会在 IOS 上发生。这似乎很微不足道,但我不知道出了什么问题。

import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'dart:convert';

import 'package:qr_code_scanner/qr_code_scanner.dart';

class ScanQrPage extends StatefulWidget {
  @override
  _ScanQrPageState createState() => _ScanQrPageState();
}

class _ScanQrPageState extends State<ScanQrPage> {
  final qrKey = GlobalKey();

  late QRViewController qrViewController;

  late Barcode barcode;

  // In order to get hot reload to work we need to pause the camera if the platform
  // is android, or resume the camera if the platform is iOS.
  @override
  void reassemble() {
    super.reassemble();
    if (Platform.isAndroid) {
      qrViewController.pauseCamera();
    } else if (Platform.isIOS) {
      qrViewController.resumeCamera();
    }
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        Navigator.of(context).pop("");
        return new Future(() => true);
      },
      child: Scaffold(
        body: Stack(
          children: [
            buildQrView(context),
          ],
        ),
      ),
    );
  }

  Widget buildQrView(BuildContext context) {
    return QRView(
      onQRViewCreated: onQRViewCreated,
      key: qrKey,
      overlay: QrScannerOverlayShape(
          cutOutSize: MediaQuery.of(context).size.width * 0.8),
      onPermissionSet: (ctrl, p) => _onPermissionSet(context, ctrl, p),
    );
  }

  void _onPermissionSet(BuildContext context, QRViewController ctrl, bool p) {
    log('${DateTime.now().toIso8601String()}_onPermissionSet $p');
    if (!p) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('no Permission')),
      );
    }
  }

  @override
  void dispose() {
    qrViewController.dispose();
    super.dispose();
  }

  void onQRViewCreated(QRViewController qrViewController) {
    setState(() {
      this.qrViewController = qrViewController;
    });

    qrViewController.scannedDataStream.listen((event) {
      setState(() {
        this.barcode = event;
        if (Platform.isAndroid) {
          qrViewController.pauseCamera();
        } else if (Platform.isIOS) {
          qrViewController.resumeCamera();
        }
        String rawData = event.code;
        Uri data = Uri.dataFromString(rawData);
        String para1 = data.queryParameters["buy"] ??
            ""; //get parameter with attribute "para1"
        

        Codec<String, String> stringToBase64 = utf8.fuse(base64);
        if (para1 != "") {
          placer = stringToBase64.decode(para1);

        }

        WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
          Navigator.pop(context, placer);
        });

        
      });
    });
  }
}

我已经尝试了所有在 stackoverflow 上发现相同错误的解决方案(addPostFrameCallback 和 Future(Duration.zero)),但它们都不完全相同,似乎无法解决我的问题。

我认为我没有与其他任何问题相同的问题。

异常发生在Navigator.pop(context, placer);

有谁知道如何克服这个问题?

为什么这只发生在IOS上?

标签: iosflutternavigatorflutter-navigation

解决方案


推荐阅读