HarmonyOS 7 DualCart 平行视界适配实录 01:Navigation × EasyGo:主页关联页与列表详情双栏链路【鸿蒙心迹】

前一条 InsightBoard 连载已经把手机、折叠屏、平板、PC 的响应式布局做完,这次我换了一条明显不同的主线:不再由应用自己画两栏,而是把 Navigation 路由关系整理成平行视界可以识别和利用的页面关系。

Demo 叫 DualCart,是一个购物类应用。手机上仍然按普通页面栈运行;折叠屏展开态和平板大屏场景下,希望用户点击商品以后,左侧继续保留列表,右侧打开详情。

这件事看起来和 Navigation(mode: Split) 很像,但工程目标不一样。

普通 Split 是应用自己决定“现在画成两栏”;平行视界更强调系统级的应用内分屏体验,当前 HarmonyOS 官方示例也采用 Navigation 路由购物应用 + 配置 的方式实现,并覆盖主页关联页、路由模式、过渡页、请求全屏、横屏、虚拟容器以及平行世界下应用内分屏等典型场景。

所以这一期不追求把所有配置一次写完,只先把最短链路固定住:

Home
→ Category
→ ProductDetail

展开大屏后:

左侧:ProductList
右侧:ProductDetail

本轮统一数据:

taskId: parallel_20261002_01

device:
Foldable / Unfolded

viewport:
824vp

leftPane:
304vp

rightPane:
520vp

splitRatio:
37 : 63

routeStack:
Home → Category → ProductDetail

pairedRoutes:
ProductList | ProductDetail

selectedProduct:
product_1042 / Watch 5

status:
PAIRED_READY

一、先把“分栏”理解成路由关系,而不是 Row

最开始我确实想过最简单的方案:

Row() {
  ProductList()
  ProductDetail()
}

页面马上能做出来,而且截图也很好看。

问题出在手机。

手机仍然需要:

列表
→ 点击
→ 跳详情

如果大屏再维护一套 Row 逻辑,就会很快出现两条路由体系:

手机:
Navigation / NavDestination

大屏:
Row / 手动组件切换

同一个商品详情要维护两份进入方式,返回、Deep Link、状态恢复都容易分叉。

所以 DualCart 这一系列把 Navigation 作为唯一业务路由。

大屏只是让系统和配置知道:

哪些页面可以形成主从关系
哪些页面应该落到另一侧

业务本身仍然是一条路由树。

二、Navigation 路由名必须先稳定下来

第一篇我先把路由名字从页面文件名里抽出来。

这段代码解决的是“后面配置写了 ProductDetail,代码却改名成 ProductInfoPage”的问题:

export enum ShopRoute {
  HOME = 'Home',
  CATEGORY = 'Category',
  PRODUCT_LIST = 'ProductList',
  PRODUCT_DETAIL = 'ProductDetail'
}

export interface ProductRouteParam {
  productId: string
  categoryId: string
}

export class ShopRouteNames {
  static all(): string[] {
    return [
      ShopRoute.HOME,
      ShopRoute.CATEGORY,
      ShopRoute.PRODUCT_LIST,
      ShopRoute.PRODUCT_DETAIL
    ]
  }
}

路由名一旦进入平行视界配置,就不应该继续被当作“页面内部字符串”随便修改。

我现在把它看成一种对外契约。

文件名可以从 ProductDetailPage.ets 改成别的,组件可以重构,真正进入配置和 Navigation 的 route name 尽量稳定。

三、系统路由表和业务参数先保持一致

当前 HarmonyOS 的 Navigation 支持系统路由表,通过 router_map.json 配置后可以按需加载页面;官方当前文档也明确推荐 Navigation 作为主路由能力。

DualCart 当前的路由表概念保持简单:

{
  "routerMap": [
    {
      "name": "Home",
      "pageSourceFile": "src/main/ets/pages/HomePage.ets",
      "buildFunction": "HomeBuilder"
    },
    {
      "name": "ProductList",
      "pageSourceFile": "src/main/ets/pages/ProductListPage.ets",
      "buildFunction": "ProductListBuilder"
    },
    {
      "name": "ProductDetail",
      "pageSourceFile": "src/main/ets/pages/ProductDetailPage.ets",
      "buildFunction": "ProductDetailBuilder"
    }
  ]
}

具体字段仍以当前 SDK 和工程路由表要求为准,这里真正想强调的是:

Navigation route name
平行视界配置里的页面语义
日志里的 route name
测试用例里的 route name

要保持同一套名字。

