浏览 SDKs · Flutter
SDKsFlutter

撤回消息

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

复制

撤回让其他客户端把原消息显示为撤回态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。

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

撤回一条消息

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。如果只持有事件或查询返回的消息,可按接收消息中的路由 helper 解析并通过 getConversationIDBySessionType() 校准。

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);
}

onNewRecvMessageRevoked 携带 RevokedInfo,包含 clientMsgID、撤回者和时间等信息。先在当前账号的消息索引中解析所属 conversationID,再按 conversationID:clientMsgID 更新;不要按列表位置替换。该函数应纳入唯一的 OnAdvancedMsgListener,设置入口见事件概览

接收端应把对应气泡更新为撤回态,而不是直接从列表删除。这样可以保留消息时间线与撤回提示,也能避免后续历史快照重新带回原消息时出现状态跳动。

返回结果

Future 成功表示服务端完成撤回请求,不等于所有端事件已经到达。调用端可以更新本地同一 conversationID:clientMsgID 的气泡;其他客户端再通过撤回 callback 合并增量。

消息不存在或不允许撤回时,应保留原状态并展示错误,不要只在本地留下撤回提示。需要校准时重新读取历史快照;Future 成功、撤回 callback 到达和重新查询校准是三个不同阶段。

相关页面