运行zxing2包二维码识别示例时遭遇文件无法打开异常的求助
解决Flutter中zxing2识别二维码时的FileSystemException错误
这个FileSystemException: Cannot open file, path = 'assets/image/download.png'错误的核心原因很明确:你用File类去访问Flutter assets目录里的文件,但assets是打包在应用程序包中的资源,并非设备文件系统上的真实路径,所以File根本找不到它。下面是具体的修复方案:
1. 先确认pubspec.yaml的Assets配置正确
首先要保证你的pubspec.yaml已经正确声明了这个资源文件,否则Flutter打包时不会把它包含进应用:
flutter: assets: # 单个文件声明 - assets/image/download.png # 或者直接声明整个目录(适合多资源场景) - assets/image/
⚠️ 注意:assets字段必须缩进在flutter:下方,缩进要准确(通常是2个空格),否则配置不会生效。改完后记得运行flutter pub get让配置同步。
2. 改用Flutter的Asset加载机制读取文件
替换掉原来用File读取的方式,改用Flutter提供的rootBundle来加载assets资源:
首先补充导入相关包:
import 'dart:io'; import 'package:image/image.dart' as img; import 'package:zxing2/qrcode.dart'; // 新增这个包用于加载assets import 'package:flutter/services.dart';
然后把你的getQRtext改成异步函数(因为assets加载是异步操作):
Future<String> getQRtext() async { // 从assets加载图片的字节数据 final assetBytes = await rootBundle.load('assets/image/download.png'); final imageBytes = assetBytes.buffer.asUint8List(); // 后续的二维码识别逻辑保持不变 var image = img.decodePng(imageBytes)!; LuminanceSource source = RGBLuminanceSource( image.width, image.height, image.getBytes(format: img.Format.abgr).buffer.asInt32List() ); var bitmap = BinaryBitmap(HybridBinarizer(source)); var reader = QRCodeReader(); var result = reader.decode(bitmap); return result.text; }
调用这个函数时需要用await:
// 示例:在StatefulWidget的initState里调用 @override void initState() { super.initState(); _fetchQRContent(); } void _fetchQRContent() async { try { String qrContent = await getQRtext(); print('识别到的二维码内容:$qrContent'); // 这里处理识别结果 } catch (e) { print('识别失败:$e'); } }
3. 额外检查项
- 确认路径和文件名的大小写完全匹配:Android系统区分大小写,如果实际文件是
Download.png但代码里写的是download.png,就会找不到。 - 确认assets目录结构正确:项目根目录下确实存在
assets/image/download.png,没有拼写错误或层级错误。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

