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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:10:13