HarmonyOS 7 新特性13:平行视界深潜——路由编排四配置实测、虚拟容器窗宽说法与返回语义

1、引言

分栏起来之后,下一个问题立刻出现:页面往哪跳?单窗应用里 router.push 就是压栈一层,分栏态下这个 push 是压左栏的栈、右栏的栈,还是把分栏整个换掉?答案取决于四个编排字段:mode(导航模式还是购物模式)、pagePairs(跳转关系对)、transPages(过渡页)、fullScreenPages(全屏页)。文档给的是字段语义,行为边界得真机看——同一个 push 调用,配置不同落点完全不同。

这篇的实验方法是「配置即变量」:同一个工程(轻视界加两个诊断页),四组 easy_go.json 各编译一版逐个装机,每组跑同一套诊断动作(跳 Extra、跳 Full、读栈长、点返回),读数差异全部归因于配置差异。诊断页自带三行读数:isEasySplit、router 栈长、页内读窗宽——第三行是为虚拟容器字段准备的,它量的不是物理窗口而是「应用以为的窗口」,两者之差正是虚拟容器开关的全部作用面。

环境声明:HarmonyOS 7.0.0.109 (API 26) Release,实测工程轻视界(com.qingkouwei.lightview,含诊断页扩展);DevEco Studio 26.0.0(SDK 26.0.0.105 Release),真机 MatePad Edge(QXS-W00,双模态,平板形态实测)。四组配置读数全部真机实测。

2、效果展示:四组配置的落点差异

配置 A(导航模式 + pagePairs):点「跳 Extra(带参)」,ExtraPage 落在右栏——左栏列表不动,右栏从正文换成诊断页,读数 isEasySplit=true、页内窗宽 1418vp、栈长 2。pagePairs 把 List→Extra 这条跳转声明为「右栏内导航」。

HarmonyOS 7 新特性13:平行视界深潜——路由编排四配置实测、虚拟容器窗宽说法与返回语义-1.png

配置 B(购物模式 + transPages):ExtraPage 作为过渡页固定右显,读数与 A 同(true/1418vp/栈长 2)——购物模式下过渡页的语义是「右栏常驻中间态」,不支持右推左。

HarmonyOS 7 新特性13:平行视界深潜——路由编排四配置实测、虚拟容器窗宽说法与返回语义-2.png

配置 C(fullScreenPages):跳 FullPage 后分栏退出,isEasySplit 翻成 false,页面独占整窗——与配置 A 下同一页面的读数(true)成对照对,字段生效的直接证据。

HarmonyOS 7 新特性13:平行视界深潜——路由编排四配置实测、虚拟容器窗宽说法与返回语义-3.png

配置 D(enableReducedContainerSize=true):界面布局不变,但页内读窗宽从 1418vp 变成 709vp——虚拟容器把「窗口宽度」的说法换成了右页尺寸,应用按窗宽做的断点判断从此看到的是半窗。这个读数的取法也说明一下:诊断页用 window.getLastWindow 拿 windowRect 再 px2vp,取的是系统窗口属性而非组件实测宽——虚拟容器改的正是这类系统说法读数的语义,组件实测宽(onAreaChange)在开关两侧不变,变的只是「窗口宽」这个概念指向谁。

HarmonyOS 7 新特性13:平行视界深潜——路由编排四配置实测、虚拟容器窗宽说法与返回语义-4.png

3、Kit 与 API:四个编排字段与两个模式

编排字段都在 routerSplitOptions 内(篇 12 字典的子集),本篇聚焦行为:

字段声明语义本篇实测行为
mode=1 导航模式右栏承载导航栈push 默认右栏内导航,栈长累加(读数 2)
mode=0 购物模式右栏可右推左配合 transPages 固定过渡页右显
pagePairs{from,to} 跳转关系对,仅导航模式List→Extra 落右栏(图 1)
transPages过渡页数组,购物模式生效,固定右显不支持右推左Extra 固定右栏(图 2)
fullScreenPages跳转即退出分栏的页数组FullPage isEasySplit=false(图 3)
enableReducedContainerSizelpx/断点/窗宽按右页尺寸算窗宽读数 1418→709vp(图 4)

两个约束在配置期就要避开:pagePairs 仅导航模式生效(购物模式下配了不报错也不生效,静默忽略——比报错更危险);fullScreenPages 不能与 homePage/relatedPage 重复(schema 层约束)。mode 的默认值是 1,不写就是导航模式——本篇配置 B 显式写 0 才拿到购物语义。

栈长读数的语义值得单说:分栏态下 router.getLength() 报 2(List+Extra),说明右栏导航是独立栈而非整窗替换——左栏 homePage 不在右栏栈里计数,两栏各持一栈,这是「一窗两页」在路由层的直接体现。

独立栈的工程含义有三条。其一,返回键语义按栏隔离:右栏栈退尽后系统返回才轮到窗口级行为(退应用或回桌面),左栏不参与右栏的返回链——设计返回拦截逻辑时只考虑本栏栈深即可。其二,深链进入要指定栏:外部 want 拉起应用时落在 homePage(左栏),想直接打开右栏某页得靠应用层路由(push 进右栏栈),配置层没有「深链到右栏第 N 层」的字段。其三,栈长是可观测的分栏健康指标:诊断台把 getLength 做成按钮就是为此——分栏异常时栈长读数会先于布局错乱暴露问题(比如残留态下栈长与视觉栏数不符)。

4、逻辑流

四配置的跳转落点决策流:

是

否

pagePairs 且导航模式

transPages 且购物模式

否

是

否

router.push 目标页

目标在 fullScreenPages?

退出分栏 整窗显示

目标在 pagePairs/transPages?

右栏内导航 栈+1

固定右显 不可右推左

目标=relatedPage?

右栏内导航 栈+1

返回语义的状态流(本篇第五组读数):

push Extra(pagePairs)

右栏 back(栈-1 分栏不释放)

push Full(fullScreenPages)

back(恢复分栏)

分栏_List加Article

分栏_List加Extra

整窗_Full

第二张图里「右栏 back 分栏不释放」是实测读数:点返回后左栏恢复列表、右栏回 Article、状态行仍报分栏 1418vp——back 退的是右栏栈,分栏挂载不受影响。反过来整窗态 back 会恢复分栏,两条边的对称性在 fullScreenPages 场景成立、在普通右栏导航场景不成立(普通导航从未离开分栏)。

5、实战:四配置矩阵与返回语义

5.1 配置 A:pagePairs 落右栏与栈长

导航模式配 pagePairs(List→Extra) 后点跳转:Extra 落右栏,isEasySplit=true、页内窗宽 1418vp、栈长 2。栈长 2 是路由层「右栏独立栈」的证据:若 push 走整窗替换,栈长应为 1(替换)或含左栏页的 3;读数 2 = 右栏栈内 List 语义起点加 Extra。带参跳转的 params 在 Extra 侧可取(router.getParams 常规路径),但 relatedPage 不支持传参的官方约束提醒:关系对声明的页间传参要走应用层通道(篇 5 的 AppStorage 模式)。

5.2 配置 B:transPages 固定右显

购物模式配 transPages=[Extra] 后同动作跳转:Extra 固定右栏,读数与 A 同。两模式在本场景的差异不在落点(都右栏)而在右推左的可用性:购物模式下过渡页不支持右推左(官方语义),即 Extra 页内再 push 新页不会把 Extra 推到左栏——本篇未做二级 push 实测(诊断页无二级跳转按钮),留边界。

两模式的选择依据留一段:导航模式适合「左目录右内容、右栏内多层导航」的结构(文集、邮件、设置),pagePairs 把次要跳转声明进右栏;购物模式适合「左列表右详情、详情可右推左展开」的结构(商品流、图库),transPages 把中间态钉在右栏。依据不在页面数量而在导航方向性:需要右推左(详情展开占更宽区域)选购物模式,只需要右栏内进退选导航模式。本篇载体是文集,方向性弱,配置 A 的导航模式是默认正确选择;配置 B 的购物模式是为实测 transPages 行为而切,不是产品选择。

5.3 配置 C:fullScreenPages 退出分栏

配 fullScreenPages=[Full] 后跳 Full:isEasySplit=false,整窗独占。对照组是配置 A 下跳同一 FullPage(未列入 fullScreenPages):读数 true 留右栏——同页同动作,配置差一个字段,行为差一个形态,对照对成立。退出分栏后 back 恢复分栏(状态图第二条边),恢复过程无闪烁读数(主观观察,未量化)。

5.4 配置 D:虚拟容器窗宽说法

enableReducedContainerSize=true 后,ListPage 状态行的窗宽读数从 1418vp 变 709vp(恰为半窗)。这个字段改的不是布局而是说法:应用内所有按窗宽做的判断(断点、lpx 换算、横向断点媒体查询)从此看到右页尺寸。它的用途是让分栏右栏的布局按「自己实际占的宽度」自适应,而不是按整窗宽度算出一套放不下的布局;代价是同一份代码在开关两侧读到不同窗宽——篇 15 的断点三档逻辑若开此字段,阈值要按半窗重校。709 与 1418 的精确二倍关系说明实现就是右页宽度直读,无额外缩放。

5.5 返回语义

分栏态右栏点返回:左栏恢复列表内容、右栏回 Article、分栏保持(1418vp 读数不变)。返回不触碰分栏挂载——这与「分栏是窗口级状态、栈是页面级状态」的模型一致:back 退页面栈,分栏的生死由窗口状态与 fullScreenPages 决定,两者不同层。

