Flutter 从JSON导出PDF时JSON数据获取报错、导出后无显示如何修复?
修复方案
一、JSON数据获取报错修复
- 补充网络权限配置
Android端在android/app/src/main/AndroidManifest.xml中加入网络权限:
iOS端在<uses-permission android:name="android.permission.INTERNET" />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
相关产品推荐
相关产品推荐

