自定义消息气泡(Builder 完全自定义 UI)
使用 Builder 可完全控制不同类型消息的气泡渲染,并可在主气泡下方追加自定义 UI 的"附 加气泡/面板"(如语音转文字结果)。
自定义 UI 气泡的推荐方式
-
继承
RCKMessageBubble实现自定义 UI 的消息类型渲染:- 必须实现:
Widget buildMessageContent(BuildContext context, String? refName)(核心内容区域)。 - 可选重写:
Widget? buildAppendBubble(BuildContext context)(主气泡下方的附加区域)void onBubbleTap(BuildContext context)(点击默认行为)
- 父类会统一处理:头像/对齐/时间/多选/侧滑/状态指示器/附加气泡缩进等外层布局,只需关注"内容本身"。
- 必须实现:
-
通过 Builder 注册到指定消息类型:
- 在聊天页将
RCIMIWMessageType与CustomChatItemBubbleBuilder进行映射。 - 渲染时,
RCKMessageBubble.create会先检查映射表,若有匹配的类型则调用你的 Builder;否则回落到内置的默认气泡(文本/图片/语音/文件/视频/引用/撤回等)。
- 在聊天页将
示例注册:
Dart
RCKChatPage(
customChatItemBubbleBuilders: {
RCIMIWMessageType.nativeCustom: ({ required message, showTime, config, required context }) {
return MyCustomMessageBubble(message: message, showTime: showTime ?? false, config: config);
},
},
)
示例:MyCustomMessageBubble(继承 RCKMessageBubble)
Dart
class MyCustomMessageBubble extends RCKMessageBubble {
const MyCustomMessageBubble({
super.key,
required super.message,
super.showTime,
super.alignment,
super.withoutBubble,
super.withoutName,
super.config,
super.onTap,
super.onDoubleTap,
super.onLongPress,
super.onSwipe,
super.onAppendBubbleTap,
super.onAppendBubbleLongPress,
});
Widget buildMessageContent(BuildContext context, String? refName) {
final bool isMe = message.direction == RCIMIWMessageDirection.send;
String displayText;
if (message is RCIMIWTextMessage) {
displayText = (message as RCIMIWTextMessage).text ?? '';
} else {
displayText = '[自定义消息]';
}
return Text(
displayText,
style: isMe
? (config?.textStyleConfig.senderTextStyle)
: (config?.textStyleConfig.receiverTextStyle),
);
}
Widget? buildAppendBubble(BuildContext context) {
// 如需在主气泡下追加说明/标签,可在此返回自定义 UI 小面板;不需要则返回 null
return null;
}
}
// 将自定义 UI 气泡映射到某个消息类型(示例:原生自定义消息)
final builders = <RCIMIWMessageType, CustomChatItemBubbleBuilder>{
RCIMIWMessageType.nativeCustom: ({ required message, bool? showTime, RCKBubbleConfig? config, required BuildContext context }) {
return MyCustomMessageBubble(message: message, showTime: showTime ?? false, config: config);
},
};
若仅需样式微调,请优先使用 Config,详见:消息气泡配置(Config 部分自定义 UI)