Skip to content

fix(ohos): 修复小窗/自由多窗与沉浸顶栏下的遮挡;将顶部避让改为原生自行上报 - #181

Merged
HelloZeroNick merged 1 commit into
dev4harmony:ohosfrom
wm-develop:fix/ohos-decor-top-inset
Sep 20, 2026
Merged

HelloZeroNick merged 1 commit into
dev4harmony:ohosfrom
wm-develop:fix/ohos-decor-top-inset

Conversation

@wm-develop

Copy link
Copy Markdown
Member

问题

切到 Flutter 3.44.9 后:

  1. 小窗下视频页、以及运行中才开启系统「自由多窗」后的所有页面,顶部内容压在系统窗口控件(最大化/最小化/关闭)下面;冷启动前已开启自由多窗则正常。
  2. 开启「沉浸顶栏」时,首页分类栏遮住第一行卡片上沿,下拉刷新指示器从屏幕最顶部出现、被搜索栏盖住。

原因

  1. 与 3.44 本身无关,是 embedding 的 af6c8ca176a(2026-09-08,3.41/3.44 均含)改了 setEnabledSystemUIOverlays 路径:小窗没有三键/不支持装饰栏时直接 setPaddingTop(0),不再回落到系统避让区;运行中打开自由多窗时窗口状态仍是 FLOATING,没有事件触发重算,钉住的 0 一直保留。
  2. 3.44 迁移跟进上游新的 RefreshLayout 后,RefreshIndicator.edgeOffset 不再被使用,沉浸顶栏传入的下移量失效。

修改

  • HarmonyChannel.ets:新增顶部避让上报,取系统顶部避让区与自由窗口三键高度的 max,监听三键区域/窗口状态/避让区/窗口尺寸变化推送给 Dart。
  • harmony_channel.dart / main.dart:新增 decorTopInset,在根 MediaQuery 的 mergeCutout 里与 padding.top 取 max;新增 rootTopInset 供 Scaffold body 内部取根视图顶部避让(body 内 MediaQuery 顶部已被 Scaffold 移除)。
  • native_top_spacer.dart:沉浸顶栏留白与刷新指示器偏移改用 rootTopInset。
  • refresh_layout.dart / refresh_indicator.dart:补回 edgeOffset(指示器位置与裁剪区整体下移)。

非自由窗口下上报值与 embedding 正常算出的 viewPadding.top 同源,取 max 不改变现有行为。

@HelloZeroNick
HelloZeroNick merged commit 381dc88 into dev4harmony:ohos Sep 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants