chore: release client-v1.0.84
Deploy Client / build-client-web (push) Successful in 45s
Deploy Client / build-windows (push) Successful in 2m43s
Deploy Client / build-macos (push) Successful in 2m15s
Deploy Client / build-android (push) Successful in 1m20s
Deploy Client / build-ios (push) Successful in 2m52s
Deploy Client / release-deploy-client (push) Successful in 1m51s
Deploy Client / build-client-web (push) Successful in 45s
Deploy Client / build-windows (push) Successful in 2m43s
Deploy Client / build-macos (push) Successful in 2m15s
Deploy Client / build-android (push) Successful in 1m20s
Deploy Client / build-ios (push) Successful in 2m52s
Deploy Client / release-deploy-client (push) Successful in 1m51s
修复出库单/入库单打印时单据明细超过一页导致 MultiPage 分页死循环卡死的回归 (_buildOrderDoc 改返回可拆分子组件列表,左侧竖线点缀改由 pageTheme 背景每页绘制)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.0.84] - 2026-06-26
|
||||
|
||||
### 修复
|
||||
- 修复出库单 / 入库单打印时,单据明细超过一页会导致程序卡死无响应的问题(新版打印版式引入的回归)。
|
||||
|
||||
## [1.0.83] - 2026-06-26
|
||||
|
||||
### 改进
|
||||
|
||||
@@ -686,7 +686,7 @@ pw.TextAlign _colAlign(int i) {
|
||||
|
||||
/// 构建入库单/出库单 A4 版式(参照「锐浪报表」单据:公司抬头 + 两行三列表头
|
||||
/// + 明细表 + 单据总计 + 温馨提示 + 签字行)。入库/出库仅称谓不同。
|
||||
pw.Widget _buildOrderDoc({
|
||||
List<pw.Widget> _buildOrderDoc({
|
||||
required pw.Font font,
|
||||
required pw.Font bold,
|
||||
required String shopName, // 公司名称(顶部抬头)
|
||||
@@ -724,15 +724,12 @@ pw.Widget _buildOrderDoc({
|
||||
pw.Widget metaText(String label, String value, pw.TextAlign align) =>
|
||||
pw.Text('$label:$value', style: metaStyle, textAlign: align);
|
||||
|
||||
return pw.Container(
|
||||
// 左侧竖线点缀
|
||||
decoration: const pw.BoxDecoration(
|
||||
border: pw.Border(left: pw.BorderSide(color: PdfColors.black, width: 3)),
|
||||
),
|
||||
padding: const pw.EdgeInsets.only(left: 14),
|
||||
child: pw.Column(
|
||||
crossAxisAlignment: pw.CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
// 返回明细块的「子组件列表」而非单个 Container:作为 MultiPage 的顶层
|
||||
// children,明细表可跨页拆分。左侧竖线点缀改由 pageTheme 背景每页绘制
|
||||
// (见 _orderPageTheme)——原先用非可拆分的 pw.Container 包裹整块内容,
|
||||
// 当内容超过一页时 MultiPage 无法拆分,分页算法不前进→无限加页、内存暴涨
|
||||
// →打印卡死(根因)。
|
||||
return [
|
||||
// ── 抬头:公司名 + 单据类型,左对齐内联 ──────────────────────────
|
||||
pw.Row(
|
||||
crossAxisAlignment: pw.CrossAxisAlignment.end,
|
||||
@@ -887,11 +884,40 @@ pw.Widget _buildOrderDoc({
|
||||
pw.SizedBox(height: 10),
|
||||
pw.Text('备注:$remark', style: metaStyle),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
];
|
||||
}
|
||||
|
||||
/// 出/入库单 MultiPage 页面主题:内容区左缩进 + 全页高左侧竖线点缀(每页都画)。
|
||||
/// 用 pageTheme 背景绘制竖线,让明细内容(含表格)可跨页拆分,避免非可拆分
|
||||
/// Container 在内容超一页时触发 MultiPage 分页死循环。
|
||||
pw.PageTheme _orderPageTheme() => pw.PageTheme(
|
||||
pageFormat: PdfPageFormat.a4,
|
||||
// 左边距 = 原始外边距 15mm + (竖线宽 3 + 内缩 14),与旧版视觉缩进一致。
|
||||
margin: const pw.EdgeInsets.fromLTRB(
|
||||
15 * PdfPageFormat.mm + 17,
|
||||
12 * PdfPageFormat.mm,
|
||||
15 * PdfPageFormat.mm,
|
||||
12 * PdfPageFormat.mm,
|
||||
),
|
||||
buildBackground: (ctx) => pw.FullPage(
|
||||
ignoreMargins: true,
|
||||
child: pw.Padding(
|
||||
padding: const pw.EdgeInsets.fromLTRB(
|
||||
15 * PdfPageFormat.mm,
|
||||
12 * PdfPageFormat.mm,
|
||||
0,
|
||||
12 * PdfPageFormat.mm,
|
||||
),
|
||||
child: pw.Container(
|
||||
decoration: const pw.BoxDecoration(
|
||||
border: pw.Border(
|
||||
left: pw.BorderSide(color: PdfColors.black, width: 3)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
/// 生成入库单 A4 PDF 字节(与实际打印同一套排版,供预览光栅化 + 打印共用)。
|
||||
Future<Uint8List> buildStockInOrderPdfImpl(
|
||||
StockInOrder order, OrderPrintMeta meta) async {
|
||||
@@ -919,10 +945,8 @@ Future<Uint8List> buildStockInOrderPdfImpl(
|
||||
|
||||
final doc = pw.Document();
|
||||
doc.addPage(pw.MultiPage(
|
||||
pageFormat: PdfPageFormat.a4,
|
||||
margin: const pw.EdgeInsets.symmetric(horizontal: 15 * PdfPageFormat.mm, vertical: 12 * PdfPageFormat.mm),
|
||||
build: (_) => [
|
||||
_buildOrderDoc(
|
||||
pageTheme: _orderPageTheme(),
|
||||
build: (_) => _buildOrderDoc(
|
||||
font: font, bold: bold,
|
||||
shopName: meta.shopName,
|
||||
title: '入 库 单',
|
||||
@@ -944,7 +968,6 @@ Future<Uint8List> buildStockInOrderPdfImpl(
|
||||
totalQty: totalQty,
|
||||
totalAmt: totalAmt,
|
||||
),
|
||||
],
|
||||
));
|
||||
return doc.save();
|
||||
}
|
||||
@@ -997,10 +1020,8 @@ Future<Uint8List> buildStockOutOrderPdfImpl(
|
||||
|
||||
final doc = pw.Document();
|
||||
doc.addPage(pw.MultiPage(
|
||||
pageFormat: PdfPageFormat.a4,
|
||||
margin: const pw.EdgeInsets.symmetric(horizontal: 15 * PdfPageFormat.mm, vertical: 12 * PdfPageFormat.mm),
|
||||
build: (_) => [
|
||||
_buildOrderDoc(
|
||||
pageTheme: _orderPageTheme(),
|
||||
build: (_) => _buildOrderDoc(
|
||||
font: font, bold: bold,
|
||||
shopName: meta.shopName,
|
||||
title: '出 库 单',
|
||||
@@ -1022,7 +1043,6 @@ Future<Uint8List> buildStockOutOrderPdfImpl(
|
||||
totalQty: totalQty,
|
||||
totalAmt: totalAmt,
|
||||
),
|
||||
],
|
||||
));
|
||||
return doc.save();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user