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

Flutter Web中PDF添加Assets图片失败,程序崩溃求助

解决Flutter Web中pdf包添加Assets图片崩溃的问题

你遇到的崩溃核心原因是在PDF页面的build回调中直接执行了异步操作(await rootBundle.load),而build方法是同步执行的,无法直接容纳异步逻辑。同时需要确认Web环境下的asset路径配置是否正确。

解决步骤:

  1. 确认pubspec.yaml的Assets配置
    确保你的pubspec.yaml已正确声明目标图片路径:

    flutter:
      assets:
        - assets/img/your_image.jpg
    
  2. 提前异步加载图片数据
    在createPDF方法中先完成图片数据的加载,再将数据传入PDF的MemoryImage,避免在同步的build回调中处理异步逻辑。

  3. 调整后的完整代码

    import 'package:flutter/material.dart';
    import 'package:pdf/widgets.dart' as pw;
    import 'package:pdf/pdf.dart';
    import 'dart:typed_data';
    import 'dart:html' as html;
    import 'package:flutter/services.dart';
    
    class PDFSave extends StatefulWidget {
      @override
      _PDFSaveState createState() => _PDFSaveState();
    }
    
    class _PDFSaveState extends State<PDFSave> {
      final pdf = pw.Document();
      var anchor;
    
      savePDF() async {
        Uint8List pdfInBytes = await pdf.save();
        final blob = html.Blob([pdfInBytes], 'application/pdf');
        final url = html.Url.createObjectUrlFromBlob(blob);
        anchor = html.document.createElement('a') as html.AnchorElement
          ..href = url
          ..style.display = 'none'
          ..download = 'pdf.pdf';
        html.document.body?.children.add(anchor);
      }
    
      createPDF() async {
        // 提前异步加载图片数据
        Uint8List? logoBytes;
        try {
          final imageData = await rootBundle.load('assets/img/your_image.jpg');
          logoBytes = imageData.buffer.asUint8List();
        } catch (e) {
          print('图片加载失败: $e');
        }
    
        pdf.addPage(
          pw.Page(
            pageFormat: PdfPageFormat.a4,
            build: (pw.Context context) => pw.Column(
              children: [
                pw.Column(
                  children: [
                    pw.Row(
                      mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
                      children: [
                        pw.Text('Rechnung', style: pw.TextStyle(fontSize: 40)),
                        // 加载成功则显示Logo
                        if (logoBytes != null)
                          pw.Image(
                            pw.MemoryImage(logoBytes),
                            width: 80,
                            height: 80,
                          ),
                        pw.Container(
                          padding: pw.EdgeInsets.all(10),
                          margin: pw.EdgeInsets.all(10),
                          decoration:
                              pw.BoxDecoration(border: pw.Border.all(width: 2)),
                          child: pw.BarcodeWidget(
                            color: PdfColor.fromHex("#000000"),
                            barcode: pw.Barcode.qrCode(),
                            data: "My data",
                            width: 50,
                            height: 50,
                          ),
                        ),
                      ],
                    ),
                    pw.Divider(
                      height: 2,
                      thickness: 2,
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
        savePDF();
      }
    
      @override
      void initState() {
        super.initState();
        createPDF();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.transparent,
          appBar: AppBar(
            title: Text('PDF Creator'),
          ),
          body: Center(
            child: ElevatedButton(
              child: Text('Press'),
              onPressed: () {
                anchor?.click(); // 空安全判断,避免空指针
              },
            ),
          ),
        );
      }
    }
    

关键修改说明:

  • 将图片加载逻辑移到createPDF的异步代码块中,提前获取图片的Uint8List数据
  • 在PDF的build回调中直接使用已加载完成的图片数据,规避同步方法中调用异步操作的冲突
  • 添加异常捕获,便于排查图片加载失败的具体原因
  • 给anchor.click()增加空安全判断,防止未初始化时触发异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:27:01