Flutter Web中PDF添加Assets图片失败,程序崩溃求助
解决Flutter Web中pdf包添加Assets图片崩溃的问题
你遇到的崩溃核心原因是在PDF页面的build回调中直接执行了异步操作(await rootBundle.load),而build方法是同步执行的,无法直接容纳异步逻辑。同时需要确认Web环境下的asset路径配置是否正确。
解决步骤:
确认pubspec.yaml的Assets配置
确保你的pubspec.yaml已正确声明目标图片路径:flutter: assets: - assets/img/your_image.jpg提前异步加载图片数据
在createPDF方法中先完成图片数据的加载,再将数据传入PDF的MemoryImage,避免在同步的build回调中处理异步逻辑。调整后的完整代码
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
相关产品推荐
相关产品推荐

