You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用qr_flutter生成批量QR Code后如何打包保存为zip文件

解决方案

1. 添加依赖

在pubspec.yaml中添加zip处理依赖,你已有的依赖不用修改,新增如下项:

dependencies:
  archive: ^3.6.1 # 核心压缩库
  # 如需直接分享zip包,可新增以下依赖
  share_plus: ^7.2.2

执行flutter pub get安装依赖。

2. 新增zip打包工具方法

import 'package:archive/archive_io.dart';
import 'package:path_provider/path_provider.dart';

// 传入二维码文件路径列表和自定义的压缩包名,返回压缩包本地路径
Future<String> packQrToZip(List<String> qrFilePaths, String zipName) async {
  // 初始化压缩包对象
  final archive = Archive();

  // 遍历所有二维码文件,添加到压缩包
  for (final path in qrFilePaths) {
    final file = File(path);
    if (await file.exists()) {
      final bytes = await file.readAsBytes();
      // 取原文件名作为压缩包内的文件名
      final fileName = path.split('/').last;
      archive.addFile(ArchiveFile(fileName, bytes.length, bytes));
    }
  }

  // 编码为zip格式
  final zipBytes = ZipEncoder().encode(archive);
  // 生成压缩包存储路径,这里存在应用文档目录,可自行修改
  final docDir = await getApplicationDocumentsDirectory();
  final zipPath = '${docDir.path}/$zipName.zip';
  // 写入压缩包到本地
  await File(zipPath).writeAsBytes(zipBytes!);
  return zipPath;
}

3. 修改按钮触发逻辑

你原本的逻辑只需要新增路径收集、打包的步骤即可,无需修改原有createQrPic实现:

CupertinoButton.filled(
   child: const Text('Get QR Code'),
   onPressed: () async {
        List<String> qrPaths = [];
        // 1. 批量生成二维码,收集所有文件路径
        for (int i = 1; i <= 3; i++) {
            String path = await createQrPic('ID1B$i');
            qrPaths.add(path);
            print('QR $i 生成完成');
        }
        // 2. 打包为zip
        String zipPath = await packQrToZip(qrPaths, '批量二维码');
        print('压缩包生成完成:$zipPath');
        // 3. 后续操作二选一即可
        // 选项1:保存压缩包到相册/本地
        await GallerySaver.saveImage(zipPath);
        // 选项2:直接分享压缩包
        // await Share.shareXFiles([XFile(zipPath)], text: '批量二维码压缩包');
   },
)

4. 权限适配(可选)

如果需要将压缩包保存到系统相册/公共目录,需要提前配置权限:

  • iOS:在Info.plist中新增相册写入权限描述:
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要访问相册保存二维码压缩包</string>
    
  • Android:在android/app/src/main/AndroidManifest.xml中新增存储权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 安卓13及以上额外配置 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    

内容的提问来源于stack exchange,提问作者Zaie Hilmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:03