From 2d6603dfd55b16dc2980125e65306bdc9a47d1f9 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 22 Sep 2026 16:08:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=9B=9E=E9=80=80=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../services/database/database_migration.dart | 10 +- lib/common/values/constants.dart | 4 +- .../widgets/order/select_pay_type_dialog.dart | 118 +++--- .../reservation_shortcut_actions.dart | 2 +- pubspec.lock | 364 +++++++++--------- pubspec.yaml | 2 +- test/common/printer_task_test.dart | 30 ++ .../checkout_cart_item_name_row_test.dart | 133 +++++++ test/pages/goldens/checkout_name_row.png | Bin 0 -> 25255 bytes 10 files changed, 424 insertions(+), 241 deletions(-) create mode 100644 test/pages/checkout_cart_item_name_row_test.dart create mode 100644 test/pages/goldens/checkout_name_row.png diff --git a/README.md b/README.md index 19751b6..fb21452 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ flutter pub run build_runner build --delete-conflicting-outputs~ ## flutter打包 ``` -flutter build apk --build-name 1.5.0 --build-number 150 +flutter build apk --build-name 1.5.1 --build-number 151 --build-name为版本号(展示) --build-number为版本号(内部比较) ``` diff --git a/lib/common/services/database/database_migration.dart b/lib/common/services/database/database_migration.dart index 60608f0..54b6bd5 100644 --- a/lib/common/services/database/database_migration.dart +++ b/lib/common/services/database/database_migration.dart @@ -413,9 +413,15 @@ abstract class DatabaseMigration { /// 版本14为打印任务补充后端指令流列,指令打印模式可离线重试且不改变出纸内容。 /// /// 列可空且不回填:旧任务与旧后端无指令,指令模式下回退 invoiceUrl 图片打印。 + /// 外部存储旧库可能已带该列(中间态构建建库、降级重建),重复 ALTER 会中断启动, + /// 因此先查列再添加,保证跨版本安装可重入。 static Migration migration13To14 = Migration(13, 14, (database) async { - await database - .execute('ALTER TABLE print_history ADD COLUMN printCmd TEXT'); + final columns = await database.rawQuery('PRAGMA table_info(print_history)'); + final hasPrintCmd = columns.any((column) => column['name'] == 'printCmd'); + if (!hasPrintCmd) { + await database + .execute('ALTER TABLE print_history ADD COLUMN printCmd TEXT'); + } }); /// 按起始版本升序返回全部迁移,Floor 打开旧数据库时据此连续升级到当前版本。 diff --git a/lib/common/values/constants.dart b/lib/common/values/constants.dart index 72c24a3..e22da94 100644 --- a/lib/common/values/constants.dart +++ b/lib/common/values/constants.dart @@ -15,8 +15,8 @@ class Constants { static const pwdEncKey = 'pigxpigxpigxpigx'; /// 服务 url 线上 - static const apiUrl = 'https://dzc-test-1.fy.takin.cc'; - // static const apiUrl = 'https://www.zianxin.com/api'; + // static const apiUrl = 'https://dzc-test-1.fy.takin.cc'; + static const apiUrl = 'https://www.zianxin.com/api'; // static const apiUrl = 'https://dzc-test-1.fy.takin.cc'; diff --git a/lib/common/widgets/order/select_pay_type_dialog.dart b/lib/common/widgets/order/select_pay_type_dialog.dart index cba97a1..a2d7e19 100644 --- a/lib/common/widgets/order/select_pay_type_dialog.dart +++ b/lib/common/widgets/order/select_pay_type_dialog.dart @@ -1686,7 +1686,7 @@ class _CheckoutCartItemSummary extends StatelessWidget { /// 套餐展开/收起回调;其热区与右侧数量步进器相互独立。 final VoidCallback? onComboToggle; - /// 构建固定图片、商品信息和右对齐小计金额。 + /// 构建整行名称、固定图片、商品信息和右对齐小计金额。 @override Widget build(BuildContext context) { final theme = FTheme.of(context); @@ -1697,6 +1697,30 @@ class _CheckoutCartItemSummary extends StatelessWidget { : 'x${item.productNumber}'; final stockText = item.stock == null ? '库存未知' : '库存 ${item.stock}'; final stockUnavailable = item.stock == 0; + // 名称+类型标签独占卡片一整行(左缘到右缘),不再与图片、步进器同行 + // 抢宽度;超长名称等比缩小兜底(与食堂商品卡一致),保证永远单行。 + final nameRow = [ + LayoutBuilder( + builder: (context, constraints) => FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: SizedBox( + width: constraints.maxWidth, + child: Text( + item.productName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.typography.base.copyWith( + color: XfjDesignTokens.ink, + fontWeight: FontWeight.w700, + height: 1.3, + ), + ), + ), + ), + ).expanded(), + ProductTypeTag(isCombo: combo), + ].toRowSpace(space: 8.w); final productDetails = [ _CheckoutProductImage( key: ValueKey( @@ -1708,20 +1732,6 @@ class _CheckoutCartItemSummary extends StatelessWidget { height: 64.h, ), [ - [ - Text( - item.productName, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: theme.typography.base.copyWith( - color: XfjDesignTokens.ink, - fontWeight: FontWeight.w700, - height: 1.3, - ), - ).expanded(), - ProductTypeTag(isCombo: combo), - ].toRowSpace(space: 8.w), - SizedBox(height: 7.h), [ Text( '单价 ${_paymentMoney(item.productPrice)}', @@ -1822,16 +1832,43 @@ class _CheckoutCartItemSummary extends StatelessWidget { ), ); return [ - productDetailsAction.expanded(), - if (editable) - [ - _CheckoutQuantityStepper( - controller: controller, - item: item, - updating: updating, - onChanged: (value) => onQuantityChanged!(item, value), - pendingQuantity: pendingQuantity, - ), + nameRow, + SizedBox(height: 7.h), + [ + productDetailsAction.expanded(), + if (editable) + [ + _CheckoutQuantityStepper( + controller: controller, + item: item, + updating: updating, + onChanged: (value) => onQuantityChanged!(item, value), + pendingQuantity: pendingQuantity, + ), + [ + Text( + _paymentMoney(item.totalPrice), + key: ValueKey( + 'checkout-item-total-${item.productServiceUniqueCode}', + ), + textAlign: TextAlign.right, + style: theme.typography.base.copyWith( + color: XfjDesignTokens.ink, + fontWeight: FontWeight.w800, + fontFeatures: const [FontFeature.tabularFigures()], + ), + ), + Text( + '商品小计', + style: theme.typography.xs.copyWith( + color: XfjDesignTokens.muted, + ), + ), + ].toColumn(crossAxisAlignment: CrossAxisAlignment.end).width( + 88.w < 88 ? 88 : 88.w, + ), + ].toRowSpace(space: 8.w).width(240.w < 240 ? 240 : 240.w) + else [ Text( _paymentMoney(item.totalPrice), @@ -1847,35 +1884,12 @@ class _CheckoutCartItemSummary extends StatelessWidget { ), Text( '商品小计', - style: theme.typography.xs.copyWith( - color: XfjDesignTokens.muted, - ), + style: theme.typography.xs.copyWith(color: XfjDesignTokens.muted), ), - ].toColumn(crossAxisAlignment: CrossAxisAlignment.end).width( - 88.w < 88 ? 88 : 88.w, - ), - ].toRowSpace(space: 8.w).width(240.w < 240 ? 240 : 240.w) - else - [ - Text( - _paymentMoney(item.totalPrice), - key: ValueKey( - 'checkout-item-total-${item.productServiceUniqueCode}', - ), - textAlign: TextAlign.right, - style: theme.typography.base.copyWith( - color: XfjDesignTokens.ink, - fontWeight: FontWeight.w800, - fontFeatures: const [FontFeature.tabularFigures()], - ), - ), - Text( - '商品小计', - style: theme.typography.xs.copyWith(color: XfjDesignTokens.muted), - ), - ].toColumn(crossAxisAlignment: CrossAxisAlignment.end).width(104.w), + ].toColumn(crossAxisAlignment: CrossAxisAlignment.end).width(104.w), + ].toRowSpace(space: 12.w, crossAxisAlignment: CrossAxisAlignment.center), ] - .toRowSpace(space: 12.w, crossAxisAlignment: CrossAxisAlignment.center) + .toColumn(crossAxisAlignment: CrossAxisAlignment.stretch) .padding(horizontal: 8.w, vertical: 12.h); } } diff --git a/lib/pages/terminal/menu_query/reservation_shortcut_actions.dart b/lib/pages/terminal/menu_query/reservation_shortcut_actions.dart index 4c354c4..1e7bd6d 100644 --- a/lib/pages/terminal/menu_query/reservation_shortcut_actions.dart +++ b/lib/pages/terminal/menu_query/reservation_shortcut_actions.dart @@ -163,7 +163,7 @@ mixin ReservationMenuQueryShortcutActions { return; } unawaited( - shortcutSpeaker('已切换为${target.title},再次点击开始${target.title}'), + shortcutSpeaker('已切换为${target.title}再次点击开始${target.title}识别'), ); unawaited(selectMethod(target)); } diff --git a/pubspec.lock b/pubspec.lock index 076a952..8bce699 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "76.0.0" _macros: @@ -19,7 +19,7 @@ packages: description: name: analyzer sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.11.0" android_id: @@ -27,7 +27,7 @@ packages: description: name: android_id sha256: f6489be4c4380cdb55a99db5b03764d936e84e9d5258a26571aa500bd1159fe0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.1" archive: @@ -35,7 +35,7 @@ packages: description: name: archive sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.9" args: @@ -43,7 +43,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" async: @@ -51,7 +51,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.0" background_downloader: @@ -59,7 +59,7 @@ packages: description: name: background_downloader sha256: "0873a939f5a301872cb7614e12f759fbccef2e3ed0d0d37b540dde7611275b12" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.12.3" barcode: @@ -67,7 +67,7 @@ packages: description: name: barcode sha256: "7b6729c37e3b7f34233e2318d866e8c48ddb46c1f7ad01ff7bb2a8de1da2b9f4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.9" bidi: @@ -75,7 +75,7 @@ packages: description: name: bidi sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.13" boolean_selector: @@ -83,7 +83,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" build: @@ -91,7 +91,7 @@ packages: description: name: build sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" build_config: @@ -99,7 +99,7 @@ packages: description: name: build_config sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" build_daemon: @@ -107,7 +107,7 @@ packages: description: name: build_daemon sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.4" build_resolvers: @@ -115,7 +115,7 @@ packages: description: name: build_resolvers sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.4" build_runner: @@ -123,7 +123,7 @@ packages: description: name: build_runner sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.14" build_runner_core: @@ -131,7 +131,7 @@ packages: description: name: build_runner_core sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.0.0" built_collection: @@ -139,7 +139,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: @@ -147,7 +147,7 @@ packages: description: name: built_value sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.13.0" cached_network_image: @@ -155,7 +155,7 @@ packages: description: name: cached_network_image sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.1" cached_network_image_platform_interface: @@ -163,7 +163,7 @@ packages: description: name: cached_network_image_platform_interface sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.1" cached_network_image_web: @@ -171,7 +171,7 @@ packages: description: name: cached_network_image_web sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" characters: @@ -179,7 +179,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" charcode: @@ -187,7 +187,7 @@ packages: description: name: charcode sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" checked_yaml: @@ -195,7 +195,7 @@ packages: description: name: checked_yaml sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" clock: @@ -203,7 +203,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: @@ -211,7 +211,7 @@ packages: description: name: code_builder sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.10.1" collection: @@ -219,7 +219,7 @@ packages: description: name: collection sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.0" common_utils: @@ -227,7 +227,7 @@ packages: description: name: common_utils sha256: c26884339b13ff99b0739e56f4b02090c84054ed9dd3a045435cd24e7b99c2c1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" connectivity_plus: @@ -235,7 +235,7 @@ packages: description: name: connectivity_plus sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.5" connectivity_plus_platform_interface: @@ -243,7 +243,7 @@ packages: description: name: connectivity_plus_platform_interface sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" convert: @@ -251,7 +251,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" cron: @@ -259,7 +259,7 @@ packages: description: name: cron sha256: "2af3de2cabcc81346c00ff9db06296cdaf37ad17bd6f97fb63777a9ddefcacf3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.6.2" crypto: @@ -267,7 +267,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.7" csslib: @@ -275,7 +275,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" cupertino_icons: @@ -283,7 +283,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" dart_style: @@ -291,7 +291,7 @@ packages: description: name: dart_style sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.8" data_table_2: @@ -299,7 +299,7 @@ packages: description: name: data_table_2 sha256: cb31d465dcf1e1598a662d06d3d2c16c73700ae9e837a3d91588f1dda7519abc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.2" dbus: @@ -307,7 +307,7 @@ packages: description: name: dbus sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.12" decimal: @@ -315,7 +315,7 @@ packages: description: name: decimal sha256: "2c3c8b74f2948066d3f42585477aec9cfc48fefd7a723a4d4274a6c71a5c0df7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.6" dio: @@ -323,7 +323,7 @@ packages: description: name: dio sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.7.0" dio_web_adapter: @@ -331,7 +331,7 @@ packages: description: name: dio_web_adapter sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" drago_pos_printer: @@ -339,7 +339,7 @@ packages: description: name: drago_pos_printer sha256: "8b601221dcf804f662228a6ae68d0c644543b6df0026e40808fc0fbf2c19871c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" drago_usb_printer: @@ -354,7 +354,7 @@ packages: description: name: ducafe_ui_core sha256: "92ff9b05654e1b5ae2adbeac7227c669655da73f134bede75ad9aa1c505af904" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.6" dylib: @@ -362,7 +362,7 @@ packages: description: name: dylib sha256: bf609b3eb6492a3309b3d1dbe8f83a4031de5535dd7686be33487051cc760bb0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.3" equatable: @@ -370,7 +370,7 @@ packages: description: name: equatable sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" event_bus: @@ -378,7 +378,7 @@ packages: description: name: event_bus sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" external_path: @@ -386,7 +386,7 @@ packages: description: name: external_path sha256: "68a18a2aa51ec012d7013ea2a80305dc5372f3577a2bbcc7dcc5550b25a5a73b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" fake_async: @@ -394,7 +394,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: @@ -402,7 +402,7 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" file: @@ -410,7 +410,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" fixnum: @@ -418,7 +418,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" floor: @@ -426,7 +426,7 @@ packages: description: name: floor sha256: "52a8eac2c8d274e7c0c54251226f59786bb5b749365a2d8537d8095aa5132d92" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.2" floor_annotation: @@ -434,7 +434,7 @@ packages: description: name: floor_annotation sha256: a40949580a7ab0eee572686e2d3b1638fd6bd6a753e661d792ab4236b365b23b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" floor_generator: @@ -442,7 +442,7 @@ packages: description: name: floor_generator sha256: "1499b3ab878a807e6fbe6f140dc014124845cd1df3090a113aae5fa7577a1e77" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" flutter: @@ -455,7 +455,7 @@ packages: description: name: flutter_cache_manager sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.1" flutter_easyloading: @@ -463,7 +463,7 @@ packages: description: name: flutter_easyloading sha256: ba21a3c883544e582f9cc455a4a0907556714e1e9cf0eababfcb600da191d17c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.5" flutter_html: @@ -471,7 +471,7 @@ packages: description: name: flutter_html sha256: "38a2fd702ffdf3243fb7441ab58aa1bc7e6922d95a50db76534de8260638558d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" flutter_libserialport: @@ -479,7 +479,7 @@ packages: description: name: flutter_libserialport sha256: d193b5ac819db6540d20cc8d20d9f5ec9e3396edb4d2c4a23c97863fa9132336 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.5.0" flutter_lints: @@ -487,7 +487,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.0" flutter_localizations: @@ -500,7 +500,7 @@ packages: description: name: flutter_spinkit sha256: "77850df57c00dc218bfe96071d576a8babec24cf58b2ed121c83cca4a2fdce7f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.2.2" flutter_subscreen_plugin: @@ -508,7 +508,7 @@ packages: description: name: flutter_subscreen_plugin sha256: b89bc8ba87956d441726557ece140ccea418ca4569e8f06e028e1017740ff6f3 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.2+5" flutter_svg: @@ -516,7 +516,7 @@ packages: description: name: flutter_svg sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" flutter_test: @@ -529,7 +529,7 @@ packages: description: name: flutter_tts sha256: baa3cb6b4990318460fe28bfa8c7869399e97223971532c02bd97c5e876aa3c5 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.2" flutter_web_plugins: @@ -542,7 +542,7 @@ packages: description: name: fluttertoast sha256: "90778fe0497fe3a09166e8cf2e0867310ff434b794526589e77ec03cf08ba8e8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.2.14" forui: @@ -550,7 +550,7 @@ packages: description: name: forui sha256: "3ebbf39d57f0667afc47cbab86b0afe679bba2173a51afc21855053663dc5062" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.1+1" forui_assets: @@ -558,7 +558,7 @@ packages: description: name: forui_assets sha256: df0f24b47ff0c3e16811bb4ad597b426b8e1a62fcf2fea7d95923ef4d6e8aa2c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.1" frontend_server_client: @@ -566,7 +566,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" gbk_codec: @@ -574,7 +574,7 @@ packages: description: name: gbk_codec sha256: "3af5311fc9393115e3650ae6023862adf998051a804a08fb804f042724999f61" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.0" get: @@ -582,7 +582,7 @@ packages: description: name: get sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.7.3" glob: @@ -590,7 +590,7 @@ packages: description: name: glob sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" google_fonts: @@ -598,7 +598,7 @@ packages: description: name: google_fonts sha256: df9763500dadba0155373e9cb44e202ce21bd9ed5de6bdbd05c5854e86839cb8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.0" graphs: @@ -606,7 +606,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" hex: @@ -614,7 +614,7 @@ packages: description: name: hex sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.0" html: @@ -622,7 +622,7 @@ packages: description: name: html sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.15.5" http: @@ -630,7 +630,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.6.0" http_multi_server: @@ -638,7 +638,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" http_parser: @@ -646,7 +646,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" icons_launcher: @@ -654,7 +654,7 @@ packages: description: name: icons_launcher sha256: a7c83fbc837dc6f81944ef35c3756f533bb2aba32fcca5cbcdb2dbcd877d5ae9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" image: @@ -662,7 +662,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.5.4" intl: @@ -670,7 +670,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.19.0" io: @@ -678,7 +678,7 @@ packages: description: name: io sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" js: @@ -686,7 +686,7 @@ packages: description: name: js sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.1" json_annotation: @@ -694,7 +694,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" json_serializable: @@ -702,7 +702,7 @@ packages: description: name: json_serializable sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.8.0" leak_tracker: @@ -710,7 +710,7 @@ packages: description: name: leak_tracker sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.0.7" leak_tracker_flutter_testing: @@ -718,7 +718,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.8" leak_tracker_testing: @@ -726,7 +726,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" libserialport: @@ -734,7 +734,7 @@ packages: description: name: libserialport sha256: "392e1592def65282429832ec66fa25e9e163d3b37716b97691482e2406720727" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.0+1" lints: @@ -742,7 +742,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" list_counter: @@ -750,7 +750,7 @@ packages: description: name: list_counter sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" logger: @@ -758,7 +758,7 @@ packages: description: name: logger sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" logging: @@ -766,7 +766,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" macros: @@ -774,7 +774,7 @@ packages: description: name: macros sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.3-main.0" matcher: @@ -782,7 +782,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.16+1" material_color_utilities: @@ -790,7 +790,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -798,7 +798,7 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.15.0" mime: @@ -806,7 +806,7 @@ packages: description: name: mime sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.6" mqtt_client: @@ -814,7 +814,7 @@ packages: description: name: mqtt_client sha256: "37aae360fac0b3322cb37267696c1535e1ad2984a13064d877273ffe4b16ca7a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.5.1" network_info_plus: @@ -822,7 +822,7 @@ packages: description: name: network_info_plus sha256: f926b2ba86aa0086a0dfbb9e5072089bc213d854135c1712f1d29fc89ba3c877 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.4" network_info_plus_platform_interface: @@ -830,7 +830,7 @@ packages: description: name: network_info_plus_platform_interface sha256: "7e7496a8a9d8136859b8881affc613c4a21304afeb6c324bcefc4bd0aff6b94b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.2" nitrogen_flutter_svg: @@ -838,7 +838,7 @@ packages: description: name: nitrogen_flutter_svg sha256: "103313861b182fd4069bac896519b1ee64cbe1af0023d818f6c300b81c16853c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.0" nitrogen_types: @@ -846,7 +846,7 @@ packages: description: name: nitrogen_types sha256: "5d4ec453aea14e34607bc6021ff1381192e8fcd8541bf103638baa4d013e668f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.0+1" nm: @@ -854,7 +854,7 @@ packages: description: name: nm sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.5.0" number_pagination: @@ -862,7 +862,7 @@ packages: description: name: number_pagination sha256: "75d3a28616196e7c8df431d0fb7c48e811e462155f4cf3b5b4167b3408421327" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.6" octo_image: @@ -870,7 +870,7 @@ packages: description: name: octo_image sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" package_config: @@ -878,7 +878,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" package_info_plus: @@ -886,7 +886,7 @@ packages: description: name: package_info_plus sha256: "67eae327b1b0faf761964a1d2e5d323c797f3799db0e85aa232db8d9e922bc35" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.2.1" package_info_plus_platform_interface: @@ -894,7 +894,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" path: @@ -902,7 +902,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.0" path_parsing: @@ -910,7 +910,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" path_provider: @@ -918,7 +918,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" path_provider_android: @@ -926,7 +926,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.17" path_provider_foundation: @@ -934,7 +934,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" path_provider_linux: @@ -942,7 +942,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -950,7 +950,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -958,7 +958,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" pdf: @@ -966,7 +966,7 @@ packages: description: name: pdf sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.11.3" pdf_widget_wrapper: @@ -974,7 +974,7 @@ packages: description: name: pdf_widget_wrapper sha256: c930860d987213a3d58c7ec3b7ecf8085c3897f773e8dc23da9cae60a5d6d0f5 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.4" permission_handler: @@ -982,7 +982,7 @@ packages: description: name: permission_handler sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "11.4.0" permission_handler_android: @@ -990,7 +990,7 @@ packages: description: name: permission_handler_android sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "12.1.0" permission_handler_apple: @@ -998,7 +998,7 @@ packages: description: name: permission_handler_apple sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.6.1" permission_handler_html: @@ -1006,7 +1006,7 @@ packages: description: name: permission_handler_html sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.4+1" permission_handler_platform_interface: @@ -1014,7 +1014,7 @@ packages: description: name: permission_handler_platform_interface sha256: ed86a61c190258fdd65de395ea0632822e3415c1faec38eae0c31b479c28a531 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.4.1" permission_handler_windows: @@ -1022,7 +1022,7 @@ packages: description: name: permission_handler_windows sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" petitparser: @@ -1030,7 +1030,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.2" pinyin: @@ -1038,7 +1038,7 @@ packages: description: name: pinyin sha256: "240f271a3c71af20c8d2757756b5ee8e9d79a955d37abad4b3568fd406b22411" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.3.0" platform: @@ -1046,7 +1046,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -1054,7 +1054,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" pointycastle: @@ -1062,7 +1062,7 @@ packages: description: name: pointycastle sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.9.1" pool: @@ -1070,7 +1070,7 @@ packages: description: name: pool sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.3" posix: @@ -1078,7 +1078,7 @@ packages: description: name: posix sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.2" printing: @@ -1086,7 +1086,7 @@ packages: description: name: printing sha256: "689170c9ddb1bda85826466ba80378aa8993486d3c959a71cd7d2d80cb606692" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.14.3" pub_semver: @@ -1094,7 +1094,7 @@ packages: description: name: pub_semver sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" pubspec_parse: @@ -1102,7 +1102,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" qr: @@ -1110,7 +1110,7 @@ packages: description: name: qr sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" qr_flutter: @@ -1118,7 +1118,7 @@ packages: description: name: qr_flutter sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.0" rational: @@ -1126,7 +1126,7 @@ packages: description: name: rational sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.3" rxdart: @@ -1134,7 +1134,7 @@ packages: description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.28.0" shelf: @@ -1142,7 +1142,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.2" shelf_web_socket: @@ -1150,7 +1150,7 @@ packages: description: name: shelf_web_socket sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" simple_sparse_list: @@ -1158,7 +1158,7 @@ packages: description: name: simple_sparse_list sha256: aa648fd240fa39b49dcd11c19c266990006006de6699a412de485695910fbc1f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.4" sky_engine: @@ -1171,7 +1171,7 @@ packages: description: name: source_gen sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" source_helper: @@ -1179,7 +1179,7 @@ packages: description: name: source_helper sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.5" source_span: @@ -1187,7 +1187,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.0" sqflite: @@ -1195,7 +1195,7 @@ packages: description: name: sqflite sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" sqflite_android: @@ -1203,7 +1203,7 @@ packages: description: name: sqflite_android sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" sqflite_common: @@ -1211,7 +1211,7 @@ packages: description: name: sqflite_common sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.4+6" sqflite_common_ffi: @@ -1219,7 +1219,7 @@ packages: description: name: sqflite_common_ffi sha256: "883dd810b2b49e6e8c3b980df1829ef550a94e3f87deab5d864917d27ca6bf36" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.4+4" sqflite_darwin: @@ -1227,7 +1227,7 @@ packages: description: name: sqflite_darwin sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1+1" sqflite_platform_interface: @@ -1235,7 +1235,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" sqlite3: @@ -1243,7 +1243,7 @@ packages: description: name: sqlite3 sha256: "3145bd74dcdb4fd6f5c6dda4d4e4490a8087d7f286a14dee5d37087290f0f8a2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.9.4" sqlparser: @@ -1251,7 +1251,7 @@ packages: description: name: sqlparser sha256: "91f47610aa54d8abf9d795a7b4e49b2a788f65d7493d5a68fbf180c3cbcc6f38" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.27.0" stack_trace: @@ -1259,7 +1259,7 @@ packages: description: name: stack_trace sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.0" stream_channel: @@ -1267,7 +1267,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" stream_transform: @@ -1275,7 +1275,7 @@ packages: description: name: stream_transform sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" string_scanner: @@ -1283,7 +1283,7 @@ packages: description: name: string_scanner sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" strings: @@ -1291,7 +1291,7 @@ packages: description: name: strings sha256: "482f1511d2cd8ab9f2c4cc148e6837be8a00c03b9a8eaedbc981a84d9c6305d8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.0" sugar: @@ -1299,7 +1299,7 @@ packages: description: name: sugar sha256: a0a97f1d3552a3ef4cbec7c6e62c7b52c151cd5c11e984e8311700a918f73dc5 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" syncfusion_flutter_core: @@ -1307,7 +1307,7 @@ packages: description: name: syncfusion_flutter_core sha256: f1d2b52697543e13bdefdc62d15868124a265987577f53224a7dbe176c8448f0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "28.2.12" syncfusion_flutter_datepicker: @@ -1315,7 +1315,7 @@ packages: description: name: syncfusion_flutter_datepicker sha256: cfc91ebacee63b2c5220e541736f8df211d4f0bfbf34265778862ae20faf094f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "28.2.12" synchronized: @@ -1323,7 +1323,7 @@ packages: description: name: synchronized sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.3.0+3" term_glyph: @@ -1331,7 +1331,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: @@ -1339,7 +1339,7 @@ packages: description: name: test_api sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.3" timing: @@ -1347,7 +1347,7 @@ packages: description: name: timing sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" typed_data: @@ -1355,7 +1355,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" unicode: @@ -1363,7 +1363,7 @@ packages: description: name: unicode sha256: a6f7bcfc8ea1d5ce1f6c0b1c39117a9919f4953edd9fd7a64090a9796c499b57 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.9" universal_html: @@ -1371,7 +1371,7 @@ packages: description: name: universal_html sha256: c0bcae5c733c60f26c7dfc88b10b0fd27cbcc45cb7492311cdaa6067e21c9cd4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" universal_io: @@ -1379,7 +1379,7 @@ packages: description: name: universal_io sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" uuid: @@ -1387,7 +1387,7 @@ packages: description: name: uuid sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.6.0" vector_graphics: @@ -1395,7 +1395,7 @@ packages: description: name: vector_graphics sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.19" vector_graphics_codec: @@ -1403,7 +1403,7 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -1411,7 +1411,7 @@ packages: description: name: vector_graphics_compiler sha256: ca81fdfaf62a5ab45d7296614aea108d2c7d0efca8393e96174bf4d51e6725b0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.18" vector_math: @@ -1419,7 +1419,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" vm_service: @@ -1427,7 +1427,7 @@ packages: description: name: vm_service sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "14.3.0" watcher: @@ -1435,7 +1435,7 @@ packages: description: name: watcher sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" web: @@ -1443,7 +1443,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" web_socket: @@ -1451,7 +1451,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" web_socket_channel: @@ -1459,7 +1459,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" win32: @@ -1467,7 +1467,7 @@ packages: description: name: win32 sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.10.1" xdg_directories: @@ -1475,7 +1475,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -1483,7 +1483,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.0" yaml: @@ -1491,7 +1491,7 @@ packages: description: name: yaml sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.4" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index 377a67d..42c40be 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: pj_supermarket_cloud description: "资安信智慧后勤-测试" publish_to: "none" -version: 1.5.0+150 +version: 1.5.1+151 environment: sdk: ^3.6.0 diff --git a/test/common/printer_task_test.dart b/test/common/printer_task_test.dart index f96e308..64b7df6 100644 --- a/test/common/printer_task_test.dart +++ b/test/common/printer_task_test.dart @@ -143,4 +143,34 @@ void main() { throwsA(isA()), ); }); + + test('13到14迁移补指令列且列已存在时可重入', () async { + final database = + await databaseFactoryFfi.openDatabase(inMemoryDatabasePath); + addTearDown(database.close); + await database.execute(''' + CREATE TABLE print_history ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + orderId TEXT NOT NULL, + serviceOrderId TEXT NOT NULL, + servicePrintId TEXT NOT NULL, + invoiceUrl TEXT NOT NULL, + status TEXT NOT NULL, + printTime TEXT, + syncTime TEXT, + createTime TEXT NOT NULL + ) + '''); + + await DatabaseMigration.migration13To14.migrate(database); + + final columns = await database.rawQuery('PRAGMA table_info(print_history)'); + expect( + columns.map((column) => column['name']), + contains('printCmd'), + ); + + // 外部存储旧库可能已带该列(中间态构建建库、降级重建),重复迁移不得抛 duplicate column。 + await DatabaseMigration.migration13To14.migrate(database); + }); } diff --git a/test/pages/checkout_cart_item_name_row_test.dart b/test/pages/checkout_cart_item_name_row_test.dart new file mode 100644 index 0000000..1943520 --- /dev/null +++ b/test/pages/checkout_cart_item_name_row_test.dart @@ -0,0 +1,133 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:ducafe_ui_core/ducafe_ui_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show FontLoader; +import 'package:flutter_test/flutter_test.dart'; +import 'package:forui/forui.dart'; + +import 'package:pj_supermarket_cloud/common/index.dart'; + +Future _loadCjkFont() async { + final file = File('/System/Library/Fonts/Supplemental/Arial Unicode.ttf'); + final bytes = await file.readAsBytes(); + final loader = FontLoader('PreviewCJK') + ..addFont(Future.value(ByteData.view(bytes.buffer))); + await loader.load(); +} + +/// 以结算弹框购物车列的真实宽度预算复刻商品卡两行结构: +/// 名称+类型标签独占整卡一行,图片/单价/步进器/小计在第二行, +/// 固化"名称行不被步进器挤压"的布局契约。 +void main() { + setUpAll(_loadCjkFont); + + testWidgets('结算条目名称行单行缩放布局', (tester) async { + tester.view.physicalSize = const Size(1920, 1080); + tester.view.devicePixelRatio = 1.0; + addTearDown(tester.view.reset); + + await tester.pumpWidget( + ScreenUtilInit( + designSize: const Size(1920, 1080), + minTextAdapt: true, + builder: (_, __) { + final theme = FThemeData.inherit( + colorScheme: FThemes.zinc.light.colorScheme, + typography: const FTypography(), + ); + return FTheme( + data: theme, + child: MaterialApp( + theme: ThemeData(fontFamily: 'PreviewCJK'), + home: Scaffold( + backgroundColor: XfjDesignTokens.surface, + body: Center( + child: Container( + // 结算弹框 42% 购物车列下的单条卡片内容宽 + width: 640, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: XfjDesignTokens.primarySoft, + border: Border.all( + color: XfjDesignTokens.primary.withValues(alpha: 0.45), + ), + borderRadius: BorderRadius.circular(12), + ), + child: [ + // 名称行:整卡宽,左名称右标签 + [ + LayoutBuilder( + builder: (context, constraints) => FittedBox( + fit: BoxFit.scaleDown, + alignment: Alignment.centerLeft, + child: SizedBox( + width: constraints.maxWidth, + child: Text( + 'D套餐-葱油鸡腿饭套餐', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.typography.base.copyWith( + color: XfjDesignTokens.ink, + fontWeight: FontWeight.w700, + height: 1.3, + ), + ), + ), + ), + ).expanded(), + const ProductTypeTag(isCombo: true), + ].toRowSpace(space: 8.w), + SizedBox(height: 7.h), + // 详情行:图片 + 单价信息 + 步进器/小计 + Row( + children: [ + Container( + width: 64.w, + height: 64.w, + color: XfjDesignTokens.control, + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '单价 ¥9.20 库存 999+ 套餐 4 样', + style: theme.typography.xs.copyWith( + color: XfjDesignTokens.muted, + ), + ), + ], + ), + ), + SizedBox(width: 12.w), + Container( + width: 240.w, + height: 64.w, + alignment: Alignment.center, + color: XfjDesignTokens.canvas, + child: Text( + '步进器+小计区 240.w', + style: theme.typography.xs, + ), + ), + ], + ), + ].toColumn(crossAxisAlignment: CrossAxisAlignment.stretch), + ), + ), + ), + ), + ); + }, + ), + ); + + await expectLater( + find.byType(Scaffold), + matchesGoldenFile('goldens/checkout_name_row.png'), + ); + }); +} diff --git a/test/pages/goldens/checkout_name_row.png b/test/pages/goldens/checkout_name_row.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbf268a3ad6f82434ea9723c0e504dd666a4803 GIT binary patch literal 25255 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 NvDebCa)mVA{s%Z*MhgG{ literal 0 HcmV?d00001