diff --git a/CHANGELOG.md b/CHANGELOG.md index 49a7dd2..a8a9ed2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 2.7.2 +* Fix the issue where failed messages cannot be resent. +* Fix the issue where image messages that failed to send are not loaded using the local path. +* Fix the issue where the screen turns white after dissolving or leaving a group. +* Optimize the process of sending messages. +* Optimize the alignment of buttons in the long-press message menu. +* Limit the version range of the third-party library extended_image. + +# 2.7.1 +* Fixed the 'keepAspectRatio' parameter error. + # 2.7.0 ## Breaking Changes diff --git a/lib/business_logic/life_cycle/chat_life_cycle.dart b/lib/business_logic/life_cycle/chat_life_cycle.dart index 86f6a2e..cf65dd7 100644 --- a/lib/business_logic/life_cycle/chat_life_cycle.dart +++ b/lib/business_logic/life_cycle/chat_life_cycle.dart @@ -11,7 +11,7 @@ class ChatLifeCycle { /// Before a new message will be sent. /// Returns null can block the message from sending. - Future Function(V2TimMessage message, [V2TimMessage? repliedMessage]) messageWillSend; + // Future Function(V2TimMessage message, [V2TimMessage? repliedMessage]) messageWillSend; /// After a new message been sent. MessageFunctionNullCallback messageDidSend; @@ -43,7 +43,7 @@ class ChatLifeCycle { this.shouldDeleteMessage = DefaultLifeCycle.defaultAsyncBooleanSolution, this.messageDidSend = DefaultLifeCycle.defaultNullCallbackSolution, this.didGetHistoricalMessageList = DefaultLifeCycle.defaultMessageListSolution, - this.messageWillSend = DefaultLifeCycle.defaultTwoMessagesSolution, + // this.messageWillSend = DefaultLifeCycle.defaultTwoMessagesSolution, this.modifiedMessageWillMount = DefaultLifeCycle.defaultMessageSolution, this.newMessageWillMount = DefaultLifeCycle.defaultMessageSolution, this.messageShouldMount = DefaultLifeCycle.defaultBooleanSolution, diff --git a/lib/business_logic/separate_models/tui_chat_model_tools.dart b/lib/business_logic/separate_models/tui_chat_model_tools.dart index 97040e8..2c17dd4 100644 --- a/lib/business_logic/separate_models/tui_chat_model_tools.dart +++ b/lib/business_logic/separate_models/tui_chat_model_tools.dart @@ -102,7 +102,6 @@ class TUIChatModelTools { messageInfo.timestamp = (DateTime.now().millisecondsSinceEpoch / 1000).ceil(); messageInfo.isSelf = true; - messageInfo.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; messageInfo.id = id; return messageInfo; diff --git a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart index 5df4e65..88355a0 100644 --- a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart +++ b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart @@ -68,6 +68,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { String? _groupID; Map get groupUserShowName => _groupUserShowName; + final List _sendingMessageIDList = []; set groupUserShowName(Map value) { _groupUserShowName = value; @@ -688,6 +689,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { }) : ""), ); + removeSendingMessageID(id); if (isEditStatusMessage == false && globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { @@ -724,18 +726,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, textATMessageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -756,25 +752,19 @@ class TUIChatSeparateViewModel extends ChangeNotifier { {required String data, required String convID, required ConvType convType}) async { - final textATMessageInfo = + final customMessageInfo = await _messageService.createCustomMessage(data: data); List currentHistoryMsgList = getOriginMessageList(); - final messageInfo = textATMessageInfo!.messageInfo; + final messageInfo = customMessageInfo!.messageInfo; if (messageInfo != null) { final messageInfoWithSender = - tools.setUserInfoForMessage(messageInfo, textATMessageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + tools.setUserInfoForMessage(messageInfo, customMessageInfo.id!); + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -783,10 +773,10 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return _sendMessage( convID: convID, - id: textATMessageInfo.id as String, + id: customMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo( - textATMessageInfo.messageInfo!, convID, convType)); + customMessageInfo.messageInfo!, convID, convType)); } return null; } @@ -796,25 +786,19 @@ class TUIChatSeparateViewModel extends ChangeNotifier { required String data, required String convID, required ConvType convType}) async { - final textMessageInfo = + final faceMessageInfo = await _messageService.createFaceMessage(index: index, data: data); List currentHistoryMsgList = getOriginMessageList(); - final messageInfo = textMessageInfo!.messageInfo; + final messageInfo = faceMessageInfo!.messageInfo; if (messageInfo != null) { final messageInfoWithSender = - tools.setUserInfoForMessage(messageInfo, textMessageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + tools.setUserInfoForMessage(messageInfo, faceMessageInfo.id!); + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -823,11 +807,11 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return _sendMessage( convID: convID, - id: textMessageInfo.id as String, + id: faceMessageInfo.id as String, convType: convType, - messageInfo: lifeCycleMsg ?? messageInfoWithSender, + messageInfo: messageInfoWithSender, offlinePushInfo: tools.buildMessagePushInfo( - textMessageInfo.messageInfo!, convID, convType)); + faceMessageInfo.messageInfo!, convID, convType)); } return null; } @@ -845,18 +829,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, soundMessageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -899,6 +877,8 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { V2TimMessage messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, textMessageInfo.id!); + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); final hasNickName = _repliedMessage?.nickName != null && _repliedMessage?.nickName != ""; final cloudCustomData = { @@ -914,17 +894,9 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } }; messageInfoWithSender.cloudCustomData = json.encode(cloudCustomData); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend( - messageInfoWithSender, repliedMessage); - if (lifeCycleMsg == null) { - return null; - } - } List currentHistoryMsgList = getOriginMessageList(); currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -932,7 +904,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { _repliedMessage = null; final sendMsgRes = await _messageService.sendMessage( cloudCustomData: - TencentUtils.checkString(lifeCycleMsg?.cloudCustomData) ?? + TencentUtils.checkString(messageInfoWithSender?.cloudCustomData) ?? json.encode(cloudCustomData), id: textMessageInfo.id as String, offlinePushInfo: tools.buildMessagePushInfo( @@ -1007,19 +979,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, imageMessageInfo.id); - - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -1028,7 +993,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return _sendMessage( convID: convID, - messageInfo: lifeCycleMsg ?? messageInfoWithSender, + messageInfo: messageInfoWithSender, id: imageMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo( @@ -1058,18 +1023,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, videoMessageInfo.id); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -1078,7 +1037,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return _sendMessage( convID: convID, - messageInfo: lifeCycleMsg ?? messageInfoWithSender, + messageInfo: messageInfoWithSender, id: videoMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo( @@ -1112,19 +1071,13 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, fileMessageInfo.id); + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); messageInfoWithSender.fileElem!.fileSize = size; - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -1133,7 +1086,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return _sendMessage( convID: convID, - messageInfo: lifeCycleMsg ?? messageInfoWithSender, + messageInfo: messageInfoWithSender, id: fileMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo( @@ -1156,18 +1109,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, locationMessageInfo.id); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -1197,16 +1144,9 @@ class TUIChatSeparateViewModel extends ChangeNotifier { await _messageService.createForwardMessage(msgID: message.msgID!); final messageInfo = forwardMessageInfo!.messageInfo; if (messageInfo != null) { - final messageInfoWithSender = - tools.setUserInfoForMessage(messageInfo, forwardMessageInfo.id); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = - await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } + tools.setUserInfoForMessage(messageInfo, forwardMessageInfo.id); + messageInfo.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); _sendMessage( id: forwardMessageInfo.id!, convID: convID, @@ -1242,17 +1182,9 @@ class TUIChatSeparateViewModel extends ChangeNotifier { compatibleText: TIM_t("该版本不支持此消息")); final messageInfo = mergerMessageInfo!.messageInfo; if (messageInfo != null) { - final messageInfoWithSender = - tools.setUserInfoForMessage(messageInfo, mergerMessageInfo.id); - - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = - await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - continue; - } - } + tools.setUserInfoForMessage(messageInfo, mergerMessageInfo.id); + messageInfo.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); _sendMessage( id: mergerMessageInfo.id!, convID: convID, @@ -1267,96 +1199,34 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } - Future?> reSendMessage( - {required String msgID, - required String convID, - bool? onlineUserOnly}) async { - final res = await _messageService.reSendMessage( - msgID: msgID, onlineUserOnly: onlineUserOnly ?? false); - final messageInfo = res.data; - List currentHistoryMsgList = getOriginMessageList(); - // final messageInfo = textMessageInfo!.messageInfo; - if (messageInfo != null) { - final messageInfoWithSender = - tools.setUserInfoForMessage(messageInfo, messageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(convID, currentHistoryMsgList); - } - return res; - } - - // 注意重发消息需要先删除之前发送失败的图 Future?> reSendFailMessage({ required V2TimMessage message, required String convID, required ConvType convType, - List? atUserIDList, }) async { - await deleteMsg(message.msgID ?? "", - id: message.id, webMessageInstance: message.messageFromWeb); - int messageType = message.elemType; - V2TimValueCallback? res; - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) { - String text = message.textElem!.text!; - if (_repliedMessage != null) { - res = await sendReplyMessage( - text: text, - convID: convID, - convType: convType, - atUserIDList: atUserIDList, - ); - } else { - res = await sendTextMessage( - text: text, convID: convID, convType: convType); - } + List currentHistoryMsgList = getOriginMessageList(); + if (currentHistoryMsgList.isEmpty) { + return null; } - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_SOUND) { - String soundPath = message.soundElem!.path!; - int duration = message.soundElem!.duration!; - res = await sendSoundMessage( - soundPath: soundPath, - duration: duration, - convID: convID, - convType: convType); + + int messageIndex = currentHistoryMsgList.indexWhere((element) => element.msgID == message.msgID); + if (messageIndex != -1) { + // 取出界面的消息列表,设置转发的这条消息状态为 sending + currentHistoryMsgList[messageIndex].status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(message.msgID); + globalModel.setMessageList(convID, currentHistoryMsgList); + // 重发该消息 + final res = await _messageService.reSendMessage( + msgID: message.msgID ?? "", onlineUserOnly: false); + removeSendingMessageID(message.msgID ?? ""); + final messageInfo = res.data; + // 重发完成后,更新消息列表中的这条消息 + currentHistoryMsgList[messageIndex] = messageInfo!; + globalModel.setMessageList(convID, currentHistoryMsgList); + return res; } - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE) { - String imagePath = message.imageElem!.path!; - res = await sendImageMessage( - imagePath: imagePath, convID: convID, convType: convType); - } - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO) { - String videoPath = message.videoElem?.videoPath ?? ""; - int duration = message.videoElem?.duration ?? 0; - String snapshotPath = message.videoElem?.snapshotPath ?? ""; - res = await sendVideoMessage( - videoPath: videoPath, - duration: duration, - snapshotPath: snapshotPath, - convID: convID, - convType: convType); - } - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_FILE) { - String filePath = message.fileElem?.path ?? ""; - int size = message.fileElem?.fileSize ?? 0; - res = await sendFileMessage( - filePath: filePath, size: size, convID: convID, convType: convType); - } - if (messageType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) { - String data = message.customElem?.data ?? ""; - res = await sendCustomMessage( - convID: convID, convType: convType, data: data); - } - return res; + + return null; } Future?> sendTextMessage( @@ -1372,18 +1242,12 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, textMessageInfo.id!); - V2TimMessage? lifeCycleMsg; - if (lifeCycle?.messageWillSend != null) { - lifeCycleMsg = await lifeCycle?.messageWillSend(messageInfoWithSender); - if (lifeCycleMsg == null) { - return null; - } - } - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, + messageInfoWithSender, ...currentHistoryMsgList ]; globalModel.setMessageList(conversationID, currentHistoryMsgList); @@ -1417,7 +1281,8 @@ class TUIChatSeparateViewModel extends ChangeNotifier { final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id!) : messageInfo; - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; + addSendingMessageID(messageInfo.id); if (globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { currentHistoryMsgList = [ @@ -1574,6 +1439,26 @@ class TUIChatSeparateViewModel extends ChangeNotifier { conversationID, HistoryMessagePosition.bottom); } + // 添加发送中的消息的 id 或者 msgID(id 不存在时使用 msgID) + void addSendingMessageID(String? id) { + if (id?.isNotEmpty == true) { + _sendingMessageIDList.add(id!); + } + } + + // 移除发送中的消息的 id 或者 msgID(id 不存在时使用 msgID) + void removeSendingMessageID(String id) { + bool hasID = _sendingMessageIDList.contains(id); + if (hasID) { + _sendingMessageIDList.remove(id); + } + } + + // 内存中有发送中的消息的 id 或者 msgID(id 不存在时使用 msgID) + bool hasSendingMessageID(String id) { + return _sendingMessageIDList.contains(id); + } + @override void dispose() { globalModel.clearCurrentConversation(); diff --git a/lib/business_logic/view_models/tui_chat_global_model.dart b/lib/business_logic/view_models/tui_chat_global_model.dart index 09971ff..874e179 100644 --- a/lib/business_logic/view_models/tui_chat_global_model.dart +++ b/lib/business_logic/view_models/tui_chat_global_model.dart @@ -747,6 +747,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass { List currentHistoryMsgList = _messageListMap[convID] ?? []; if (messageInfo != null) { final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id!) : messageInfo; + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; currentHistoryMsgList = [messageInfoWithSender, ...currentHistoryMsgList]; setMessageList(convID, currentHistoryMsgList); if (loadingMessage[convID] != null && loadingMessage[convID]!.isNotEmpty) { @@ -799,7 +800,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass { if (messageInfo != null) { final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id ?? textMessageInfo.id ?? "") : messageInfo; - + messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING; final hasNickName = messageBeenReplied.nickName != null && messageBeenReplied.nickName != ""; final cloudCustomData = { "messageReply": { diff --git a/lib/data_services/message/message_service_implement.dart b/lib/data_services/message/message_service_implement.dart index bf496ba..151a1c7 100644 --- a/lib/data_services/message/message_service_implement.dart +++ b/lib/data_services/message/message_service_implement.dart @@ -265,7 +265,7 @@ class MessageServiceImpl extends MessageService { @override Future> reSendMessage( - {required String msgID, // 自己创建的ID + {required String msgID, bool? onlineUserOnly}) async { final res = await TencentImSDKPlugin.v2TIMManager .getMessageManager() diff --git a/lib/data_services/message/message_services.dart b/lib/data_services/message/message_services.dart index 99e9437..8deace5 100644 --- a/lib/data_services/message/message_services.dart +++ b/lib/data_services/message/message_services.dart @@ -83,7 +83,7 @@ abstract class MessageService { }); Future> reSendMessage( - {required String msgID, // 自己创建的ID + {required String msgID, bool onlineUserOnly}); Future> modifyMessage( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart index 1dbffdf..9fb90b5 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart @@ -207,9 +207,6 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { /// Control avatar hide or show final bool showAvatar; - /// message sending status - final bool showMessageSending; - /// message is read status final bool showMessageReadRecipt; @@ -283,7 +280,6 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { this.messageItemBuilder, this.onLongPressForOthersHeadPortrait, this.showAvatar = true, - this.showMessageSending = true, this.showMessageReadRecipt = true, this.allowLongPress = true, this.toolTipsConfig, @@ -343,8 +339,9 @@ class TipsActionItem extends TIMUIKitStatelessWidget { } } -class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState with TickerProviderStateMixin { +class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState with SingleTickerProviderStateMixin { SuperTooltip? tooltip; + late AnimationController _animationController; // ignore: unused_field final MessageService _messageService = serviceLocator(); @@ -356,6 +353,12 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState snapshot) { + if (snapshot.connectionState == ConnectionState.done && model.hasSendingMessageID(message.id ?? message.msgID!)) { + return Container( + padding: const EdgeInsets.only(bottom: 3), + margin: const EdgeInsets.only(right: 6), + child: RotationTransition( + turns: Tween(begin: 0.0, end: 1.0).animate(_animationController), + child: Icon(Icons.rotate_right, color: theme.cautionColor, size: 18), + ), + ); + } else { + return Container(); + } + }, + ), if (model.chatConfig.isShowReadingStatus && widget.showMessageReadRecipt && model.conversationType == ConvType.c2c && - isSelf && - (message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC || message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)) + isSelf && message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC) Container( padding: const EdgeInsets.only(bottom: 3), margin: const EdgeInsets.only(right: 6), @@ -1068,8 +1089,7 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState { final TUIChatGlobalModel model = serviceLocator(); final MessageService _messageService = serviceLocator(); Widget? imageItem; - bool isSent = false; @override didUpdateWidget(oldWidget) { @@ -592,13 +591,6 @@ class _TIMUIKitImageElem extends TIMUIKitState { initImages(); } - bool isNeedShowLocalPath() { - final current = (DateTime.now().millisecondsSinceEpoch / 1000).ceil(); - final timeStamp = widget.message.timestamp ?? current; - return (widget.message.isSelf ?? true) && - (isSent || current - timeStamp < 300); - } - Widget? _renderImage(dynamic heroTag, TUITheme theme, {V2TimImage? originalImg, V2TimImage? smallImg}) { @@ -623,7 +615,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { } try { - if ((isNeedShowLocalPath() && + if ((widget.message.isSelf! && widget.message.imageElem!.path != null && widget.message.imageElem!.path!.isNotEmpty && File(widget.message.imageElem!.path!).existsSync())) { @@ -680,9 +672,6 @@ class _TIMUIKitImageElem extends TIMUIKitState { @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final theme = value.theme; - if (widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) { - isSent = true; - } final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; final heroTag = diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart index 88f5bfd..c6796d3 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart @@ -210,9 +210,6 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget { actions: [ CupertinoActionSheetAction( onPressed: () async { - Navigator.pop( - context, - ); final res = await sdkInstance.dismissGroup(groupID: groupID); if (res.code == 0) { await sdkInstance diff --git a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart index 7576bb3..0b99b99 100644 --- a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart +++ b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart @@ -304,7 +304,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass { border: Border(bottom: BorderSide(color: theme.weakDividerColor))), child: Text( - TIM_t("清除好友"), + TIM_t("删除好友"), style: TextStyle(color: theme.cautionColor, fontSize: 17), ), ), @@ -392,7 +392,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass { handleDeleteFriend(); }, color: theme.cautionColor ?? Colors.red, - text: TIM_t("清除好友"), + text: TIM_t("删除好友"), ); } diff --git a/lib/ui/widgets/video_screen.dart b/lib/ui/widgets/video_screen.dart index 225df23..fa3e602 100644 --- a/lib/ui/widgets/video_screen.dart +++ b/lib/ui/widgets/video_screen.dart @@ -232,7 +232,7 @@ class _VideoScreenState extends TIMUIKitState { : VideoPlayerController.networkUrl( Uri.parse(widget.videoElement.localVideoUrl!), )) - : (TencentUtils.checkString(widget.videoElement.videoPath) != null || widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) + : ((TencentUtils.checkString(widget.videoElement.videoPath) != null || widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) && File(widget.videoElement.videoPath!).existsSync()) ? VideoPlayerController.file(File(widget.videoElement.videoPath!)) : (TencentUtils.checkString(widget.videoElement.localVideoUrl) == null) ? VideoPlayerController.networkUrl( diff --git a/pubspec.yaml b/pubspec.yaml index ebc232a..b710286 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: tencent_cloud_chat_uikit description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences. -version: 2.7.1 +version: 2.7.2 homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn repository: https://github.com/TencentCloud/chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html @@ -43,7 +43,7 @@ dependencies: wechat_assets_picker: ^8.9.0-dev.1 wechat_camera_picker: ^4.2.0-dev.2 flutter_easyrefresh: ^2.2.1 - extended_image: ^8.2.0 + extended_image: '>=8.2.0 <=8.2.4' extended_text_field: ^15.0.0 extended_text: ^13.0.0 package_info_plus: ^4.0.1