diff --git a/lib/ui/party_room/utils/party_room_utils.dart b/lib/ui/party_room/utils/party_room_utils.dart index 5fa218a..06d8fd8 100644 --- a/lib/ui/party_room/utils/party_room_utils.dart +++ b/lib/ui/party_room/utils/party_room_utils.dart @@ -1,5 +1,6 @@ import 'package:fixnum/fixnum.dart'; import 'package:intl/intl.dart'; +import 'package:starcitizen_doctor/common/conf/url_conf.dart'; class PartyRoomUtils { static final DateFormat dateTimeFormatter = DateFormat('yyyy-MM-dd HH:mm:ss'); @@ -19,4 +20,20 @@ class PartyRoomUtils { } return dateTimeFormatter.format(dateTime); } + + /// 统一处理 avatarUrl + /// 对于 http/https 开头的直接返回,否则使用旧的拼接规则 + static String? getAvatarUrl(String? avatarUrl) { + if (avatarUrl == null || avatarUrl.isEmpty) { + return null; + } + + // 如果已经是完整的 URL,直接返回 + if (avatarUrl.startsWith('http://') || avatarUrl.startsWith('https://')) { + return avatarUrl; + } + + // 否则使用 RSI 头像基础 URL 拼接 + return '${URLConf.rsiAvatarBaseUrl}$avatarUrl'; + } } diff --git a/lib/ui/party_room/widgets/detail/party_room_member_list.dart b/lib/ui/party_room/widgets/detail/party_room_member_list.dart index 0be9068..f6b46e4 100644 --- a/lib/ui/party_room/widgets/detail/party_room_member_list.dart +++ b/lib/ui/party_room/widgets/detail/party_room_member_list.dart @@ -1,9 +1,9 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter/services.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/generated/proto/partroom/partroom.pb.dart'; import 'package:starcitizen_doctor/provider/party_room.dart'; +import 'package:starcitizen_doctor/ui/party_room/utils/party_room_utils.dart'; import 'package:starcitizen_doctor/widgets/src/cache_image.dart'; /// 成员列表侧边栏 @@ -43,7 +43,7 @@ class PartyRoomMemberItem extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final avatarUrl = member.avatarUrl.isNotEmpty ? '${URLConf.rsiAvatarBaseUrl}${member.avatarUrl}' : null; + final avatarUrl = PartyRoomUtils.getAvatarUrl(member.avatarUrl); final partyRoomState = ref.watch(partyRoomProvider); final currentUserId = partyRoomState.auth.userInfo?.gameUserId ?? ''; final isSelf = member.gameUserId == currentUserId; diff --git a/lib/ui/party_room/widgets/detail/party_room_message_list.dart b/lib/ui/party_room/widgets/detail/party_room_message_list.dart index 3925797..5963795 100644 --- a/lib/ui/party_room/widgets/detail/party_room_message_list.dart +++ b/lib/ui/party_room/widgets/detail/party_room_message_list.dart @@ -1,9 +1,9 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/generated/proto/partroom/partroom.pb.dart' as partroom; import 'package:starcitizen_doctor/provider/party_room.dart'; +import 'package:starcitizen_doctor/ui/party_room/utils/party_room_utils.dart'; import 'package:starcitizen_doctor/widgets/src/cache_image.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:flutter/services.dart'; @@ -388,7 +388,7 @@ class _MessageItem extends ConsumerWidget { event.type == partroom.RoomEventType.MEMBER_KICKED || event.type == partroom.RoomEventType.OWNER_CHANGED) { if (event.hasMember() && event.member.avatarUrl.isNotEmpty) { - return '${URLConf.rsiAvatarBaseUrl}${event.member.avatarUrl}'; + return PartyRoomUtils.getAvatarUrl(event.member.avatarUrl); } } return null; diff --git a/lib/ui/party_room/widgets/party_room_list_page.dart b/lib/ui/party_room/widgets/party_room_list_page.dart index 5768e7a..2bf7a6e 100644 --- a/lib/ui/party_room/widgets/party_room_list_page.dart +++ b/lib/ui/party_room/widgets/party_room_list_page.dart @@ -8,10 +8,10 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_tilt/flutter_tilt.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/generated/proto/partroom/partroom.pb.dart'; import 'package:starcitizen_doctor/provider/party_room.dart'; import 'package:starcitizen_doctor/ui/party_room/party_room_ui_model.dart'; +import 'package:starcitizen_doctor/ui/party_room/utils/party_room_utils.dart'; import 'package:starcitizen_doctor/ui/party_room/widgets/create_room_dialog.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart'; @@ -132,7 +132,7 @@ class PartyRoomListPage extends HookConsumerWidget { (m) => m.gameUserId == currentRoom.ownerGameId, orElse: () => RoomMember(), ); - final avatarUrl = owner.avatarUrl.isNotEmpty ? '${URLConf.rsiAvatarBaseUrl}${owner.avatarUrl}' : ''; + final avatarUrl = PartyRoomUtils.getAvatarUrl(owner.avatarUrl) ?? ''; return Bounce( duration: Duration(milliseconds: 230), @@ -276,7 +276,7 @@ class PartyRoomListPage extends HookConsumerWidget { } Widget _buildRoomCard(BuildContext context, WidgetRef ref, PartyRoom partyRoom, RoomListItem room, int index) { - final avatarUrl = room.ownerAvatar.isNotEmpty ? '${URLConf.rsiAvatarBaseUrl}${room.ownerAvatar}' : ''; + final avatarUrl = PartyRoomUtils.getAvatarUrl(room.ownerAvatar) ?? ''; final partyRoomState = ref.watch(partyRoomProvider); final isCurrentRoom = partyRoomState.room.isInRoom && partyRoomState.room.roomUuid == room.roomUuid; return GridItemAnimator(