fix(c2c): 修复 RangeError 崩溃及订单详情灰色页面问题

根因:多处 [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 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-31 07:10:05 -08:00
parent 8e63547a3e
commit 286b82c63b
3 changed files with 10 additions and 5 deletions

View File

@ -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 ?? '未知错误');

View File

@ -314,7 +314,7 @@ class _C2cMarketPageState extends ConsumerState<C2cMarketPage>
),
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,

View File

@ -754,7 +754,9 @@ class _C2cOrderDetailPageState extends ConsumerState<C2cOrderDetailPage> {
//
_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<C2cOrderDetailPage> {
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<C2cOrderDetailPage> {
),
child: Center(
child: Text(
name[0].toUpperCase(),
name.isNotEmpty ? name[0].toUpperCase() : 'U',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,