Jetpack Compose无Fragment/Activity时创建Stream Chat ViewModel的方法
解决Composable中创建Stream Chat ChannelListViewModel的问题
问题原因
ChannelListViewModel没有无参构造函数,必须通过官方提供的ChannelListViewModelFactory来实例化。直接调用viewModel()会使用默认Factory,无法满足它的创建要求,因此抛出实例化异常。
解决方案
在Composable中调用viewModel()时,手动传入Stream提供的ViewModel Factory即可,和Activity中viewModels { ... }的逻辑一致:
- 获取已初始化的ChatClient实例
确保你已经在应用启动时初始化了Stream Chat的ChatClient,直接通过单例获取:
val chatClient = ChatClient.instance()
- 创建ChannelListViewModelFactory
传入ChatClient和可选的配置参数(比如频道过滤、排序规则等):
val channelListFactory = ChannelListViewModelFactory( chatClient = chatClient, channelListViewModelConfig = ChannelListViewModelConfig( // 可根据需求添加配置,比如: // channelFilter = Filter.equal("type", "messaging") ) )
- 在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
相关产品推荐
相关产品推荐

