Flutter调用createPDF无响应求助(安卓真机模拟)
解决Flutter点击按钮生成PDF无响应的问题
问题定位
你的代码存在几个关键问题,导致调用createPDF后无任何反馈:
1. 路径拼接错误
File('${path}my_resume.pdf')中,路径与文件名之间缺少路径分隔符,会生成无效的文件路径,直接导致文件无法创建和写入。
2. 未捕获异常
异步函数createPDF没有异常捕获逻辑,执行过程中的错误(比如路径无效、字体加载失败)会被静默吞掉,无法定位问题根源。
3. 字体资源可能未配置
如果assets/fonts/Poppins/Poppins-Italic.ttf没有在pubspec.yaml中正确声明,会导致字体加载失败,中断PDF生成流程。
修复后的完整代码
import 'dart:typed_data'; import 'dart:io'; // 必须导入io库,否则File类无法使用 import 'package:flutter/services.dart'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; import 'package:pdf/widgets.dart' as pw; class PdfView { PdfView(); static Future<void> createPDF() async { // 改为返回Future<void>,方便外部处理异步逻辑 try { String path = (await getApplicationDocumentsDirectory()).path; // 修复路径分隔符问题 File file = File('$path/my_resume.pdf'); // 加载字体资源 final font = await rootBundle.load("assets/fonts/Poppins/Poppins-Italic.ttf"); final ttf = pw.Font.ttf(font); // 构建PDF内容 final pdf = pw.Document(); pdf.addPage(_addPage(font: ttf, size: 50)); // 写入文件并打开 Uint8List bytes = await pdf.save(); await file.writeAsBytes(bytes); // 先确认文件存在再打开 if (await file.exists()) { await OpenFile.open(file.path); } else { print("文件创建失败,路径:${file.path}"); } } catch (e) { // 打印异常信息,快速排查问题 print("生成PDF出错:$e"); } } static pw.Page _addPage({required pw.Font font, required double size}) { pw.TextStyle style = pw.TextStyle(font: font, fontSize: size); return pw.Page( build: (pw.Context context) { return pw.Center( child: pw.Text('Hello World!', style: style), ); }, ); } }
额外检查项
- 确保在
pubspec.yaml中正确声明字体资源:assets: - assets/fonts/Poppins/Poppins-Italic.ttf - 按钮绑定方式要正确:
ElevatedButton( onPressed: () async { await PdfView.createPDF(); }, child: const Text('生成PDF'), ) - 安卓模拟器可通过设备文件管理器查看
/data/data/你的应用包名/app_flutter/目录,确认PDF是否生成。
内容的提问来源于stack exchange,提问作者khalid maria
相关产品推荐
相关产品推荐