否则调试时会出现“页面明明打开了,但配置没有命中”的错觉。

四、主页和关联页,不等于把所有详情都固定到右侧

第一版策略里我把 Home 看成主页面,把 ProductDetail 看成关联页。

但商品业务还有:

Home
→ Category
→ ProductList
→ ProductDetail

如果简单理解成“详情永远右侧”,Category 和 ProductList 的关系就会变得模糊。

所以应用内部先增加一层 ParallelPolicy,只描述业务角色,不替代系统配置:

export type ParallelRole =
  'PRIMARY' |
  'ASSOCIATED' |
  'NORMAL'

export class ParallelPolicy {
  role(route: string): ParallelRole {
    if (
      route === ShopRoute.HOME ||
      route === ShopRoute.CATEGORY ||
      route === ShopRoute.PRODUCT_LIST
    ) {
      return 'PRIMARY'
    }

    if (route === ShopRoute.PRODUCT_DETAIL) {
      return 'ASSOCIATED'
    }

    return 'NORMAL'
  }

  canPair(
    leftRoute: string,
    rightRoute: string
  ): boolean {
    return (
      this.role(leftRoute) === 'PRIMARY' &&
      this.role(rightRoute) === 'ASSOCIATED'
    )
  }
}

这个 Policy 不是 HarmonyOS 平行视界 API。

它只是 DualCart 自己的业务镜像,用来保证“配置语义”和“业务代码理解”一致。

后面测试时,如果系统显示和 Policy 预期不一致,就可以优先检查配置,而不是把问题全部推给页面。

五、选中商品不能由右侧详情自己拥有

做成双栏以后,我遇到的第一个状态问题不是路由,而是选中态。

左侧点击 product_1042,右侧详情打开。

如果 selectedProductId 只存在 ProductDetail 页里,左侧列表不知道哪一项应该高亮。

反过来,如果列表自己保存,右侧被系统恢复时又可能拿不到。

所以状态上移到 Store:

export class ProductSelectionStore {
  private selectedProductId: string =
    'product_1042'

  get(): string {
    return this.selectedProductId
  }

  select(id: string): void {
    this.selectedProductId = id

    AppStorage.setOrCreate(
      'selectedProductId',
      id
    )
  }
}

左侧和右侧都消费同一个 ID。

这也解释了为什么本轮截图里:

selectedProduct:
product_1042

不属于某一栏,而属于整个购物上下文。

六、点击商品仍然走 Navigation,不写“大屏特例”

列表页点击:

private openProduct(
  productId: string
): void {
  ProductSelectionStore.shared()
    .select(productId)

  this.pathStack.pushPathByName(
    ShopRoute.PRODUCT_DETAIL,
    {
      productId,
      categoryId: this.categoryId
    } as ProductRouteParam
  )
}

没有:

if 平行视界
→ 更新右侧组件

else
→ push 页面

这是第一篇我最在意的地方。

业务动作只有一次。

系统是否把关联页放到右侧,是适配层和配置决定的。

这样手机模式、平板模式、折叠屏模式之间不会产生两套购买链路。

七、分栏比例先记录,不把它写成业务条件

当前运行图里:

left=304vp
right=520vp
split=37:63

这组值是当前 DualCart 在 824vp 视口下的结果,用于调试和视觉验收。

它不是:

if ratio == 37:63
业务才能运行

商品列表只要满足最小可用宽度即可。

详情区域更宽,是因为电商详情需要:

商品图
价格
规格
操作按钮

列表只需要:

缩略图
标题
价格
选中态

比例是体验参数,不应该渗进业务逻辑。

八、DevEco 里重点看“路由对”,不是看两栏是否存在

本轮 DevEco 图:

HiLog 固定记录:

taskId=parallel_20261002_01

route:
Home → Category

paired route:
ProductList | ProductDetail

selected:
product_1042

viewport:
824vp

left:
304vp

right:
520vp

split:
37:63

status:
PAIRED_READY

只看“两栏出来了”是不够的。

如果左边实际是 Category,右边是 ProductDetail,但业务预期要求 ProductList 保持,就说明主从关系还没整理好。

所以日志必须同时记录 route role 和 selected state。

九、运行图第一次证明“一次点击、两种体验”

最终运行图:

当前大屏:

左:
ProductList

右:
ProductDetail(product_1042)

路由栈:
Home → Category → ProductDetail

手机上同一条点击代码仍然进入普通详情页面。

展开设备上,同一条路由在平行视界配置下形成应用内分屏。

这才是我想要的“一次开发”——不是一套页面在不同设备上强行复制布局,而是同一条业务动作被不同设备能力以更合适的方式呈现。

