MessageManager class
消息管理器,仿照 OpenIM MessageManager。
架构:本地优先 + 异步增量同步。
- 打开会话用 openConversationMessages(立即本地,后台 sync)
- UI 通过 messageChangeStream / 本地查询渲染,勿直接用网络结果改列表
- 发送:先写本地
sending→ WS ACK → 更新本地success
Constructors
- MessageManager(ConversationManager _conversationManager)
Properties
- advancedMsgListener → OnAdvancedMsgListener?
-
no setter
- canSend → bool
-
是否当前可发送(UI 可用此禁用发送按钮)
no setter
- hashCode → int
-
The hash code for this object.
no setterinherited
- mediaPolicy → MediaPolicy
-
no setter
-
messageChangeStream
→ Stream<
MessageStoreEvent> -
消息本地库变更流。UI 应监听此流并重新 getLocalHistoryMessageList。
no setter
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
assertCanSend(
) → void - 发送前置检查:无网 / WS 未连接时立即失败(不等待 ACK 超时)
-
bindWsEvents(
) → void - 由 IMManager 在 login 后绑定 WS 事件
-
createCardMessage(
{required int talkMode, required int toFromId, required int userId}) → Message -
createCodeMessage(
{required int talkMode, required int toFromId, required String code, required String lang}) → Message -
createFileMessage(
{required int talkMode, required int toFromId, required String uploadId}) → Message -
大文件消息:分片上传完成后,WS body 仅带
uploadId(对齐 Web)。 -
createImageMessage(
{required int talkMode, required int toFromId, required String url, required int width, required int height, required int size, String? name}) → Message -
createLocationMessage(
{required int talkMode, required int toFromId, required double latitude, required double longitude, String description = ''}) → Message -
createMiniProgramMessage(
{required int talkMode, required int toFromId, required String content, String? toolName, bool flashRead = false, String? quoteMsgId}) → Message -
创建小程序消息(msg_type=14)。
flashRead为 true 时服务端按闪阅处理(需flash_read.auto_recall_seconds>0);也可在contentJSON 中带openType=browser。 -
createTextMessage(
{required int talkMode, required int toFromId, required String content, List< int> ? mentions, String? quoteMsgId}) → Message -
createVideoMessage(
{required int talkMode, required int toFromId, required String url, required String cover, required int duration, required int size}) → Message -
createVoiceMessage(
{required int talkMode, required int toFromId, required String url, required int duration, required int size}) → Message -
deleteMessageFromLocalAndSvr(
{required int talkMode, required int toFromId, required List< String> msgIds}) → Future<void> -
fetchPeerReadState(
{required int talkMode, required int toFromId}) → Future< MessageRead?> - 回填对端已读水位(打开私聊时调用)。
-
getHistoryMessageList(
{required int talkMode, required int toFromId, String cursor = '0', int count = 30}) → Future< MessageListResult> - 兼容旧 API:现改为 Local-First(立即本地 + 异步同步)。
-
getHistoryMessageListByType(
{required int talkMode, required int toFromId, required int msgType, String cursor = '0', int count = 30}) → Future< MessageListResult> - 按类型过滤历史(HTTP → 写库);仍建议 UI 随后从本地读。
-
getLocalHistoryMessageList(
{required int talkMode, required int toFromId, String cursor = '0', int count = 30}) → Future< MessageListResult> - 仅读本地(断网 / SSOT 渲染)
-
getPendingMessages(
{required int talkMode, required int toFromId}) → Future< List< Message> > - 查询本地发送中 / 失败消息
-
loadOlderMessages(
{required int talkMode, required int toFromId, required String beforeSequence, int count = 30}) → Future< MessageListResult> - 上拉更早消息:先查本地;本地该页为空时才打网,写库后再读本地。
-
markMessagesAsRead(
{required int talkMode, required int toFromId, required String msgId}) → Future< void> -
上报私聊已读水位(本端 inbox 的
msgId)。仅 TalkMode.private。 -
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
openConversationMessages(
{required int talkMode, required int toFromId, int count = 30, bool sync = true}) → Future< MessageListResult> - 打开会话:立即返回本地最新消息(不等网络),并异步增量同步。
-
peerReadSeq(
{required int talkMode, required int toFromId}) → int -
resendMessage(
Message message, {Duration? timeout}) → Future< Message> - 重试本地 failed / sending 消息
-
resendPendingMessages(
{required int talkMode, required int toFromId}) → Future< void> - 批量重试本会话 pending
-
resolveDisplayMediaUrl(
Message msg) → String? - 按策略解析展示用媒体 URL(蜂窝优先缩略图)
-
revokeMessage(
{required int talkMode, required int toFromId, required String msgId}) → Future< void> -
sendMessage(
Message message, {Duration? timeout}) → Future< Message> - 通过 WebSocket 发送消息,等待服务端 ACK。 发送前写入本地(status=发送中),成功后标记 status=0。
-
setAdvancedMsgListener(
OnAdvancedMsgListener listener) → void -
shouldAutoDownload(
Message msg) → bool - 是否应按当前流量策略自动下载该消息媒体
-
syncConversationMessages(
{required int talkMode, required int toFromId, int pageSize = 30, int maxPages = 20}) → Future< void> -
增量同步:用现有
sequence < cursor接口从最新页向前回填, 直到与本地 max_seq 重叠或无更多数据,结果写入本地库。 -
toString(
) → String -
A string representation of this object.
inherited
-
typing(
int toFromId) → Future< void> - 发送「正在输入」
-
unbindWsEvents(
) → void -
uploadImageHints(
{bool preferOriginal = false}) → ({bool compress, int jpegQuality, MediaQuality quality}) - 当前网络建议的图片上传质量 / JPEG 压缩参数
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited