三折叠展开还是两列,设备型号不是布局依据
三折叠手机展开到 G 态,期望是三栏布局,结果页面还是两列。代码里判断 isExpanded 或者设备型号,在二折叠上勉强能用,到了三折叠就完全对不上。根因很清晰:把“设备形态”和“窗口可用空间”混成了一个条件。三折叠的 G 态窗口宽度确实很大,但你的应用可能正处在一个自由窗口里,或者被平行视界切走了一半。设备型号告诉不了你“此刻窗口还剩多少宽度”,只有窗口本身知道。

断点监听窗口,不是监听折叠状态
官方的建议很直接:主要监听 window.on('windowSizeChange'),用窗口宽度断点做布局决策,不要在 foldDisplayModeChange 回调里立刻读取窗口尺寸,那个时刻窗口可能还没有完成重排。折叠状态可以用来辅助判断“是不是悬停态”,但列数、分栏、导航位置这些布局决策,统一交给窗口宽度断点。
typescript
@Local screenWidthVp: number = 390;
private resizeTimer: number = -1;
aboutToAppear(): void {
const win = window.getLastWindow(getContext(this));
win.on('windowSizeChange', (size: window.Size) => {
// 折叠过渡中回调频繁,节流到稳定值再更新
if (this.resizeTimer !== -1) { clearTimeout(this.resizeTimer); }
this.resizeTimer = setTimeout(() => {
this.screenWidthVp = px2vp(size.width);
this.resizeTimer = -1;
}, 150) as unknown as number;
});
}
@Computed
get columns(): number {
if (this.screenWidthVp >= 840) { return 3; }
if (this.screenWidthVp >= 600) { return 2; }
return 1;
}
px2vp 不能省,windowSizeChange 给的是 px。150ms 节流是为了避开折叠过程中的连续中间尺寸,只处理稳定后的窗口宽度。columns 从 screenWidthVp 派生,不再读设备型号。

宽但矮的窗口,侧边导航不应该出现
只看宽度不看高度,还有一个容易漏的边界:窗口很宽但高度不足。侧边导航通常要求宽度和高度同时达标,比如宽度 ≥ 840vp 且高度 ≥ 520vp,否则应该切回底部导航。三折叠展开后如果系统栏或键盘占掉了大量高度,只按宽度切三栏,内容区会被压得很扁。布局决策表里把高度也作为一个输入,比单纯相信宽度断点更稳。
根容器只测量一次,不要把断点判断散落在每个页面
如果首页、列表页、详情页各自监听窗口尺寸、各自判断断点,同一个窗口在不同页面里可能得出不一致的列数。把根容器作为唯一测量点,只在有效数值变化时更新一次状态,派生结果传给各业务页面。设备类型只决定能力或部署范围,不进入布局列数的决策链。
三折叠和自由窗口的适配,终点不是“识别出这是什么设备”,而是“不管窗口变成什么形状,布局都跟着可用空间走”。断点监听 windowSizeChange、节流稳定值、列数从宽度派生、高度参与导航决策,四件事做对,G 态、F 态、自由窗口、平行视界就共用同一套逻辑。
更多推荐

所有评论(0)