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

Flutter 从JSON导出PDF时JSON数据获取报错、导出后无显示如何修复?

修复方案

一、JSON数据获取报错修复

  • 补充网络权限配置
    Android端在android/app/src/main/AndroidManifest.xml中加入网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
    iOS端在ios/Runner/Info.plist中加入网络请求白名单配置:
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    
  • 新增网络请求与JSON解析的异常捕获,以及状态码判断:
    原代码没有处理请求失败、响应状态码异常、JSON结构不匹配的情况,会直接触发崩溃
  • 适配空安全,给User类字段添加默认值或设为可空,避免JSON字段为空时抛出类型异常

二、PDF内容不显示修复

  • 原代码仅完成了数据解析,没有把数据写入PDF文档,也没有执行PDF文件的本地存储逻辑,需要补充PDF组件构建、文档保存的代码
  • 如果PDF需要展示中文字符,需要手动引入中文字体文件并注册到PDF主题中,否则中文会显示为空白

修复后参考代码

import 'dart:io';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:path_provider/path_provider.dart';

class User {
  final int id;
  final String name;
  final String position;

  User({
    required this.id,
    required this.name,
    required this.position,
  });

  // 解析时添加默认值避免空值报错
  factory User.fromMap(Map<String, dynamic> json) => User(
        id: json["id"] ?? 0,
        name: json["name"] ?? '',
        position: json["position"] ?? '',
      );
}

class PdfApi {
  static Future<File> generateTable() async {
    try {
      var url = Uri.parse('你的接口地址');
      var response = await http.get(url);
      // 判断请求是否成功
      if (response.statusCode != 200) {
        throw Exception('接口请求失败,状态码:${response.statusCode}');
      }
      final jsonData = json.decode(response.body);
      // 适配JSON外层结构,若你的接口返回数据是包裹在data字段中,改为jsonData['data']
      List userList = jsonData is List ? jsonData : jsonData['data'];
      final List<User> data = userList.map<User>((json) => User.fromMap(json)).toList();

      final pdf = pw.Document();
      final headers = ['id', 'name', 'position'];
      // 把数据转换为PDF Table需要的二维数组格式
      final tableData = data.map((user) => [user.id, user.name, user.position]).toList();

      // 把表格添加到PDF页面
      pdf.addPage(pw.Page(
        build: (pw.Context context) {
          return pw.Table.fromTextArray(
            headers: headers,
            data: tableData,
          );
        },
      ));

      // 保存PDF到本地临时目录
      final output = await getTemporaryDirectory();
      final file = File("${output.path}/user_list.pdf");
      await file.writeAsBytes(await pdf.save());
      return file;
    } catch (e) {
      rethrow;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:45:03