Flutter 自定义消息
定义业务消息正文、分配类型编号,并在读取消息前完成注册。
文本、图片等内置正文不能表达订单卡片、位置共享等业务数据时,可以继承 WKMessageContent 定义自己的正文。
1. 约定消息类型
为每种业务正文分配一个整数类型。客户端和服务端必须使用同一个编号;不要占用 SDK 内置的 1~99。
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);
}新增字段时保持向后兼容:旧客户端应能忽略新字段,新客户端也应为缺失字段提供默认值。