MujicaUI

Chat Messages · #202

MessageList 浅色主题渲染快照
浅色 · 渲染快照
MessageList 深色主题渲染快照
深色 · 渲染快照

202 MessageList 消息列表

用途

虚拟化的消息列表,基于 MyGo ui.List:只构建可见消息,以稳定消息 ID 保持位置;从底部开始并跟随新消息,用户上翻后停止跟随,并显示新消息提示;可按日期插入分隔。

最小示例

r := chat.MessageList(c, &list, len(ids), chat.MessageListOptions{
	ID: func(i int) string { return ids[i] },
}, func(i int) { ui.Text(c, "Message "+ids[i]) })
fmt.Println("unread", r.Unread())

签名:func MessageList(c *ui.Context, s *MessageListState, n int, opts MessageListOptions, row func(i int)) MessageListResult

参数

字段类型默认值含义
IDfunc(i int) string必填消息的稳定 ID;在上方插入旧消息时视野中的消息保持不动。ID 须唯一。
Datefunc(i int) time.Timenil设置后在每个新日期的第一条消息前显示“今天 / 昨天 / 日期”分隔。
Labelfunc(i int) stringnil消息的无障碍名称,也用于键入定位。
nint必填消息数;负数 panic。

状态

跟随底部;离开底部时底部居中出现 ScrollToBottomButton(含未读数);点击后回到底部并清零。

事件

Unread():离开底部后新增的消息数。MessageListState.ScrollToEnd() 与 AtEnd() 供调用方控制。

键盘操作

列表获得焦点后,滚轮、方向键与 PageUp/PageDown 滚动;回到最新按钮可用 Tab 聚焦,Enter 或 Space 触发。

限制

  • 不检查 ID 是否重复(逐帧检查 10 万条代价过高);重复 ID 会让两条消息共享状态。
  • 消息高度由 MyGo 在显示时测量,未显示消息按已测高度估算,长距离跳转时滚动条可能微调。