十、第一篇我故意没做“所有页面都并排”

平行视界很容易陷入一个误区:大屏就是能同时放两个页面,于是每个跳转都想占右栏。

实际产品里有很多页面并不适合:

登录
支付
隐私确认
图片沉浸预览
全屏视频
一次性中间处理页

这些会在后面几篇分别处理。

第一篇只建立最稳定的一对:

ProductList
+
ProductDetail

主页、分类、选中态和路由名固定以后,再继续加路由模式才不会越配越乱。

十一、当前官方示例为什么值得作为这条系列的基线

HarmonyOS 官方样例页在 2026-08-29 更新的“平行视界”示例里,明确使用 Navigation 路由的购物类应用 作为载体,并列出七个典型场景:

主页与关联页
路由模式
过渡页面
请求全屏
请求横屏
虚拟容器
平行世界下应用内分屏

这和 DualCart 的业务非常接近。

所以这个系列不沿用旧 Android Activity Codelab 去硬套,而是以当前 HarmonyOS Navigation 示例作为工程基线,再用 EasyGo / 平行视界的配置思路去组织页面关系。

十二、下一篇真正的问题是“中间页到底占不占一栏”

第一篇结束以后,最自然的下一步不是换商品。

而是下面这条路由:

ProductList
→ ProductBridge
→ ProductDetail

ProductBridge 是一个中间过渡页面:

参数补全
埋点
权限检查
跳转整形

它存在,但不应该长期占据右栏。

如果配置和业务都把它当正常关联页,用户会看到:

左边商品列表
右边一闪而过过渡页
再切到商品详情

体验很差。

所以下一篇会专门做路由模式、过渡页语义、右栏替换、左栏滚动与选中态连续性,并继续使用同一个 DualCart,不重建 Demo。

十三、配置层和业务层必须做一次“对表”检查

平行视界适配有一个很实际的风险:代码改了,配置没改;或者配置改了,测试工程还在跑旧路由。

DualCart 现在启动时会做一次轻量校验,把业务侧知道的路由角色输出出来:

export class ParallelConfigValidator {
  validate(
    expectedPairs: Array<[string, string]>
  ): string[] {
    const errors: string[] = []

    expectedPairs.forEach(([left, right]) => {
      if (!ParallelPolicy.shared()
        .canPair(left, right)) {
        errors.push(`${left} -> ${right}`)
      }
    })

    return errors
  }
}

它当然不能替系统验证真正的平行视界配置是否生效,但至少能提前发现应用内部对路由角色的理解已经漂移。

例如业务重构以后把 ProductList 拆成 SearchResult 和 CategoryResult,如果仍然只把旧路由当 PRIMARY,就应该在进入真机联调前先补齐业务角色和测试用例。

我现在把这类问题当成“配置漂移”,而不是页面 Bug。

十四、手机回退路径必须始终可用

适配大屏时最容易发生的一件事,是为了让双栏成立,反而把手机单栏流程改坏。

所以 01 的验收不是只在展开折叠屏上看一遍。

同一个 product_1042 至少跑两条路径:

Phone / COMPACT
ProductList
→ ProductDetail
→ Back
→ ProductList

以及:

Foldable / Unfolded
ProductList | ProductDetail
→ Back from detail
→ ProductList remains

两条路径共用同一个 openProduct()。

如果为了平行视界新增了 openProductForLargeScreen(),我会直接认为架构开始分叉。

这也是为什么第一篇一直把“业务动作只有一次”放在前面说。

十五、右栏首屏不能依赖用户先点击一次

另一个容易忽略的问题是:进入大屏页面以后,左侧有 24 个商品,右侧却是空白。

如果用户必须先点一条,双栏才有内容,第一屏会显得很浪费。

DualCart 当前策略是:

如果已有 selectedProductId
→ 恢复该商品

否则
→ 使用列表首个可用商品

但“默认第一条”只发生在没有历史选中的情况下。

代码示意:

ensureInitialSelection(
  products: Product[]
): string | null {
  const saved = ProductSelectionStore.shared().get()

  if (saved.length > 0 &&
      products.some((item) => item.id === saved)) {
    return saved
  }

  if (products.length === 0) {
    return null
  }

  ProductSelectionStore.shared()
    .select(products[0].id)

  return products[0].id
}

这样列表数据刷新以后,也不会因为第一条商品换了就强制覆盖用户原来的选择。

十六、这一篇的验收清单最终固定成 8 条

为了避免“看着像对了”就结束,我把 01 验收固定成:

