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 到达和重新查询校准是三个不同阶段。
相关页面
这个页面有帮助吗?