ios - 仅在 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上?
解决方案
推荐阅读
- android - 带有JSON正文的Android Studio中的Google Volley POST请求?
- istio - 使用 envoy,在 nginx 中使用集群 IP 和 fqdn 作为 proxy_pass 的地址有什么不同?
- go - 区分串行端口上的超时或丢失连接
- android - Intent.ACTION_DIAL 在某些手机上跳过国际号码上的 +
- java - 如何从我的 android 应用程序在本地 android 设备上以 csv 格式导出和保存数据?
- c++ - 如何从数组 B 中删除不必要的元素,以便只留下重复的数字
- javascript - 保持局部变量反应
- django - 在管理面板中更改设置的模型字段
- maven - 我可以在不重新构建的情况下对构建的 maven 中的文件进行更改吗?
- marten - 使用 ASP.Net Core 连接到 2 个不同的 MartenDB 数据存储