这组读数的实测过程本身也值得记一笔:返回按钮在右栏诊断页内,点击注入要穿过「左栏应用窗口 + 右栏应用窗口」两个窗口的命中测试——uitest 的坐标是屏幕级的,落在哪个窗口由系统命中测试决定,与分栏无关。这个细节解释了为什么分栏态的自动化实测坐标要按整屏算而不是按栏算:栏是应用内的视觉概念,命中测试发生在窗口层。篇 5 与本篇的诊断按钮坐标全部按整屏 dump 取值,跨四配置稳定复用,没有因分栏比例变化而失效——因为按钮在左栏、左栏宽度在 1:1 档固定。

6、避坑

6.1 pagePairs 在购物模式静默失效

现象:配置 B 首版误把 pagePairs 与 mode=0 同配,跳转行为与不配 pagePairs 无差异,无告警无报错。

根因:pagePairs 仅导航模式生效,购物模式下静默忽略。

最佳实践:mode 与编排字段配对检查写成配置评审项:mode=0 只认 transPages,mode=1 只认 pagePairs;混配时以模式为准删另一字段。

验证:配置 B 改 transPages 后固定右显生效(图 2)。

6.2 虚拟容器开关改变窗宽说法,断点阈值要重校

现象:配置 D 下篇 15 的断点三档逻辑(600/900vp 阈值)若直接复用,wide 档(≥900)在 709vp 读数下永远进不去。

根因:enableReducedContainerSize 把窗宽说法换成右页尺寸,断点阈值是按整窗说法定的。

最佳实践:开关与断点阈值绑定声明——开虚拟容器则断点按半窗说法重校(或断点逻辑改读 isEasySplit 分支独立阈值);两者独立改动必出布局错档。

验证:709vp 读数留档,阈值怎么重校交给产品侧(本篇诊断页没有断点逻辑,不受影响)。

6.3 双机 hdc 通道瞬断要重试而非重跑

现象:实测那一遍多次 install/screenCap 报 E000004 通道建立中,首跑误以为配置没装上重跑整轮。

根因:双设备同连时 hdc server 通道偶发瞬断(单设备轮未见此频率)。

最佳实践:install/截图类命令包重试循环(最多 3 次、间隔 5s),读数类命令失败先验「装的是哪版配置」(版本号或诊断行存在性)再决定重跑范围。

验证:重试循环落地后四轮配置实测无整轮重跑。

7、总结,以及这次没测到的部分

路由编排的四个字段把「分栏之后页面怎么流动」从代码收进了配置:pagePairs 声明关系对、transPages 声明过渡页、fullScreenPages 声明退出点、虚拟容器声明尺寸说法。四组配置矩阵的读数差异全部可归因到单字段,说明这套配置的语义是干净的正交设计——干净的前提是模式配对(6.1)与说法绑定(6.2)两条规矩,违了它们正交性就破。

返回语义那一组读数补上了状态机的最后一条边:页面栈与分栏挂载不同层,back 只退栈不动分栏。理解这条,分栏态的导航设计就不用再猜「返回会不会把分栏弄丢」。

这次没测到的部分,列在这里:

  • 购物模式二级 push(过渡页「右推左」不可用)未实测,诊断页未设二级跳转按钮
  • fullScreenPages 恢复分栏的耗时未量化(主观无闪烁)
  • 虚拟容器对 lpx 与横向断点媒体查询的影响未逐项测(窗宽说法已量化)
  • navigationSplit 路线(Navigation 分栏)的路由编排差异未测,本篇全走 routerSplit;Navigation 路线的 homePage 语义(navBar 首页配置)与 navDestinationUpdate 回调的尺寸读数放到下篇讲
  • 返回响应耗时未量化(点击到右栏内容回退的间隔),主观观察为即时;量化需帧级诊断(篇 8 工具箱可复用)
  • 双机同连的 hdc 瞬断为开发环境现象(E000004 通道建立中),非设备缺陷,重试循环可解;单机连接时未观察到同频率瞬断

配置把行为收进声明,声明的正确性靠矩阵验证——这篇的四组构建,就是为下一份 easy_go.json 交的学费清单。

清单之外留一句给配置评审:easy_go.json 的每次改动都应该伴随一次「四问」——模式与编排字段配对吗(6.1)、虚拟容器开关与断点阈值绑定声明了吗(6.2)、fullScreenPages 与 home/related 有重复吗(schema 约束)、新增页面落点符合产品预期吗(矩阵验证)。四问过完再构建,配置类缺陷的返工率会显著低于「改了装机看效果」的试错循环——本篇四轮构建里有两轮是为补对照与补截图,没有一轮是为修配置错误,这个比例就是四问的价值。在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