XuqmGroup-Web/docs-site/docs/flutter/im.md
XuqmGroup 65914b0ec2 feat: ops租户筛选 + 服务去平台化 + 补全Flutter/H5/小程序文档
- AppListView: 添加租户模糊搜索筛选,显示租户名称
- AppDetailView: 功能服务表去掉平台列,按服务类型展示
- ops.ts: listApps 支持 tenantId 参数,AppItem 添加 tenantName
- 新增 Flutter/H5/小程序 setup.md 和 im.md 文档
- config.ts: sidebar 添加 Flutter/H5/小程序子页面

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 00:26:53 +08:00

3.3 KiB

Flutter IM 接入

模块xuqm_flutter_im · 最低版本Dart 3.0+


登录

import 'package:xuqm_flutter_sdk/xuqm_flutter_sdk.dart';

await XuqmImSdk().login('user_001', 'your_user_sig_jwt');

登录成功后会自动建立 IM 实时连接。


监听消息

final im = XuqmImSdk();

im.ws.onConnected = () {
  print('IM 已连接');
};

im.ws.onMessage = (XuqmImMessage msg) {
  print('收到消息: ${msg.msgType} - ${msg.content}');
};

im.ws.onDisconnected = (String? reason) {
  print('IM 断开: $reason');
};

发送消息

// 发送文本消息
final msg = await im.sendTextMessage(
  'user_002',
  'SINGLE',
  'Hello from Flutter!',
);

// 发送图片消息
final imgMsg = await im.sendMessage(
  'user_002',
  'SINGLE',
  'IMAGE',
  jsonEncode({'url': 'https://cdn.example.com/img.jpg', 'width': 800, 'height': 600}),
);

// 撤回消息
await im.revokeMessage(msg.id);

// 编辑消息
await im.editMessage(msg.id, '新内容');

会话管理

// 会话列表
final conversations = await im.listConversations();

// 置顶会话
await im.setConversationPinned('user_002', 'SINGLE', true);

// 免打扰
await im.setConversationMuted('group_xxx', 'GROUP', true);

// 标记已读
await im.markRead('user_002');

// 设置草稿
await im.setDraft('user_002', 'SINGLE', '未完成的消息');

好友与群组

// 好友列表
final friends = await im.listFriends();

// 添加好友
await im.addFriend('user_002');

// 移除好友
await im.removeFriend('user_002');

// 创建群组
final group = await im.createGroup('Flutter 群', ['user_001', 'user_002']);

// 群组列表
final groups = await im.listGroups();

// 添加群成员
await im.addGroupMember(group.id, 'user_003');

// 退出群聊
await im.leaveGroup(group.id);

历史消息

// 单聊历史
final history = await im.fetchHistory('user_002', page: 0, size: 20);

// 群聊历史
final groupHistory = await im.fetchGroupHistory('group_xxx', page: 0, size: 50);

// 定位消息所在页
final page = await im.locateHistoryPage(
  'user_002',
  messageId: 'msg_xxx',
  pageSize: 20,
);

完整示例

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:xuqm_flutter_sdk/xuqm_flutter_sdk.dart';

class ChatPage extends StatefulWidget {
  @override
  _ChatPageState createState() => _ChatPageState();
}

class _ChatPageState extends State<ChatPage> {
  final im = XuqmImSdk();
  final List<XuqmImMessage> messages = [];

  @override
  void initState() {
    super.initState();
    _init();
  }

  Future<void> _init() async {
    await XuqmSDK.initialize(XuqmInitOptions(appKey: 'your_app_key'));
    await im.login('user_001', 'your_user_sig_jwt');

    im.ws.onMessage = (msg) {
      setState(() => messages.add(msg));
    };
  }

  Future<void> _send(String text) async {
    final msg = await im.sendTextMessage('user_002', 'SINGLE', text);
    setState(() => messages.add(msg));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter IM')),
      body: ListView.builder(
        itemCount: messages.length,
        itemBuilder: (context, index) {
          final msg = messages[index];
          return ListTile(title: Text('${msg.fromId}: ${msg.content}'));
        },
      ),
    );
  }
}