浏览 SDKs · Flutter
平台
SDKsFlutter商业版

修改消息

使用 OpenIM Flutter SDK 修改已发送消息的内容。

复制

修改会话中一条已发送消息的正文内容。它与删除消息、撤回消息不同:删除仅影响消息是否对当前账号可见,撤回则向所有成员展示撤回状态;修改操作会替换消息内容并通过事件同步给所有会话成员。

参数说明

参数类型是否必填说明
conversationIDString是消息所属的会话 ID。Flutter 的 Message 本身没有该字段。
messageMessage是修改后的完整消息对象;必须保留原 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 到达和重新查询历史是三个独立阶段。需要确认最终内容时重新读取消息;重新查询失败不应被误报为修改请求失败。

相关页面