feat: Upgrade to 2.7.2
This commit is contained in:
parent
245b85f3ff
commit
3f4f7afb4e
11
CHANGELOG.md
11
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
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ class ChatLifeCycle {
|
|||
|
||||
/// Before a new message will be sent.
|
||||
/// Returns null can block the message from sending.
|
||||
Future<V2TimMessage?> Function(V2TimMessage message, [V2TimMessage? repliedMessage]) messageWillSend;
|
||||
// Future<V2TimMessage?> 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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier {
|
|||
String? _groupID;
|
||||
|
||||
Map<String, String> get groupUserShowName => _groupUserShowName;
|
||||
final List<String> _sendingMessageIDList = [];
|
||||
|
||||
set groupUserShowName(Map<String, String> 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<V2TimMessage> 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<V2TimMessage> 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<V2TimMessage> 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<V2TimValueCallback<V2TimMessage>?> 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<V2TimMessage> 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<V2TimValueCallback<V2TimMessage>?> reSendFailMessage({
|
||||
required V2TimMessage message,
|
||||
required String convID,
|
||||
required ConvType convType,
|
||||
List<String>? atUserIDList,
|
||||
}) async {
|
||||
await deleteMsg(message.msgID ?? "",
|
||||
id: message.id, webMessageInstance: message.messageFromWeb);
|
||||
int messageType = message.elemType;
|
||||
V2TimValueCallback<V2TimMessage>? 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<V2TimMessage> 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<V2TimValueCallback<V2TimMessage>?> 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();
|
||||
|
|
|
|||
|
|
@ -747,6 +747,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
|
|||
List<V2TimMessage> 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": {
|
||||
|
|
|
|||
|
|
@ -265,7 +265,7 @@ class MessageServiceImpl extends MessageService {
|
|||
|
||||
@override
|
||||
Future<V2TimValueCallback<V2TimMessage>> reSendMessage(
|
||||
{required String msgID, // 自己创建的ID
|
||||
{required String msgID,
|
||||
bool? onlineUserOnly}) async {
|
||||
final res = await TencentImSDKPlugin.v2TIMManager
|
||||
.getMessageManager()
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ abstract class MessageService {
|
|||
});
|
||||
|
||||
Future<V2TimValueCallback<V2TimMessage>> reSendMessage(
|
||||
{required String msgID, // 自己创建的ID
|
||||
{required String msgID,
|
||||
bool onlineUserOnly});
|
||||
|
||||
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage(
|
||||
|
|
|
|||
|
|
@ -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<TIMUIKitHistoryMessageListItem> with TickerProviderStateMixin {
|
||||
class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistoryMessageListItem> with SingleTickerProviderStateMixin {
|
||||
SuperTooltip? tooltip;
|
||||
late AnimationController _animationController;
|
||||
|
||||
// ignore: unused_field
|
||||
final MessageService _messageService = serviceLocator<MessageService>();
|
||||
|
|
@ -356,6 +353,12 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
|
|||
bool isShowWideToolTip = false;
|
||||
TapDownDetails? _tapDetails;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_animationController = AnimationController(duration: const Duration(seconds: 1), vsync: this)..repeat();
|
||||
}
|
||||
|
||||
closeTooltip() {
|
||||
tooltip?.close();
|
||||
}
|
||||
|
|
@ -877,6 +880,7 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
|
|||
|
||||
@override
|
||||
void dispose() {
|
||||
_animationController.dispose();
|
||||
super.dispose();
|
||||
if (tooltip?.isOpen ?? false) {
|
||||
tooltip?.close();
|
||||
|
|
@ -1052,11 +1056,28 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
|
|||
},
|
||||
child: Icon(Icons.error, color: theme.cautionColor, size: 18),
|
||||
)),
|
||||
if (isSelf && message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING && model.hasSendingMessageID(message.id ?? message.msgID!))
|
||||
FutureBuilder(
|
||||
future: Future.delayed(const Duration(seconds: 1)),
|
||||
builder: (BuildContext context, AsyncSnapshot<void> 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<TIMUIKitHistory
|
|||
if (model.chatConfig.isShowGroupReadingStatus &&
|
||||
model.chatConfig.isShowGroupMessageReadReceipt &&
|
||||
model.conversationType == ConvType.group &&
|
||||
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)
|
||||
TIMUIKitMessageReadReceipt(
|
||||
messageItem: widget.message,
|
||||
onTapAvatar: widget.onTapForOthersPortrait,
|
||||
|
|
|
|||
|
|
@ -622,9 +622,9 @@ class TIMUIKitMessageTooltipState
|
|||
alignment:
|
||||
TUIKitScreenUtils.getFormFactor(context) ==
|
||||
DeviceType.Mobile
|
||||
? WrapAlignment.spaceBetween
|
||||
? WrapAlignment.start
|
||||
: WrapAlignment.start,
|
||||
spacing: 4,
|
||||
spacing: 12,
|
||||
runSpacing: 8,
|
||||
children: [
|
||||
..._buildLongPressTipItem(theme, model, message),
|
||||
|
|
|
|||
|
|
@ -64,7 +64,6 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
|
|||
final TUIChatGlobalModel model = serviceLocator<TUIChatGlobalModel>();
|
||||
final MessageService _messageService = serviceLocator<MessageService>();
|
||||
Widget? imageItem;
|
||||
bool isSent = false;
|
||||
|
||||
@override
|
||||
didUpdateWidget(oldWidget) {
|
||||
|
|
@ -592,13 +591,6 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
|
|||
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<TIMUIKitImageElem> {
|
|||
}
|
||||
|
||||
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<TIMUIKitImageElem> {
|
|||
@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 =
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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("删除好友"),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ class _VideoScreenState extends TIMUIKitState<VideoScreen> {
|
|||
: 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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue