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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:00