修改消息
使用 OpenIM Flutter SDK 修改已发送消息的内容。
修改会话中一条已发送消息的正文内容。它与删除消息、撤回消息不同:删除仅影响消息是否对当前账号可见,撤回则向所有成员展示撤回状态;修改操作会替换消息内容并通过事件同步给所有会话成员。
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
conversationID | String | 是 | 消息所属的会话 ID。Flutter 的 Message 本身没有该字段。 |
message | Message | 是 | 修改后的完整消息对象;必须保留原 clientMsgID 与路由字段。 |
final clientMsgID = message.clientMsgID;
final textElem = message.textElem;
if (clientMsgID == null || clientMsgID.isEmpty || textElem == null) {
throw StateError('Message cannot be edited');
}
final previousText = textElem.content;
textElem.content = editedText;
try {
await OpenIM.iMManager.messageManager.modifyMessage(
conversationID: conversationID,
message: message,
);
replaceMessage(conversationID, clientMsgID, message);
} catch (_) {
textElem.content = previousText;
rethrow;
}该方法不是局部更新。应以当前完整消息为基础,只修改目标 element,保留 clientMsgID、路由、发送者、时间和其他字段。允许修改的发送者、时间窗口和消息类型由 OpenIMServer 校验;失败时应恢复原内容或重新查询,不能只在本地保留编辑结果。
返回结果
该方法返回 Future<void>,成功表示服务端已接受并持久化消息修改请求。当前客户端可先按复合标识 conversationID:clientMsgID 预览提交的最新内容,并等待后续事件通知完成最终确认。
Future 成功不代表所有客户端界面已经更新。事件也可能来自其他设备或其他有权限的操作,不能假设每次 callback 都对应当前页面刚完成的调用。
监听消息修改
消息修改事件在此集中监听与处理。onMessageModified 回调携带单个修改后的 Message;由于 Flutter 的消息对象没有 conversationID,应先解析路由,再按 conversationID:clientMsgID 替换原消息:
Future<void> handleMessageModified(Message message) async {
final clientMsgID = message.clientMsgID;
if (clientMsgID == null || clientMsgID.isEmpty) return;
final conversationID = await resolveMessageConversationID(
message,
currentUserID,
);
if (conversationID == null) return;
replaceMessage(conversationID, clientMsgID, message);
}会话 ID 解析辅助逻辑根据 sessionType、groupID、sendID、recvID 和当前登录用户确定消息来源,再通过会话 ID 计算接口取得对应会话 ID。完整辅助函数实现请参考接收消息。客户端必须以 conversationID:clientMsgID 为合并标识,严禁按数组位置、显示文本或当前分页长度匹配消息。
该 handler 应纳入应用唯一的 OnAdvancedMsgListener,集中设置入口见事件概览。SDK 没有 remove 或 unset API;退出登录或切换账号时,应停止向旧账号状态分发事件,并用新账号的完整 listener 覆盖。
Future 成功、onMessageModified 到达和重新查询历史是三个独立阶段。需要确认最终内容时重新读取消息;重新查询失败不应被误报为修改请求失败。
相关页面
这个页面有帮助吗?