會話
im.conversations 管理會話列表、草稿、未讀數、置頂和“正在輸入”。會話列表由 SDK 維護,隨新訊息和其他裝置上的操作自動更新:你只需訂閱它,不要自己另存一份再去同步。
| 要做什麼 | 看哪裡 |
|---|---|
| 顯示會話列表 | 訂閱列表 |
| 從聯絡人進入單聊 | 開啟單聊 |
| 顯示和清除未讀數 | 未讀和已讀 |
| 置頂、刪除會話,儲存草稿 | 置頂、刪除與草稿 |
| 顯示“對方正在輸入…” | 正在輸入 |
訂閱列表
kotlin
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():開始收集時建立列表,停止收集時自動釋放,並跟隨登入狀態(未登入時為空快照),適合按介面的生命週期收集。
開啟單聊
kotlin
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) 從服務端更新。
未讀和已讀
kotlin
im.conversations.markRead(conversationId)
im.conversations.setMarkedUnread(conversationId, true)
val total = im.conversations.getUnreadTotal(excludeMuted = true)unreadTotal是StateFlow,不計入已刪除(hidden)的會話。markRead立即返回,SDK 合併後上報;不傳seq時推進到最新一條。setMarkedUnread只是加一個“未讀”標記,不會把已讀位置往回退。markAllRead每分鐘最多呼叫兩次,結果帶count(標記的會話數)和truncated(還有沒處理的更早會話)。
自動已讀需要 autoMarkRead = true,並由訊息列表報告可見性,見訊息列表。
置頂、刪除與草稿
kotlin
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 每 3 秒最多傳送一次;草稿單聊同樣可以用。getTyping(conversationKey) 返回當前正在輸入的人,變化時也會發出 TypingChanged 事件。完整的方法見 ConversationsModule。
