From 4f0c1f6f73e3ab16e25ed10a2329b7cb8b1006e2 Mon Sep 17 00:00:00 2001 From: Seven Tsui <16225583+youyouliangshao@user.noreply.gitee.com> Date: Sat, 20 Sep 2025 11:21:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/search/search-result.dart | 67 ++++++++++++++++++----------- lib/utils/index.dart | 11 ++++- 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/lib/pages/search/search-result.dart b/lib/pages/search/search-result.dart index b23d861..a1d5d1e 100644 --- a/lib/pages/search/search-result.dart +++ b/lib/pages/search/search-result.dart @@ -507,11 +507,7 @@ class _SearchResultPageState extends State with SingleTickerPr ), ); } - // 视频项构建 - // 视频项构建 -// 视频项构建 -// 视频项构建 Widget _buildVideoItem(Map video) { return GestureDetector( onTap: () { @@ -687,7 +683,6 @@ class _SearchResultPageState extends State with SingleTickerPr return Container(); } - // 商品Tab Widget _buildProductTab() { if (_productResults.isEmpty && !_isLoading) { @@ -712,7 +707,7 @@ class _SearchResultPageState extends State with SingleTickerPr crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, - childAspectRatio: 0.55, + childAspectRatio: 0.65, // 调整为与视频相同的宽高比 ), itemCount: _productResults.length, itemBuilder: (context, index) { @@ -783,46 +778,68 @@ class _SearchResultPageState extends State with SingleTickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // 商品图片 - 宽度100%,高度自适应 + // 商品图片 - 使用AspectRatio保持固定宽高比,与视频一致 ClipRRect( borderRadius: const BorderRadius.only( topLeft: Radius.circular(_itemCornerRadius), topRight: Radius.circular(_itemCornerRadius), ), - child: Container( - width: double.infinity, - color: Colors.grey[200], - child: product['pic'] != null - ? Image.network( - product['pic'].toString(), - fit: BoxFit.cover, - ) - : SizedBox( - height: 110, - child: const Center( - child: Icon(Icons.shopping_bag, color: Colors.grey, size: 32), + child: AspectRatio( + aspectRatio: 0.8, // 保持与视频相同的宽高比 + child: Container( + color: Colors.grey[200], + child: product['pic'] != null && product['pic'].toString().isNotEmpty + ? Image.network( + product['pic'].toString(), + fit: BoxFit.cover, + width: double.infinity, + height: double.infinity, + errorBuilder: (context, error, stackTrace) { + return Container( + color: Colors.grey[200], + child: const Center( + child: Icon( + Icons.shopping_bag, + color: Colors.grey, + size: 32, + ), + ), + ); + }, + ) + : Container( + color: Colors.grey[200], + child: const Center( + child: Icon( + Icons.shopping_bag, + color: Colors.grey, + size: 32, + ), + ), ), - ), + ), ), ), - // 商品信息 - 固定在容器底部 + // 商品信息 Expanded( child: Padding( - padding: const EdgeInsets.all(6), + padding: const EdgeInsets.all(8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.end, // 内容靠底部对齐 + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + // 商品名称 Text( product['name']?.toString() ?? '未知商品', style: const TextStyle( fontSize: 11, fontWeight: FontWeight.w500, + height: 1.2, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), - const SizedBox(height: 4), + // 价格和销量信息 Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -835,7 +852,7 @@ class _SearchResultPageState extends State with SingleTickerPr ), ), Text( - '已售 ${product['sales']?.toString() ?? '0'}', + '已售 ${Utils.graceNumber(product['sales'] ?? 0)}', style: const TextStyle( fontSize: 9, color: Colors.grey, diff --git a/lib/utils/index.dart b/lib/utils/index.dart index 8f279b9..96ebaa7 100644 --- a/lib/utils/index.dart +++ b/lib/utils/index.dart @@ -113,7 +113,16 @@ class Utils { } // 大数字转换 - static String graceNumber(int number) { + static String graceNumber(dynamic value) { + int number; + if (value is int) { + number = value; + } else if (value is String) { + number = int.tryParse(value) ?? 0; + } else { + number = 0; + } + if (number == 0) return "0"; if (number < 1000) {