浏览 SDKs · Flutter
平台
SDKsFlutter

撤回消息

撤回已发送消息,并处理其他端收到的撤回通知。

复制

撤回让其他客户端把原消息显示为撤回态。OpenIMServer 会校验消息状态、操作用户和可撤回时间范围。

如果只需要从当前账号侧移除消息,使用删除消息,不要用撤回替代。需要修改已发送消息内容时,使用修改消息。

参数说明

参数类型是否必填说明
conversationIDString是消息所属的会话 ID。Flutter 的 Message 本身没有该字段。
clientMsgIDString是待撤回消息的客户端消息 ID。
final clientMsgID = message.clientMsgID;
if (clientMsgID == null || clientMsgID.isEmpty) {
  throw StateError('Message has no clientMsgID');
}

await OpenIM.iMManager.messageManager.revokeMessage(
  conversationID: conversationID,
  clientMsgID: clientMsgID,
);

Flutter 的 Message 模型没有 conversationID 字段,调用处应使用当前会话页面上下文维护的 conversationID。若仅持有事件返回的消息对象,可参考接收消息中的路由规则解析来源,并通过会话类型接口取得对应会话 ID。

返回结果

Future 成功表示服务端已完成撤回处理。当前客户端应依据复合标识 conversationID:clientMsgID 将该消息气泡就地更新为“已撤回”状态。

Future 成功不等于所有端事件均已到达。若服务端校验发现消息不存在或已超出可撤回时限,调用将抛出异常,此时应提示用户并保留原消息内容,不得直接在本地单方面置为撤回态。

监听消息撤回

消息撤回事件在此集中监听与处理。onNewRecvMessageRevoked 回调接收到 RevokedInfo 载荷,客户端应按复合标识 conversationID:clientMsgID 更新本地消息气泡,将其渲染为撤回提示:

void handleMessageRevoked(RevokedInfo info) {
  final clientMsgID = info.clientMsgID;
  if (clientMsgID == null || clientMsgID.isEmpty) return;

  final conversationID = findConversationIDByClientMsgID(clientMsgID);
  if (conversationID == null) return;
  markMessageRevoked(conversationID, clientMsgID, info);
}

建议将撤回消息就地转变为撤回通知(如“你撤回了一条消息”或“对方撤回了一条消息”),而不是直接从 UI 列表中硬删除。这样既能维持聊天时间线稳定,也能避免再次拉取历史消息时造成界面跳动。该 listener 应纳入应用唯一的 OnAdvancedMsgListener,全局设置入口请参考事件概览。

相关页面