气泡框修复

This commit is contained in:
roxy 2026-06-03 18:46:16 +08:00
parent ef11d0f01b
commit 7bce08a3b4
3 changed files with 59 additions and 35 deletions

View File

@ -21,6 +21,7 @@ import 'package:yumi/shared/tools/sc_date_utils.dart';
import 'package:yumi/shared/tools/sc_loading_manager.dart';
import 'package:yumi/shared/tools/sc_message_utils.dart';
import 'package:yumi/shared/tools/sc_user_id_utils.dart';
import 'package:yumi/shared/tools/sc_chat_bubble_message_utils.dart';
import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart';
import 'package:yumi/shared/business_logic/models/res/login_res.dart';
import 'package:yumi/services/audio/rtm_manager.dart';
@ -56,7 +57,6 @@ import 'package:yumi/shared/tools/sc_cp_relation_notice_utils.dart';
import 'package:yumi/shared/tools/sc_keybord_util.dart';
import 'package:yumi/shared/tools/sc_message_notifier.dart';
import 'package:yumi/shared/tools/sc_path_utils.dart';
import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart';
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
import 'package:yumi/services/auth/user_profile_manager.dart';
import 'package:yumi/modules/index/main_route.dart';
@ -2623,10 +2623,9 @@ class _MessageItem extends StatelessWidget {
}
Widget _buildTextBubble(String content) {
final chatBubble =
(message.isSelf ?? false)
? _currentUserChatBubble()
: _senderProfile()?.getChatBox();
final chatBubble = scDecodeChatBubbleFromCloudCustomData(
message.cloudCustomData,
);
final chatBubbleUrl = _resolveChatBubbleImageUrl(chatBubble);
if (chatBubbleUrl.isNotEmpty) {
return _buildVipTextBubble(content: content, imageUrl: chatBubbleUrl);
@ -2634,36 +2633,6 @@ class _MessageItem extends StatelessWidget {
return _buildDefaultTextBubble(content);
}
PropsResources? _currentUserChatBubble() {
final currentUser = AccountStorage().getCurrentUser();
final memoryBubble = currentUser?.userProfile?.getChatBox();
if (_resolveChatBubbleImageUrl(memoryBubble).isNotEmpty) {
return memoryBubble;
}
if (currentUser?.userProfile != null) {
return memoryBubble;
}
final userJson = DataPersistence.getCurrentUser();
if (userJson.isEmpty) {
return memoryBubble;
}
try {
return SocialChatLoginRes.fromJson(
jsonDecode(userJson),
).userProfile?.getChatBox();
} catch (_) {
return memoryBubble;
}
}
SocialChatUserProfile? _senderProfile() {
if (message.isSelf ?? false) {
return AccountStorage().getCurrentUser()?.userProfile;
}
return friend;
}
Widget _buildDefaultTextBubble(String content) {
return Container(
decoration: BoxDecoration(

View File

@ -14,6 +14,7 @@ import 'package:yumi/shared/tools/sc_message_utils.dart';
import 'package:yumi/shared/tools/sc_path_utils.dart';
import 'package:yumi/shared/tools/sc_room_top_layer_guard.dart';
import 'package:yumi/shared/tools/sc_room_utils.dart';
import 'package:yumi/shared/tools/sc_chat_bubble_message_utils.dart';
import 'package:yumi/shared/tools/sc_cp_gift_relation_utils.dart';
import 'package:yumi/shared/tools/sc_cp_relation_broadcast_assets.dart';
import 'package:yumi/shared/tools/sc_cp_relation_notice_utils.dart';
@ -2643,6 +2644,9 @@ class RealTimeMessagingManager extends ChangeNotifier {
if (createTextMessageRes.code == 0) {
//
String id = createTextMessageRes.data!.id!;
final chatBubbleCloudCustomData = scEncodeChatBubbleCloudCustomData(
AccountStorage().getCurrentUser()?.userProfile?.getChatBox(),
);
//
// sendMessage时receiver则发个人用户单聊消息
// groupID则发群组消息
@ -2656,6 +2660,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
receiver: toConversation.userID!, // id
needReadReceipt: true,
groupID: '', //
cloudCustomData: chatBubbleCloudCustomData,
);
if (sendMessageRes.code == 0) {
//

View File

@ -0,0 +1,50 @@
import 'dart:convert';
import 'package:yumi/shared/business_logic/models/res/login_res.dart';
const String scChatBubbleCloudDataKey = 'scChatBubble';
String? scEncodeChatBubbleCloudCustomData(PropsResources? chatBubble) {
if (!_hasChatBubbleImage(chatBubble)) {
return null;
}
return jsonEncode(<String, dynamic>{
scChatBubbleCloudDataKey: chatBubble!.toJson(),
});
}
PropsResources? scDecodeChatBubbleFromCloudCustomData(String? cloudCustomData) {
final raw = cloudCustomData?.trim();
if (raw == null || raw.isEmpty) {
return null;
}
try {
final decoded = jsonDecode(raw);
if (decoded is! Map) {
return null;
}
final data = decoded[scChatBubbleCloudDataKey];
if (data is Map) {
return PropsResources.fromJson(data);
}
} catch (_) {}
return null;
}
bool _hasChatBubbleImage(PropsResources? resource) {
if (resource == null) {
return false;
}
return <String?>[
resource.imSendCoverUrl,
resource.imOpenedUrl,
resource.imOpenedUrlTwo,
resource.imNotOpenedUrl,
resource.roomSendCoverUrl,
resource.roomOpenedUrl,
resource.roomNotOpenedUrl,
resource.cover,
resource.expand,
resource.sourceUrl,
].any((value) => (value?.trim() ?? '').isNotEmpty);
}