1. 手机单栏路由正常
2. 折叠屏展开能形成列表 / 详情组合
3. selectedProduct 左右一致
4. 页面路由名与配置语义一致
5. ProductDetail 不重复创建业务 Store
6. 列表最小宽度下仍可操作
7. 回退后左栏仍保持
8. 不支持平行视界时自动退回普通 Navigation

最后一条很重要。

平行视界是增强体验,不应该成为应用可用性的前置条件。

如果设备形态、系统状态或配置没有进入平行视界,DualCart 必须仍然是一套完整的普通购物应用。

十七、最后再补一条异常路径:列表为空时不要强行建立配对

购物类应用并不是永远有商品。网络失败、筛选结果为空、商品下架,都可能让左侧暂时没有可选项。

如果这时仍然按照“进入大屏就一定要有右栏详情”的逻辑硬推一个 ProductDetail,页面会出现无效 productId,甚至把上一次残留商品继续显示出来。

所以当前策略是:

列表为空
→ 左侧展示空状态
→ 右侧展示占位说明
→ 不创建 ProductDetail 路由

列表恢复
→ 再执行 ensureInitialSelection()

这条边界看起来和 EasyGo 无关,却直接决定平行视界在异常数据场景下会不会留下“左右不一致”的假状态。

真正稳定的双栏不是任何时候都塞满两个页面,而是每一栏都能解释自己为什么存在。

十八、配置生效也要留一个可见的降级标记

DualCart 最后还保留 presentationMode 日志。进入平行视界时记录 PARALLEL_VIEW,普通单栏记录 SINGLE_STACK。这样遇到“大屏上为什么没有双栏”时,可以先确认系统能力和配置是否真的生效,再去查 ProductList 页面。

这能避免把配置问题误判成 ArkUI 渲染问题,也让后续 03、04 的全屏和虚拟容器测试有统一入口。

参考资料

  • HarmonyOS 7 官方示例:平行视界:https://developer.huawei.com/consumer/cn/samples/
  • 2026 年 7 月开发者月刊:平行视界一键适配:https://developer.huawei.com/consumer/cn/monthly/202607
  • HarmonyOS 多设备适配指南:https://developer.huawei.com/consumer/cn/multidevice/adaptive-apps/
  • Navigation 分栏开发:https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/arkts-navigation-split-mode

相关推荐

HarmonyOS 7 平行视界实战 04:分栏比例 + 状态同步解决“双栏研读台”多尺寸适配问题【鸿蒙心迹】

第四篇聚焦“双栏研读台”在HarmonyOS平行视界下的响应式体验,提出基于窗口宽度的智能分栏比例系统。通过定义可解释的RatioType模型与断点策略(<900:1:1, 900–1360:1:2, ≥1360:2:1),实现自动适配;结合LayoutService与StateSyncService,确保比例切换时阅读状态(文章、滚动位置等)可恢复、可同步。项目结构清晰分离布局与状态逻辑,使双栏体验在不同设备上保持一致性,真正实现“像同一个产品”。

李游的博客 95

HarmonyOS 7 平行视界实战 03:导航固定 + 覆盖切换重构“双栏研读台”大屏阅读体验【鸿蒙心迹】

本文聚焦大屏阅读中“固定导航+覆盖切换”模式的实现,解决第二篇“连续推进”带来的导航混乱问题。通过明确三条产品规则:左侧导航不动、右侧覆盖切换、返回仅恢复内容区状态,构建稳定体验。项目目录工程化拆分,引入FixedNavLayout、OverlayRouteService与ReadingSessionStore三核心组件,重构Index.ets为总装配台,以Stack结构实现内容层覆盖。强调导航职责单一——维持用户方向感,最终实现结构清晰、切换明确、返回可溯的大屏阅读链。

李游的博客 184

HarmonyOS 7 平行视界实战 02:左右推挤 + 路由关联完善“双栏研读台”连续浏览链路【鸿蒙心迹】

“双栏研读台”第二篇聚焦于构建连续阅读链路,通过Navigation路由系统实现文章间的层级推进,区分push与replace,确保浏览路径可追踪。引入路由历史、去重机制与来源标记(list/related),提升体验连贯性与可维护性。明确应用路由与系统平行视界职责分离,为大屏连续浏览提供清晰、可持续的架构基础。

李游的博客 248

HarmonyOS 7 平行视界实战 01:Navigation + ArkUI 搭建“双栏研读台”第一版分栏阅读【鸿蒙心迹】

