
进入页面流程:页面先展示 Loading,异步请求接口拉取历史消息;消息数据返回后赋值给 msgList,同时置位listReady=true,触发 List 组件首次创建渲染。List 渲染瞬间,通过initialIndex定位到最后一条消息的顶部,避免页面先闪现顶部历史消息再大幅滚动;随后触发 List 的onAppear回调,执行scrollEdge(Edge.Bottom)滚动至视口最底部,让超长消息气泡完整展示并贴合屏幕底部。
/** 加载历史消息 */
private async loadHistoryMessage(convId: string) {
if (this.isLoading) return;
this.isLoading = true;
try {
const rawList = await ImService.getInstance().getMessageList(convId);
// 使用你原有批量转换方法,转成MessageModel
const list = MessageModel.fromRawArray(rawList);
// 按msgSeq升序
this.msgList = list.sort((a, b) => a.msgSeq - b.msgSeq);
// 数据就绪,开启渲染List,触发官网initialIndex + onAppear逻辑
this.listReady = true;
List({ scroller: this.scroller, initialIndex: this.msgList.length -1 })
.onAppear(() => {
// ListItem渲染完成后,滚动到底部,解决超长气泡只显示顶部问题
this.scroller.scrollEdge(Edge.Bottom);
})
initialIndex + onAppear 组合方案:List 渲染瞬间,通过initialIndex直接定位到最后一条消息的顶部,屏幕直接展示最后一条消息的头部,不会先跳到消息列表最上方;紧接着触发.onAppear回调,执行scrollEdge(Edge.Bottom),页面再向下滚动一小段距离,将这条消息的底部贴合到屏幕最下方,超长消息气泡得以完整展示。该方案的核心目的是消除 “先看到顶部历史消息,再猛地跳到底部” 的大幅度滚动跳动,由initialIndex完成粗定位,onAppear搭配scrollEdge完成精细定位。