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);也可在 content JSON 中带 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