会话
im.conversations 管理会话列表、草稿、未读、置顶和正在输入。列表是可订阅对象,不要手动复制 SDK 的同步逻辑。
订阅列表
val list = im.conversations.list()
try {
list.snapshot.collect { snapshot ->
snapshot.items.forEach { view ->
println("${view.conversationKey}: ${view.unreadCount}")
}
}
} finally {
list.close()
}LiveListSnapshot 包含 items、hasMore、loading、error。需要下一批时调用 loadMore;列表排序与最新快照由 SDK 维护。listFlow() 在收集时创建列表,停止时自动释放,并跟随登录状态;未登录时为空快照,适用于生命周期收集。
打开单聊
val conversation = im.conversations.openSingle("bob")
val messages = im.messages.open(conversation.conversationKey)
messages.close() // 本例只演示创建;实际页面在离开时关闭。尚未发送第一条消息时可能是本地草稿会话,其 conversationKey 形如 draft:username,conversationId 可以为 null。用 conversationKey 打开消息页,不要把草稿键当服务端会话 ID。第一条发出后列表会切换到正式键,观察 MessagesChanged.renamedFrom 或新的列表快照。
已有会话可用 get(conversationId) 读取,refresh(conversationId) 从服务端更新。
未读和已读
im.conversations.markRead(conversationId)
im.conversations.setMarkedUnread(conversationId, true)
val total = im.conversations.getUnreadTotal(excludeMuted = true)unreadTotal 是 StateFlow,不计 hidden 会话。markRead 合并上报并立即返回;不传 seq 时推进到最新。setMarkedUnread 设置人工未读标记,不等于回退已读序号。markAllRead 每分钟最多两次,结果包含 count、truncated。
自动已读需要 autoMarkRead = true,并由消息列表报告可见性,见消息列表。
置顶、删除与草稿
import com.deeprespond.im.*
im.conversations.setPinned(conversationId, true)
im.conversations.setDraft(conversationKey, Draft("稍后回复"))
im.conversations.setDraft(conversationKey, null)remove(conversationId, clearMessages = false) 删除本人会话;需要同时清空消息时明确传 true。clearMessages 清除本人会话消息,不代表撤回对方消息。草稿仅保存在本地,不跨设备同步;null 或无引用的空文本删除草稿。
正在输入
typing(conversationKey) 报告本人输入,SDK 每三秒最多发送一次。getTyping(conversationKey) 获取当前正在输入的人,变化也通过 TypingChanged 事件通知。草稿单聊同样可以报告输入。完整方法见ConversationsModule。
