如何使用Stream Chat Flutter SDK创建电商用户与商家的私有会话频道
基于Stream Chat Flutter实现电商用户-商家私有会话方案
前置配置
- 首先将Firebase Auth的用户数据同步到Stream Chat后台,可通过Firebase云函数在用户注册时触发同步,也可在用户首次登录APP时调用Stream的
connectUser方法完成用户注册,建议直接复用Firebase的uid作为Stream的用户ID,减少双端用户映射成本 - 给商家账号的用户扩展字段新增标记,比如在
extraData中添加user_type: 'merchant',方便后续业务逻辑识别用户身份
注意:生产环境下Stream的用户Token请通过后端(比如Firebase云函数)生成返回给前端,不要在前端硬编码Stream的服务端密钥,避免出现安全风险。
专属私有会话自动创建逻辑
该逻辑默认自带去重能力,不会出现同个用户和同个商家创建多个会话的问题,同时天然支持多名用户同时联系同一商家,每个会话相互独立:
- 普通用户点击商家页的「联系商家」按钮时,先调用
queryChannels查询是否已存在双方的专属会话:
final currentUserId = StreamChat.of(context).currentUser!.id; // 过滤条件:一对一消息频道、成员包含当前用户和目标商家、成员数严格为2 final filter = Filter.and( Filter.equal('type', 'messaging'), Filter.members([currentUserId, targetMerchantId]), Filter.equal('member_count', 2), ); final existChannels = await StreamChat.of(context).client.queryChannels(filter: filter);
- 如果查询到已存在符合条件的频道,直接跳转至该频道的聊天页面即可
- 如果没有查询到对应频道,创建新的私有会话,可自定义扩展字段标记会话属性方便后续管理:
final newChannel = StreamChat.of(context).client.channel( 'messaging', extraData: { 'members': [currentUserId, targetMerchantId], 'merchant_id': targetMerchantId, 'consult_user_id': currentUserId, 'channel_tag': 'e_commerce_consult', }, ); await newChannel.create(); // 创建完成后跳转至该频道聊天页
创建的messaging类型频道默认私有,只有加入的两个成员可以访问,天然满足专属会话的私密性要求。
商家侧消息接收与通知实现
- 商家登录APP后,直接查询所有自己作为成员的电商咨询类会话,按最新消息时间倒序渲染到会话列表即可:
final merchantId = StreamChat.of(context).currentUser!.id; final filter = Filter.and( Filter.equal('type', 'messaging'), Filter.equal('channel_tag', 'e_commerce_consult'), Filter.member(merchantId), ); final consultChannels = await StreamChat.of(context).client.queryChannels( filter: filter, sort: [SortOption('last_message_at', direction: SortOption.DESC)], );
- 未读计数直接读取
channel.state?.unreadCount字段渲染即可 - 推送通知直接使用Stream自带的FCM集成能力,在Stream后台绑定你的Firebase Cloud Messaging密钥,商家端开启推送权限后就能收到新消息的系统通知,无需额外开发推送逻辑。
效果参考截图


内容的提问来源于stack exchange,提问作者bargougui sabri
相关产品推荐
相关产品推荐

