消息修改
本文介绍 Flutter IMLib 的消息修改接口。该能力从 Flutter IMLib 5.26.0 开始支持,单聊和群聊均可使用;超级群消息修改请参考超级群消息修改。
修改消息简介
消息发送成功后,可以修改已发送消息的内容,修改结果会同步到接收端。修改前后的消息类型必须一致。消息是否允许修改、可修改的消息类型和有效期由服务端及 Kit 业务层共同限制。
如果消息包含引用关系,引用消息自身的类型仍决定修改方式;引用关系不会把图片、语音等消息转换为文本消息。
监听远端消息修改
接收端通过 onMessageModified 监听已接收消息的修改事件:
engine.onMessageModified = (code, message) {
if (code == 0 && message != null) {
// 使用修改后的消息刷新界面。
}
};
该属性是兼容监听入口。新代码优先在调用接口时传入 IRCIMIWModifyMessageCallback;离线修改记录同步完成后,Flutter IMLib 会按平台实现回调同步结果。
修改消息
调用 modifyMessageWithParams,传入原消息 UID 和修改后的消息对象。修改后的对象应与原消息保持同一消息类型。
方法
Future<int> modifyMessageWithParams(
RCIMIWModifyMessageParams params, {
IRCIMIWModifyMessageCallback? callback,
});
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
params.messageUId | String? | 被修改消息的服务器 UID。 |
params.message | RCIMIWMessage? | 修改后的消息对象,类型需与原消息一致。 |
callback | IRCIMIWModifyMessageCallback | 修改完成回调,返回状态码和消息对象。 |
示例代码
final params = RCIMIWModifyMessageParams.create(
messageUId: originalMessage.messageUId,
message: updatedMessage,
);
await engine.modifyMessageWithParams(
params,
callback: IRCIMIWModifyMessageCallback(
onMessageModified: (code, message) {
if (code == 0 && message != null) {
// 修改成功。
}
},
),
);
接口返回值是本次调用的状态码;最终业务结果以 onMessageModified 回调为准。成功时回调修改后的消息,失败时回调原消息或空值,具体以 Flutter IMLib 返回结果为准。
刷新引用消息
引用消息可能缓存被引用消息的内容。原消息修改后,可以调用 refreshReferenceMessageWithParams 批量刷新引用消息,单次最多 20 个消息 UID。
final params = RCIMIWRefreshReferenceMessageParams.create(
conversationType: RCIMIWConversationType.private,
targetId: "targetId",
channelId: null,
messageUIds: ["referenceMessageUId"],
);
await engine.refreshReferenceMessageWithParams(
params,
callback: IRCIMIWRefreshReferenceMessageCallback(
onLocalMessageBlock: (messages) {},
onRemoteMessageBlock: (messages) {},
onError: (code) {},
),
);
本地命中的消息通过 onLocalMessageBlock 返回,本地未命中的消息由 SDK 查询远端后通过 onRemoteMessageBlock 返回。
编辑消息草稿
编辑页面可以使用 RCIMIWEditedMessageDraft 保存、查询和清理会话草稿。单聊和群聊的 channelId 传 null。
await engine.saveEditedMessageDraft(
RCIMIWConversationType.private,
"targetId",
null,
RCIMIWEditedMessageDraft.create(
messageUId: "messageUId",
content: "正在编辑的内容",
),
callback: IRCIMIWCompletionCallback(
onCompleted: (code) {},
),
);
await engine.getEditedMessageDraft(
RCIMIWConversationType.private,
"targetId",
null,
callback: IRCIMIWGetEditedMessageDraftCallback(
onSuccess: (draft) {},
onError: (code) {},
),
);
await engine.clearEditedMessageDraft(
RCIMIWConversationType.private,
"targetId",
null,
callback: IRCIMIWCompletionCallback(
onCompleted: (code) {},
),
);
草稿对象包含 messageUId 和 content。完成编辑、取消编辑或消息已不可编辑时,应清理对应草稿。