Flutter生成PDF报This widget created more than 20 pages错误怎么解决
问题根因
你遇到的报错核心原因是pdf包的MultiPage仅支持对直接传入build方法返回数组的流式独立组件做自动分页,你当前的写法把所有动态内容嵌套封装进了单个Column,外层又套了Wrap,相当于把所有内容变成了一个不可拆分的超大组件,超出包内置的20页渲染保护阈值就会触发报错,放大页面尺寸只是提升了单次可容纳的内容上限,数据量增加后依然会复现问题。
解决方案
把嵌套的整体组件拆分为独立的组件列表,直接传给MultiPage的build方法,让分页逻辑可以自动拆分内容。
修改后代码
1. 调整roundRobinMethod逻辑
import 'dart:io'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart'; class PdfCreatorApi { static Future<File> roundRobinMethod(list, name) async { final pdf = Document(); pdf.addPage(MultiPage( margin: EdgeInsets.all(50), pageFormat: PdfPageFormat.a4, // 直接传入组件列表,不要用Wrap/Column包裹整体 build: (Context context) => buildRoundRobinMethod(list, name), )); return savePdf(name: '$name.pdf', pdf: pdf); }
2. 改写内容构建方法,返回组件列表
static List<Widget> buildRoundRobinMethod(list, name) { // 声明组件列表存储所有内容节点 final List<Widget> content = []; // 添加标题 content.add(Padding( padding: EdgeInsets.only(bottom: 25), child: Center( child: Text("$name ", style: TextStyle( color: PdfColor.fromInt(0xff1e88e5), fontSize: 22))))); // 循环添加每一轮的内容 for (var i = 0; i < list.length; i++) { // 如需保证单轮的标题和比赛不被分页拆分,可把下面两个组件用Unbreakable包裹:content.add(Unbreakable(child: Column(children: [ ... ]))) // 轮次标题 content.add(Container( width: PdfPageFormat.a4.width, padding: EdgeInsets.all(10), color: PdfColor.fromInt(0xfF6F8FA), child: Paragraph( text: 'Round ${list[i]['round']}', textAlign: TextAlign.center, style: TextStyle( fontSize: 18, )))); // 该轮次的比赛列表 content.add(Padding( padding: EdgeInsets.fromLTRB(0, 10, 0, 10), child: Column(children: [ for (var j = 0; j < list[i]['games'].length; j++) Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Paragraph( text: '${list[i]['games'][j]['home']}', textAlign: TextAlign.center, style: TextStyle( fontSize: 18, )), Text(' Vs '), Paragraph( // 原代码笔误修正:第二个参数改为客场队伍字段,可根据实际接口调整 text: '${list[i]['games'][j]['away']}', textAlign: TextAlign.center, style: TextStyle( fontSize: 18, )) ]) ]))); } return content; } }
注意事项
- 如果需要保证某块内容(比如单轮的标题和对应比赛列表)不被分页拆分,用
Unbreakable组件包裹该块内容即可。 - 不要在动态内容外层嵌套无意义的
Wrap、Column组件将所有内容合并为单个整体,会导致分页逻辑失效。
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