本文聚焦于构建HarmonyOS平行视界下的“双栏研读台”第一版,核心是搭建稳定的页面关系骨架:通过Navigation分栏模式实现左列表、右详情的主从结构,使用NavPathStack管理路由切换,确保大屏下双栏布局的可演进性。项目目录清晰,优先用模拟数据验证分栏逻辑与点击跳转流程,不追求功能复杂度,为后续“左右推挤”“固定导航”“比例自适应”等交互能力的逐步扩展奠定基础。

李游的博客 253

HarmonyOS ohpm install × Git diff:三方库锁文件意外变更的发布前门禁【鸿蒙心迹】

同一个 HarmonyOS 工程,在开发机上安装第三方库之后可以正常启动,到了发布分支却多出一份没有人解释的锁文件变化。这时最麻烦的往往不是“到底哪个包升级了”,而是根本不知道变化来自主动更新、清理缓存之后的重装,还是有人随手执行了安装命令。等到上架构建报错再去倒查,版本记录、安装日志和提交历史通常已经分散。本文做一个很窄的发布前门禁:识别 Git 工作区中依赖清单与锁文件是否出现未经解释的变化,并把差异交回给维护者复核。这里需要先划清官方能力和项目脚本的边界。是工程或模块的依赖声明文件,

李游的博客 23

HarmonyOS ArkUI Slider × Stack:超分前后对比滑杆的零宽保护与位置校准【鸿蒙心迹】

做图片超分功能时,最容易吸引注意力的是处理后有多清晰。但真正给用户验收效果的页面,往往只是两张照片和一根可以左右移动的滑杆。它看起来很简单,却有一个容易忽视的问题:比对位置应当对应原图和增强图中的。如果布局初始宽度尚未确定,或者前后图以不同裁切方式铺满容器,视觉上就会出现“滑杆移动,山峰也跟着跑”的错觉。本文不实现超分算法,而是把比对组件本身做成有明确边界的 ArkUI Demo。

李游的博客 87

HarmonyOS ArkUI focusControl × id:平行视界列表重排后的焦点定位与失效回退【鸿蒙心迹】

更糟的是某条结果被过滤后,开发者继续请求一个已经不存在的组件 ID,只看到焦点请求失败,却没有可预测的回退路径。双栏资料浏览器有一个不太显眼的问题:内容换成了第二条,蓝色选中态也停在第二条,但接上键盘继续操作时,焦点可能回到第一条。另外,示例把已选中的 N-902 保存在父组件中,不依赖点击后的页面栈来恢复,因此也不等同于 Navigation 自动替应用保存焦点。这份方案的价值不在于创造新的“平行视界 API”,而是把列表业务键、焦点目标 ID、焦点请求受理和焦点实际落点拆成可核查的四个量。

李游的博客 43

HarmonyOS ohpm list × Node.js fs:三方库目录体积阈值与资源副本预检【鸿蒙心迹】

可靠的脚本至少应检查目标是否仍落在项目根下,区分普通文件与目录,拒绝跨目录的符号链接,并将读取失败当成明确错误而非记作零字节。示例对候选资源读取字节并计算 SHA-256,先按字节数分桶,再对疑似相同的内容求摘要,最后给出资源对。查看已安装依赖关系,人工或由 CI 维护一份被批准的目标目录映射,再让 Node.js 读取这些确定路径,不去猜某个版本的内部 lockfile 结构。这种做法少了一点“全自动发现”的炫目,却更容易审核:扫描范围是受控的,某个目录变了要修改配置,而不是让脚本在整个。

李游的博客 59

HarmonyOS ArkUI GridRow × accessibilityText:折叠屏大字模式下操作卡片的断点与朗读校验【鸿蒙心迹】

但当用户把系统字体调大,或者应用处于窄窗口时,标题变成两行,按钮的朗读信息却依然只有一个“查看”,四张卡片都是相同提示。这个函数只是测试用的契约校验,不属于 ArkUI 或系统无障碍 API,更不能替代真实聚焦和朗读顺序的体验测试。在本例里,四个按钮可见文字都叫“查看”,却分别设置“文档管理,查看”“图片处理,查看”等上下文标签。第四次开启屏幕朗读,从 A-01 依次移动到 A-04,记录实际读到的标签、动作、描述,以及聚焦跳转顺序。则为相邻卡片留出间距,不能用一个很大的空白文本元素强行撑开布局。

李游的博客 163

HarmonyOS 3DGS × Node.js:相机位姿时间戳与角度单位的重建前门禁【鸿蒙心迹】

