From 286b82c63b9995dde9c6247ae293d9bf43db5d71 Mon Sep 17 00:00:00 2001 From: hailin Date: Sat, 31 Jan 2026 07:10:05 -0800 Subject: [PATCH] =?UTF-8?q?fix(c2c):=20=E4=BF=AE=E5=A4=8D=20RangeError=20?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E5=8F=8A=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E7=81=B0=E8=89=B2=E9=A1=B5=E9=9D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:多处 [0] 访问空列表/空字符串导致 RangeError 崩溃 - api_client.dart: 后端错误 message 为空数组时 ?[0] 崩溃,改为安全检查 - c2c_order_detail_page.dart: nickname 和 phone 均为 null 时 name[0] 崩溃, 添加 isNotEmpty 检查和 '未知用户' 回退 - c2c_market_page.dart: makerNickname 为空字符串时 [0] 崩溃,添加 isNotEmpty 检查 这是 C2C 买方"待付款灰色页面"的根本原因:页面在渲染交易双方信息时 因空用户名 RangeError 崩溃,导致整个页面无法显示 Co-Authored-By: Claude Opus 4.5 --- frontend/mining-app/lib/core/network/api_client.dart | 3 ++- .../lib/presentation/pages/c2c/c2c_market_page.dart | 2 +- .../presentation/pages/c2c/c2c_order_detail_page.dart | 10 +++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/frontend/mining-app/lib/core/network/api_client.dart b/frontend/mining-app/lib/core/network/api_client.dart index 70202f29..98461bed 100644 --- a/frontend/mining-app/lib/core/network/api_client.dart +++ b/frontend/mining-app/lib/core/network/api_client.dart @@ -137,7 +137,8 @@ class ApiClient { if (statusCode == 401) { return UnauthorizedException(); } - final message = e.response?.data?['error']?['message']?[0] ?? '服务器错误'; + final messages = e.response?.data?['error']?['message']; + final message = (messages is List && messages.isNotEmpty) ? messages[0].toString() : '服务器错误'; return ServerException(message, statusCode: statusCode); default: return ServerException(e.message ?? '未知错误'); diff --git a/frontend/mining-app/lib/presentation/pages/c2c/c2c_market_page.dart b/frontend/mining-app/lib/presentation/pages/c2c/c2c_market_page.dart index f4a2cd66..9a0cc6ee 100644 --- a/frontend/mining-app/lib/presentation/pages/c2c/c2c_market_page.dart +++ b/frontend/mining-app/lib/presentation/pages/c2c/c2c_market_page.dart @@ -314,7 +314,7 @@ class _C2cMarketPageState extends ConsumerState ), child: Center( child: Text( - (order.makerNickname ?? order.makerPhone ?? 'U')[0].toUpperCase(), + ((order.makerNickname?.isNotEmpty == true ? order.makerNickname : null) ?? (order.makerPhone?.isNotEmpty == true ? order.makerPhone : null) ?? 'U')[0].toUpperCase(), style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, diff --git a/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart b/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart index 26fc9bf6..87ebc1bd 100644 --- a/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart +++ b/frontend/mining-app/lib/presentation/pages/c2c/c2c_order_detail_page.dart @@ -754,7 +754,9 @@ class _C2cOrderDetailPageState extends ConsumerState { // 发布方 _buildParticipantRow( label: order.isBuy ? '买方 (发布者)' : '卖方 (发布者)', - name: order.makerNickname ?? _maskPhone(order.makerPhone ?? ''), + name: order.makerNickname?.isNotEmpty == true + ? order.makerNickname! + : (order.makerPhone?.isNotEmpty == true ? _maskPhone(order.makerPhone!) : '未知用户'), isMe: isMaker, ), const Divider(height: 24), @@ -762,7 +764,9 @@ class _C2cOrderDetailPageState extends ConsumerState { if (order.takerAccountSequence != null) _buildParticipantRow( label: order.isBuy ? '卖方 (接单者)' : '买方 (接单者)', - name: order.takerNickname ?? _maskPhone(order.takerPhone ?? ''), + name: order.takerNickname?.isNotEmpty == true + ? order.takerNickname! + : (order.takerPhone?.isNotEmpty == true ? _maskPhone(order.takerPhone!) : '未知用户'), isMe: isTaker, ) else @@ -791,7 +795,7 @@ class _C2cOrderDetailPageState extends ConsumerState { ), child: Center( child: Text( - name[0].toUpperCase(), + name.isNotEmpty ? name[0].toUpperCase() : 'U', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold,