SDKsFlutter
撤回消息
撤回已发送消息,并处理其他端收到的撤回通知。
撤回让其他客户端把原消息显示为撤回态。OpenIMServer 会校验消息状态、操作用户和可撤回时间范围。
如果只需要从当前账号侧移除消息,使用删除消息,不要用撤回替代。需要修改已发送消息内容时,使用修改消息。
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
conversationID | String | 是 | 消息所属的会话 ID。Flutter 的 Message 本身没有该字段。 |
clientMsgID | String | 是 | 待撤回消息的客户端消息 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,全局设置入口请参考事件概览。
相关页面
这个页面有帮助吗?