前一轮已经讨论过输入帧序与缺口,这里换一个更深的位置:帧号连续只说明文件清单能排上队,不能证明同一场景的位姿元数据可用。3DGS 项目最让人头疼的环节未必是建模,而是输入数据看起来齐全,实际却有两类难以肉眼发现的元数据问题:相机位姿中的角度单位没有统一,或者采集时间戳在导出、合并时倒退。它不会触发拍摄,不会重建点云,不会向远端服务提交素材,反而方便把隐私敏感的拍摄数据与审计摘要分开保存。如果未来需要真正联动,需要另做可信的报告传递、签名和读取流程,不能把图片里的“导出预检清单”按钮当作已实现的系统能力。

李游的博客 95

HarmonyOS ArkUI ForEach × ArkTS Map:闪控窗候选提醒的 TTL 淘汰与重复合并【鸿蒙心迹】

本文代码和配图用于说明工程设计,示例时间、订单号、日志及屏幕都是;不表示已在 DevEco Studio 编译或真机跑通,也不表示接通系统闪控窗。所谓“候选提醒”,专指应用自行管理的展示列表。

李游的博客 171

HarmonyOS ArkUI $r × Node.js:上架前多语言占位符漂移与回退清单审计【鸿蒙心迹】

文章、日志、审核结果与配图均为,不是华为应用市场官方审核结论、真实审核接口调用或已完成的真机测试。本文的“BLOCK”只表示团队自定义发布门禁未通过。

李游的博客 154

HarmonyOS ArkData Preferences × ArkTS:精准碰一碰确认超时与撤回恢复【鸿蒙心迹】

Demo:TouchConsent|任务编号:TP-206|业务素材:DOC-418 / 会议资料.pdf / 2.3 MB内容性质:精准碰一碰的业务确认层方案。数据、日志、示意界面均由案例构造,未接入或实测系统精准碰一碰回调。

李游的博客 202

HarmonyOS ArkUI Image × ArkTS Promise:超分预览回包乱序与跨图串帧防护【鸿蒙心迹】

Demo:UltraPreview|任务编号:SR-206|方向:图像超分业务预览层内容性质:基于官方组件资料编写的工程示例;文中日志、数据和图片是,未在真机或 DevEco Studio 中实测,也不代表系统自带超分推理接口。

李游的博客 153

HarmonyOS 7 + ArkUI GridRow:折叠盘点页的筛选快照与断点渲染解耦【鸿蒙心迹】

本文通过 StockFold Demo 演示了折叠屏下响应式布局变化引发的查询错位风险:界面断点切换导致布局重构,若将当前视图状态误作导出条件,易造成“用户看到的”与“导出的”不一致。核心解决方案是:冻结筛选快照(QuerySnapshot),以 id 为唯一标识,确保异步回执比对快照而非实时输入;同时分离布局与业务状态,避免 onBreakpointChange 干扰查询逻辑。强调三类验证顺序与日志追踪,保障导出一致性,提升跨设备体验可靠性。

李游的博客 22

HarmonyOS 7 + Node.js JSON5:上架受限权限的发布凭据与视频证据映射【鸿蒙心迹】

本文介绍ReleaseProof本地发布材料预检工具,针对华为AppGallery Connect上架中“包内声明、发布配置、证据材料”三份清单不一致的常见问题。通过模拟检查受限权限R-01的视频缺失,输出NEEDS_REVIEW与具体缺项,实现对人工准备材料的完整性校验。工具仅做映射核对,不替代审核结论,强调清单来源可信、人工复核必要,并建议生成可追踪的工单以提升协作效率。

李游的博客 19

HarmonyOS 7 + ohpm nativeComponents:Native HAR 的 SDK 兼容声明分层校验【鸿蒙心迹】

本文介绍 NativeCompatGate 兼容性预检机制,针对 HAR 引入 Native 代码时的 SDK 版本不一致问题。通过分析 oh-package.json5 中的 compatibleSdkVersion 与 nativeComponents 字段,仅校验元数据(不反编译 ELF),识别如 NATIVE_SDK_TOO_NEW 等风险。基于整数版本比对,区分宿主、HAR 及 Native 组件的 SDK 标识,避免误判。报告页面清晰展示各层版本与问题来源,强调“本地门禁”非编译失败,提升复用组

李游的博客 23

HarmonyOS 7 + ArkUI Slider:折叠屏时间轴的朗读步长与精细编辑分离【鸿蒙心迹】

