Flutter -PDF -- 错误 - 这个小部件创建了 20 多个页面。这可能是小部件或文档中的问题
Posted
技术标签:
【中文标题】Flutter -PDF -- 错误 - 这个小部件创建了 20 多个页面。这可能是小部件或文档中的问题【英文标题】:Flutter -PDF -- Error - This widget created more than 20 pages. This may be an issue in the widget or the document 【发布时间】:2020-08-24 00:55:11 【问题描述】:我正在创建一个包含大量内容的 PDF 文档。但是,我无法显示 PDF,并且出现错误
“此小部件创建了 20 多个页面。这可能是小部件或文档中的问题。”
我知道文本太大,但我不知道如何使它工作
pdf.addPage(
pw.MultiPage(
pageFormat: PdfPageFormat.a4,
orientation: pw.PageOrientation.portrait,
crossAxisAlignment: pw.CrossAxisAlignment.start,
build: (pw.Context context)
return <pw.Widget>[
pw.Wrap(
children: <pw.Widget>[
pw.Container(
width: PdfPageFormat.a4.width,
child: pw.Row(
mainAxisSize: pw.MainAxisSize.min,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: <pw.Widget>[
pw.Expanded(
child: pw.Column(
mainAxisSize: pw.MainAxisSize.min,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: <pw.Widget>[
pw.SizedBox(height: 8.0),
for (int i = 0; i < data['employers'].length; i++)
pw.Column(
mainAxisSize: pw.MainAxisSize.min,
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: <pw.Widget>[
pw.Text(
"$data['employers'][i]['duties']",
style: pw.TextStyle(
fontSize: 12.0,
),
softWrap: true,
),
],
),
],
),
),
],
),
),
],
),
];
,
),
);
我需要一些关于如何重组我的代码的帮助,以便我可以显示 PDF 并将其换行到下一页 文本只是一组 Lorem Ipsum 。
感谢您的帮助
【问题讨论】:
【参考方案1】:你可以简单地使用它。
import 'package:ferns_restaurant/constants/Constants.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:pdf/widgets.dart';
import 'package:printing/printing.dart';
import 'package:woocommerce/models/order.dart';
class CustomPrinter
final pdf = pw.Document();
print(WooOrder order)
List<LineItems> _product = order.lineItems;
Printing.layoutPdf(
onLayout: (format)
final doc = pw.Document();
doc.addPage(
pw.MultiPage(
crossAxisAlignment: pw.CrossAxisAlignment.start,
build: (pw.Context context) => <pw.Widget>[
_topHeaderLayout(),
for (int i = 0; i < _product.length; i++)
_productLayout(_product[i]),
]),
);
return doc.save();
,
name: 'order_id_#' + order.id.toString(),
);
_topHeaderLayout()
return new pw.Container(
// height: 60.0,
margin: pw.EdgeInsets.only(bottom: 20.0),
child: pw.Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
pw.Expanded(
child: pw.Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <pw.Widget>[
pw.Container(
child: pw.Text(
'ITEM',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
fontSize: Constants.PRINTER_BASE_FONT_SIZE),
),
),
],
),
),
pw.Expanded(
child: pw.Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <pw.Widget>[
pw.Text(
'PRICE',
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
fontSize: Constants.PRINTER_BASE_FONT_SIZE),
),
],
),
)
],
));
_productLayout(LineItems item)
return new pw.Container(
// height: 60.0,
margin: pw.EdgeInsets.only(bottom: 20.0),
child: pw.Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
pw.Expanded(
child: pw.Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <pw.Widget>[
pw.Container(
child: pw.Text(
item.name.toString() + ' - ID: ' + item.id.toString(),
style: pw.TextStyle(
fontWeight: pw.FontWeight.bold,
fontSize: Constants.PRINTER_BASE_FONT_SIZE),
),
),
pw.Container(
child: Text(
'Qty: ' +
item.quantity.toString() +
' x Cost: ' +
'£' +
item.price,
style: pw.TextStyle(
fontWeight: pw.FontWeight.normal,
fontSize: Constants.PRINTER_BASE_FONT_SIZE)),
),
],
),
),
pw.Expanded(
child: pw.Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <pw.Widget>[
pw.Text(
'£' + item.total.toString(),
style: pw.TextStyle(
fontWeight: pw.FontWeight.normal,
fontSize: Constants.PRINTER_BASE_FONT_SIZE),
),
],
),
)
],
));
【讨论】:
它有效,你节省了我的时间【参考方案2】:This 可能是您问题的解决方案
我粘贴链接的代码以防您无法输入。
假设我们有一个列表issues
:
pdf.addPage(
MultiPage(
build: (Context context) => <Widget>[
Wrap(
children: List<Widget>.generate(issues.length, (int index)
final issue = issues[index];
return Container(
child: Column(
children: <Widget>[
Header(
text: "Issue n°$issue.id",
textStyle: TextStyle(fontSize: 20)),
Text("Description :",
textAlign: TextAlign.left,
style: TextStyle(fontSize: 15)),
],
),
);
),
),
],
),
);
【讨论】:
【参考方案3】:我认为这是因为桌子的长度。尝试拆分表格,以免单个表格超过 20 页。
【讨论】:
【参考方案4】:你必须修复 maxPage:
doc.addPage(
pw.MultiPage(
maxPages: 100,
.
.
)
)
【讨论】:
这可能行不通。当生成的 PDF 具有无限高度时会引发错误,更改“maxPages”可能只会更改堆栈跟踪的文本。除非,显然,您生成的文档确实超过 20 页。以上是关于Flutter -PDF -- 错误 - 这个小部件创建了 20 多个页面。这可能是小部件或文档中的问题的主要内容,如果未能解决你的问题,请参考以下文章
FutureBuilder 能够获取数据,但使用 Flutter 多次获取数据
颤振:RangeError(索引):无效值:不在包含范围内0..27:28