界面与生命周期
SDK 不提供完整聊天 UIKit。Activity、Fragment、ViewModel 或 Compose 使用相同的 Flow 状态、列表和消息句柄。
Activity / Fragment
使用 lifecycle-runtime-ktx,在 LifecycleOwner 的 STARTED 状态收集。Fragment 使用 viewLifecycleOwner,避免视图销毁后继续更新旧界面。
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.launch
import com.deeprespond.im.*
fun observeConversations(owner: LifecycleOwner, im: DRClient) {
owner.lifecycleScope.launch {
owner.repeatOnLifecycle(Lifecycle.State.STARTED) {
im.conversations.listFlow().collect { snapshot ->
println(snapshot.items.size) // 更新会话列表。
}
}
}
}listFlow 随收集建立和释放列表。需要手动控制 loadMore 时创建 LiveList,配合 try/finally 关闭。需要同时收集几个 StateFlow 时在 repeatOnLifecycle 中分别 launch,不能在第一个无限 collect 后顺序调用第二个。
消息页
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.launch
import com.deeprespond.im.*
fun observeMessages(owner: LifecycleOwner, im: DRClient, conversationKey: String) {
owner.lifecycleScope.launch {
owner.repeatOnLifecycle(Lifecycle.State.STARTED) {
val list = im.messages.open(conversationKey)
try {
list.setViewing(atBottom = true, visible = true)
list.snapshot.collect { snapshot -> println(snapshot.items.size) }
} finally {
list.setViewing(visible = false)
list.close()
}
}
}
}示例将滚动状态固定为最新;实际页面在滚动变化时更新 atBottom。页面不显示时 visible 为 false。取消状态收集不会自动退出聊天室或挂断通话,按业务导航规则单独处理。
Compose
引入生命周期的 Compose 适配依赖,使用 collectAsStateWithLifecycle 读取 StateFlow。listFlow 可直接收集;手动 MessageList 在 remember 中按会话键创建,在 DisposableEffect 中关闭,按生命周期设置 visible。不要在重组时反复调用 messages.open。
列表稳定键使用 conversationKey;消息本地阶段使用 clientMsgId,正式序号出现时要保持同一条消息的视图身份。群成员与好友使用 username。SDK 的快照是读取结果,业务应通过 API 修改,不直接更改 raw 或快照列表。
显示辅助
import com.deeprespond.im.render.*
val title = conversationTitle(im, conversation)
val sender = displayName(im, "bob", groupId)
val summary = summarize(im, message, groupId)
println("$title / $sender / $summary")displayName 按好友备注、群昵称、昵称、用户名选取。renderTip 渲染群提示,renderRecall 渲染撤回,renderCallRecord 渲染通话记录;DRLocale.zhCN 提供中文文案,describeError 转换错误提示。所有这些辅助只负责显示,具体业务权限仍由 API 决定。
图片用 DRImage 和 addDRImage,见Coil 接入;视频用 DRCallVideoView,页面结束时 unbind。大图、下载和文件分享由 App 的导航、存储和 FileProvider 管理。
资源归属
| 资源 | 页面或任务结束时 |
|---|---|
| LiveList、MessageList | close |
| presence.subscribe | 关闭返回的 AutoCloseable |
| 事件与状态 Flow | 取消对应协程 |
| 临时保持前台的句柄 | close |
| 聊天室成员资格 | 需要退出时 await room.leave |
| 上传、下载 | 真正取消时 task.cancel,不只取消 await |
| 视频视图 | unbind |
| 整个客户端 | 仅切换应用或结束客户端时 destroy |
频道视频与收尾
独立频道使用 im-call 的 DRChannelVideoView,按授权 ChannelTrack 绑定,支持 FIT / FILL 和 mirror。页面退出时停止 StateFlow 观察、unbind,并在可完成清理的协程中调用 handle.leave;只销毁 View 不会提交退出。见频道视频。