本文介绍FoldTrim项目中如何解决折叠屏下时间轴裁切的无障碍操作矛盾。通过分离“普通编辑步长”(step=1)与“朗读手势步长”(scrollStep=5),实现精准控制与高效操作的平衡。采用配置校验函数确保参数合法性,避免隐式错误;页面状态独立于布局变化,保障数据一致性;并通过纯函数测试验证逻辑正确性,区分推演与真实设备行为,提升开发可维护性与可测性。

李游的博客 22

HarmonyOS ArkTS×3DGS:相机位姿矩阵正交性检查与坏帧隔离【鸿蒙心迹】

本文提出名为 PoseFence (PF-1010) 的端侧3DGS重建前置校验工具,针对相机位姿数据中常见的旋转矩阵非法问题。通过检查矩阵正交性、单位长度及行列式符号,区分“缩放错误”(SKEW)与“镜像反射”(MIRRORED),避免误判重建算法缺陷。基于ArkTS实现轻量级校验逻辑,支持行优先格式输入,输出详细诊断报告。六组示例验证得4帧通过、1帧SKEW、1帧MIRRORED,强调校验不修改原始数据,仅作门禁拦截,保障后续重建流程可靠性。

李游的博客 15

HarmonyOS ArkUI×accessibilityText:发布前图标按钮无障碍标签覆盖巡检【鸿蒙心迹】

本文提出一种轻量级无障碍自查方案,通过维护静态控件清单与本地脚本审计图标按钮的可访问性标签。针对“无文字图标”易被忽略的问题,强调accessibilityText与accessibilityDescription的正确使用,并以AX-1011为例,实现4项自动通过、1项人工复核的可解释检查流程。方案不依赖自动扫描,重在建立业务责任机制:确保每个图标入口有唯一ID、清晰标签与语义说明,辅以断言验证与人工复核,避免仅凭数量达标而忽视真实可用性。最终目标是推动发布前可读性审查落地,而非替代设备实测。

李游的博客 20

HarmonyOS AppGallery Connect×Node.js:上架截图规格离线检查门禁【鸿蒙心迹】

本文介绍如何为华为AppGallery Connect发布构建本地图片门禁系统,通过Node.js脚本自动校验图标与竖版截图的尺寸、数量及文件大小,实现对AG-909任务的静态检查。脚本仅读取PNG头部信息,快速识别错误(如02-task.png高度不符),输出可追溯的修复建议,并以非零退出码提示失败,助力团队在发版前精准定位问题,提升上架效率与准确性。

李游的博客 29

HarmonyOS ArkUI List×平行视界:筛选后滚动锚点回填与右栏定位隔离【鸿蒙心迹】

本文探讨宽屏应用中左右分栏布局的锚点恢复问题,核心是区分“索引”与“记录ID”——筛选后列表顺序变化,仅靠索引无法准确还原用户浏览位置。通过引入anchorId(锚点)、selectedId(详情)和visible(筛选结果)三者分离的设计,确保滚动恢复不干扰右侧详情。利用纯函数resolveAnchor实现基于业务规则的兜底策略,结合ArkUI的Scroller与稳定key,实现精准锚点定位。同时建议以首个可见项更新锚点,避免因滚动误判位置,提升用户体验一致性。

李游的博客 19

HarmonyOS ArkTS×3DGS:采集包断号与失联帧的重建前门禁【鸿蒙心迹】

摘要(≤150字): 为解决拍摄中断后清单完整性误判问题,开发 FrameLedger 工具,在3DGS重建前校验采集清单。它独立检查序号缺失(如4、6)、空URI(如7),区分“未采集”与“引用失效”,输出三类计数:记录数、缺失序号、空引用序号。不依赖重建接口,仅基于自定义清单,确保结果可复现、不可混淆。通过明确边界与阻断逻辑,防止错误导出,保障数据可追溯性,提升采集流程可靠性。

李游的博客 20

HarmonyOS string.json×Node.js:上架前多语言占位符漂移巡检【鸿蒙心迹】

本文针对多语言本地化中“资源存在但文案不完整”的隐蔽问题,提出用Node.js编写静态巡检脚本LocaleProof,通过对比基准语言与目标语言的占位符数量与类型,精准识别如日语pickup_eta缺参数、privacy_hint缺失等2类问题。脚本拒绝静默覆盖,强制校验重复键与格式错误,输出具体文件与键名问题,支持CI流程集成。强调自动化检查无法替代人工审校,尤其在语序翻转、文化合规、布局适配等方面仍需人工介入。

李游的博客 16

HarmonyOS Image Kit×PixelMap:超分前ROI裁剪越界保护与资源归属【鸿蒙心迹】

