WuKongIM Docs

Flutter 自定义消息

定义业务消息正文、分配类型编号,并在读取消息前完成注册。

编辑此页报告文档问题

文本、图片等内置正文不能表达订单卡片、位置共享等业务数据时,可以继承 WKMessageContent 定义自己的正文。

1. 约定消息类型

为每种业务正文分配一个整数类型。客户端和服务端必须使用同一个编号;不要占用 SDK 内置的 199

const orderMessageType = 10001;

2. 定义正文

class OrderMessageContent extends WKMessageContent {
  String orderID;
  String title;

  OrderMessageContent({this.orderID = '', this.title = ''}) {
    contentType = orderMessageType;
  }

  @override
  Map<String, dynamic> encodeJson() => {
        'order_id': orderID,
        'title': title,
      };

  @override
  WKMessageContent decodeJson(Map<String, dynamic> json) {
    orderID = readString(json, 'order_id');
    title = readString(json, 'title');
    return this;
  }

  @override
  String displayText() => '[订单] $title';

  @override
  String searchableWord() => title;
}
  • encodeJson 决定发送到服务端的数据。
  • decodeJson 把收到的 JSON 还原为对象。
  • displayText 用于会话预览。
  • searchableWord 用于本地搜索。

3. 注册后再读取消息

setup 完成后、连接和读取本地消息前注册一次:

await WKIM.shared.setup(options);

WKIM.shared.messageManager.registerMsgContent(
  orderMessageType,
  (data) => OrderMessageContent().decodeJson(
    Map<String, dynamic>.from(data),
  ),
);

如果没有注册,SDK 无法把该类型还原成 OrderMessageContent。把所有注册集中在应用启动服务中,不要放在聊天页面里重复执行。

4. 发送和接收

await WKIM.shared.messageManager.sendWithOption(
  OrderMessageContent(orderID: 'A-1001', title: '待支付'),
  WKChannel('bob', WKChannelType.personal),
  WKSendOptions(),
);

接收时可以按类型渲染:

final content = message.messageContent;
if (content is OrderMessageContent) {
  showOrderCard(content.orderID, content.title);
}

新增字段时保持向后兼容:旧客户端应能忽略新字段,新客户端也应为缺失字段提供默认值。

本页内容