You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose无Fragment/Activity时创建Stream Chat ViewModel的方法

解决Composable中创建Stream Chat ChannelListViewModel的问题

问题原因

ChannelListViewModel没有无参构造函数,必须通过官方提供的ChannelListViewModelFactory来实例化。直接调用viewModel()会使用默认Factory,无法满足它的创建要求,因此抛出实例化异常。

解决方案

在Composable中调用viewModel()时,手动传入Stream提供的ViewModel Factory即可,和Activity中viewModels { ... }的逻辑一致:

  1. 获取已初始化的ChatClient实例
    确保你已经在应用启动时初始化了Stream Chat的ChatClient,直接通过单例获取:
val chatClient = ChatClient.instance()
  1. 创建ChannelListViewModelFactory
    传入ChatClient和可选的配置参数(比如频道过滤、排序规则等):
val channelListFactory = ChannelListViewModelFactory(
    chatClient = chatClient,
    channelListViewModelConfig = ChannelListViewModelConfig(
        // 可根据需求添加配置,比如:
        // channelFilter = Filter.equal("type", "messaging")
    )
)
  1. 在Composable中创建ViewModel
    调用viewModel()时传入上述Factory:
@Composable
fun ChannelsScreen(
    navController: NavController,
    viewModel : ChannelsViewModel = hiltViewModel()
) {
    LaunchedEffect(key1 = true) {
        viewModel.onEvent(ChannelsEvent.ConnectUser)
    }

    val chatClient = ChatClient.instance()
    val channelListFactory = ChannelListViewModelFactory(
        chatClient = chatClient,
        channelListViewModelConfig = ChannelListViewModelConfig()
    )
    val channelListViewModel: ChannelListViewModel = viewModel(factory = channelListFactory)

    ChatTheme {
        ChannelList(
            modifier = Modifier.fillMaxSize(),
            viewModel = channelListViewModel,
            onChannelClick = {
                // 跳转至消息页面逻辑
            },
        )
    }
}

补充说明

  • 如果使用Hilt,可以将ChannelListViewModelFactory通过依赖注入的方式提供,避免手动创建实例的重复代码。
  • ChannelListViewModelConfig可以根据业务需求配置频道的过滤条件、排序方式、是否显示离线频道等,具体参数参考Stream官方文档的配置说明。

内容的提问来源于stack exchange,提问作者Sevban Bayır

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:45:08