本文针对图像超分流程中的裁剪预检环节,提出并实现 RoiBench 的边界校验逻辑(任务号 ROI-708)。针对原始像素坐标与界面缩放坐标的差异,设计 clampRoi 函数,通过角点计算确保选区合法,自动截取有效交集。结合 cropAndReleaseOwnedPixelMap 实现资源安全释放,避免共享 PixelMap 引发的副作用。进一步通过 estimateTarget 预估二倍超分所需内存(约 1.10 MiB),为后续处理提供预算参考。整体流程强调输入合法性、所有权清晰与可复查日志,不涉及实

李游的博客 13

HarmonyOS 闪控窗×ArkTS:取件倒计时前后台补偿与终态幂等【鸿蒙心迹】

本文以 QueuePulse 取件任务 QP-707 为例,揭示前后台切换下倒计时状态错乱的根源:将 remainingSec 当作唯一真相会导致业务事实失真。提出三层次设计:以 dueAtMs 为不可变截止时间,status 表示终态,remainingSec 仅作为实时计算值;通过 DeadlineClock 分离刷新调度与状态更新,确保恢复前台后正确重算剩余时间;引入 TerminalGate 防止“完成取件”与“到期关闭”重复提交。强调倒计时仅为展示,终态必须由幂等闸门控制,日志应区分刷新与业务事件

李游的博客 16

HarmonyOS ArkTS×精准碰一碰:交接回执幂等防重与状态回退【鸿蒙心迹】

本文以“现场交接”为场景,通过TapReceipt样例拆解物理触发、业务受理与回执落账三者差异。基于唯一requestId实现幂等判重,区分确认、重复与冲突状态;页面独立统计接收次数与有效确认数,确保可观测性;强调本地台账仅作临时缓冲,最终幂等需由服务端保障。同时提醒:状态不可逆、时间戳可信、日志过滤严谨,并指出跨进程持久化与版本控制等工程边界,为真实接入“碰一碰”能力提供前置设计参考。

李游的博客 14

HarmonyOS HAR×ArkGuard:混淆发布后公共接口契约保护【鸿蒙心迹】

本文聚焦HarmonyOS HAR库发布时的混淆兼容性问题,强调“debug通过≠release可靠”。核心指出:公共API稳定性不等于内部标识符不变,反射字符串、序列化字段等动态依赖易被忽略。需通过consumerFiles传递明确保留规则,并建立静态检查、构建产物验证与消费端运行回归三重隔离。建议以最小化保留策略保护真实契约,杜绝凭经验添加规则。巡检应区分“静态通过”与“发布通过”,关键路径必须人工复核,避免误判。最终强调:版本变更须同步更新契约与回归用例,确保发布可信。

李游的博客 25

HarmonyOS ArkWeb×JSBridge:营销H5消息白名单与过期会话隔离【鸿蒙心迹】

本文介绍鸿蒙应用中通过ArkWeb实现H5与原生交互的安全机制——PromoGate。针对外部页面可能发送非法或过期消息的风险,设计了基于sessionId、action、couponId的三重校验策略,仅允许特定动作(如openCoupon)且拒绝类型不符或旧会话请求。通过限制JSBridge暴露方法为单一submit,结合白名单控制与会话生命周期管理,确保消息可信、权限可控。示例验证三条测试用例:放行1条、拒绝类型1条、过期会话1条,强调安全边界应由原生侧严格把控,而非依赖前端校验。

李游的博客 15

HarmonyOS ArkUI GridRow:跨窗报修看板断点重排与统计守恒【鸿蒙心迹】

本文提出在响应式布局中分离数据与排版逻辑,确保窗口宽度变化仅影响卡片列数而不触发数据重载。通过固定ticketId作为唯一标识、使用纯函数countByStatus统一统计口径,并结合GridRow的breakpoints与WindowSize实现视觉自适应,避免因断点切换导致工单消失或统计闪烁。强调“统计守恒”原则,验证数据一致性,提升报修看板在多窗口场景下的稳定性与可读性。

李游的博客 25
上一篇: HarmonyOS 7 InsightBoard 多形态适配实录 06:ArkUI × 多设备回归:布局抖动、监听释放与全形态验收【鸿蒙心迹】
下一篇: HarmonyOS 7 DualCart 平行视界适配实录 02:Navigation × EasyGo:路由模式、过渡页与双栏状态连续性【鸿蒙心迹】
李游Leo
李游Leo 北京杰森游睿教育科技有限公司 北京杰森游睿教育科技有限公司
博客等级 码龄14年 2155粉丝 668原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值