Skip to content

Feat/sync: Upstream 2.1.2 - #170

Merged
cnoim merged 12 commits into
dev4harmony:ohosfrom
wm-develop:feat/sync-upstream-2.1.2
Aug 24, 2026
Merged

cnoim merged 12 commits into
dev4harmony:ohosfrom
wm-develop:feat/sync-upstream-2.1.2

Conversation

@wm-develop

Copy link
Copy Markdown
Member

跟进上游 2.1.2(17e92c470)

一、逐提交处置

提交 标题 处置
a33284dec fix bggRGjQaUbCoE#2621(默认首页不在导航栏里时 index 为 -1) ✅ 全跟
5fc313889 upgrade deps ⛔ 不跟,只动 pubspec.lock,依赖按鸿蒙自己的 pin 走
0b7a58d9c feat: 二级评论独立排序设置 (bggRGjQaUbCoE#2655) ✅ 全跟
867bf6bd4 fix: WebDAV client 绑定当前设置 (bggRGjQaUbCoE#2667) ✅ 全跟(文件与 merge-base 完全一致,干净替换)
53269d9f9 蜂窝网络独立首选解码格式 (bggRGjQaUbCoE#2571) ✅ 全跟
efe03c647 feat(macos): Command+R 刷新推荐 (bggRGjQaUbCoE#2537) ✅ 全跟(Platform.isMacOS 守卫,鸿蒙无副作用,跟了少一份漂移)
4ca037345 feat: 字体设置页 (bggRGjQaUbCoE#2611) 🟡 部分跟进,见第二节
1b9130eeb fix: 登出所选账号(原来只登出主账号) (bggRGjQaUbCoE#2666) ✅ 全跟
aa8f650b8 fix bggRGjQaUbCoE#2664(动态页 controller 为空时下拉刷新崩) ✅ 全跟
17e92c470 Release 2.1.2 🟡 只改版本号

实测核验(逐 hunk 在最终工作区里找 after 文本):除 4ca037345 外全部 100% 落地;报 N/A 的 hunk 都是鸿蒙侧上下文不同导致的匹配失败,已逐条 grep 确认代码确实在(dart:math/math.max、addHandler/removeHandler/_handleKeyEvent/refreshRecommendations、utils.dart import/logoutAccount/removeAccounts)。


二、4ca037345 feat: font setting page 的取舍

上游把「App字体字重」「字体大小」两个入口合并成一个 /fontSetting 页面,并新增系统字体族选择。改动 13 个文件,含一个 5771 行的 lib/utils/fontconfig.g.dart。

跟进的部分

文件 说明
pages/setting/pages/font_setting.dart 新页面,原样
utils/fontconfig.g.dart Linux fontconfig 的 ffigen 绑定,纯 dart:ffi,原样
pages/setting/models/style_settings.dart 新入口,删掉旧的字重 SplitModel 与字体大小入口
router/app_pages.dart /fontSizeSetting → /fontSetting
utils/storage_key.dart、storage_pref.dart 新增 appFont
pubspec.yaml 只加 ffi: ^2.2.0(pubspec.lock 因此只多 1 行改动)
android/.../AndroidHelper.java 原样(安卓构建专用,不参与分析)
删除 pages/setting/pages/font_size_select.dart 已被新页面取代

改写的部分:lib/utils/font_utils.dart

上游三条实现分支,鸿蒙只留 Linux 一条:

  • 安卓分支摘除 —— 上游走 JNI 调 AndroidHelper.fontFamilies()。鸿蒙分支没有 jni 依赖,lib/utils/android/bindings.g.dart 是手写的空实现存根,硬跟就得伪造 JArray/JString/toDartString(releaseOriginal:) 一整套假 API,得不偿失。
  • Windows 分支摘除 —— 上游用 win32 6.4.0 的 API(GetDC(null)、LPARAM(0)、ReleaseDC(null, hdc))。鸿蒙 dependency_overrides 把 win32 钉在 5.5.3(鸿蒙化插件链的要求,flutter pub get 输出里明确写着 win32 5.5.3 (overridden)),两者 API 不兼容,实测 4 个 argument_type_not_assignable / extra_positional_arguments 编译错误。win32 的 override 哪天放开了,把上游那两段抄回来即可,文件头有注释。
  • 失败提示改为按平台判断 —— 上游是「三条分支都没成功就弹『加载系统字体失败』」。鸿蒙上没有任何一条能跑,会每次进页面都弹一次误导性的 toast。改成只有真正实现了枚举的平台(本分支即 Linux)失败时才提示。

结果:鸿蒙上 FontUtils.getFont() 返回空集合,而 font_setting.dart 里本来就有 if (_fonts.isNotEmpty) 守卫,所以字体下拉框不会出现,页面只剩字重和字号——这两项在鸿蒙上完全可用,且比原来两个分散入口好用(带实时预览)。将来若接了 ArkTS 侧的字体枚举通道,在 font_utils.dart 里补一条 _initHarmony() 就能启用。

手工解决的部分:lib/utils/theme_utils.dart

鸿蒙这个文件早就大幅偏离:字重在 appFontWeight == -1 时跟随系统(HarmonyChannel.systemFontWeightScale 分区间映射),字体族恒为 HarmonyOS Sans / 内置的 HarmonyOS_Sans。上游这次要把用户自选的 Pref.appFont 接进 textTheme。

处置:

  • 鸿蒙的字重跟随系统逻辑整段保留;
  • 字体族改成 Pref.appFont ?? (useBuiltInFont ? "HarmonyOS_Sans" : "HarmonyOS Sans")——鸿蒙上 appFont 恒为 null(枚举不到,下拉框都不出现),行为与改动前完全一致;本仓库的 Linux 构建上则由用户选择覆盖;
  • 上游的 changeStyle(font 与 fontWeight 都为 null 时把 textTheme 整个置 null 的短路优化)不采纳——鸿蒙的 fontFamily 永不为 null,这个短路恒不成立,保留鸿蒙原本的无条件写法更直白;
  • 修掉自动合并制造的两处重复具名参数:appBarTheme.titleTextStyle 和 dialogTheme.titleTextStyle 里,上游新增的 fontFamily: font 和鸿蒙已有的 fontFamily: fontFamily 被 git 拼到了同一个 TextStyle(...) 里。git 没报冲突。

未跟进:lib/utils/android/bindings.g.dart

上游给它加了 31 行 fontFamilies() 的 JNI 绑定。鸿蒙保留自己的 43 行空实现存根(git checkout --ours)。注意这个文件在鸿蒙的 analysis_options.yaml 里不排除(上游排除了),是刻意的——存根必须保持能通过分析。


三、其余冲突的处置

git merge 报了 6 个冲突:

文件 处置
pubspec.yaml 取鸿蒙侧整块依赖声明,只补 ffi: ^2.2.0;版本号不动
pubspec.lock 取鸿蒙侧,随后 flutter pub get 重解,净变化 1 行(ffi 由 transitive 变 direct main)
lib/utils/android/bindings.g.dart 取鸿蒙存根
lib/utils/theme_utils.dart 手工,见上
lib/pages/main/view.dart 双方各自新增,取并集(鸿蒙的 _nativeTabsWorker/_nativeTopBarWorker + 上游的 macOS 键盘 handler)
lib/pages/setting/view.dart 只是 import 顺序,取并集后按字母序排

四、附带修复:悬浮底栏被拉满整屏宽(独立提交,不在 merge 里)

现象

设置里开「悬浮底栏」后,鸿蒙上底栏横向撑满整屏,安卓上是正常的居中胶囊。

根因

FloatingNavigationBar 内部是 SizedBox(width: destinations.length * 86),必须拿到松的宽度约束才能保持自身宽度。该文件与上游 2.1.2 字节一致,问题不在控件里,在外面怎么给约束。

上游从 e89241109 opt ui(2026-07-30)起把主页布局换成了自绘的 MainLayout:

final bottomNavSize = ChildLayoutHelper.layoutChild(bottomNav, constraints.loosen());
setOffset(bottomNav, Offset((constraints.maxWidth - bottomNavSize.width) / 2, ...));

松约束 + 手动水平居中,所以安卓是对的。鸿蒙没跟进这个骨架重构,仍然走 Scaffold.bottomNavigationBar,而 Scaffold 给这个 slot 下发的是:

// material/scaffold.dart:1035
final BoxConstraints fullWidthConstraints = looseConstraints.tighten(width: size.width);

宽度是紧约束,SizedBox 的 258 被 BoxConstraints.enforce 夹成整屏宽。

为什么不直接跟进 MainLayout

它会整个替掉 Scaffold,而鸿蒙有几样东西挂在上面:零高 AppBar(状态栏取色的依赖,代码里有注释「Flutter 在鸿蒙平台上的状态栏颜色依赖于AppBar设置的backgroundColor进行取色」)、extendBody、extendBodyBehindAppBar、resizeToAvoidBottomInset: false、侧栏 + VerticalDivider、body padding。为一个底栏宽度做这个重构不划算。

依赖倒是齐的:MainLayout 需要的 slotted_layout_helper.dart 鸿蒙已经有了,是随 60b993804 refa refresh indicator 进来的。将来真要跟进 MainLayout 时不缺零件。

修法

只给 floatingNavBar 那一支包一层 Align:

bottomNav = Align(
  alignment: Alignment.bottomCenter,
  heightFactor: 1,
  child: Obx(() => FloatingNavigationBar(...)),
);
  • RenderPositionedBox.performLayout 对子节点用的正是 child.layout(constraints.loosen())(rendering/shifted_box.dart:88),与上游 MainLayout 的做法完全一致;
  • heightFactor: 1 → Align 自身高度按子节点算,Scaffold 据此计算 body 内边距的结果与改动前一致;宽度方向 widthFactor 为 null 且 maxWidth 有限,Align 撑满整宽,子节点按 Alignment.bottomCenter 水平居中;
  • Align 的 hitTestSelf 为 false,只测子节点,两侧空白区域的点击会穿透到下面的内容,与上游 MainLayout(bottomNav 只占胶囊大小)的表现一致。

MD3 底栏与旧版 BottomNavigationBar 本来就该撑满,两支未动。

五、下一轮注意

  • win32 override 若放开到 ^6.3.0,可以把 font_utils.dart 的 Windows 分支抄回来。
  • 鸿蒙侧若接了字体枚举通道,font_utils.dart 补 _initHarmony(),theme_utils.dart 那行 Pref.appFont ?? ... 无需再改。
  • lib/utils/android/bindings.g.dart 每次上游动它都会冲突,固定取 --ours。
  • theme_utils.dart 是本轮唯一一个「自动合并出编译错误」的文件(重复具名参数),下一轮它仍然是最容易出问题的地方,合并后优先看它。
  • 若哪天决定跟进 MainLayout(e89241109 opt ui),第五节里列的那几样 Scaffold 依赖必须逐条找到替代,尤其是零高 AppBar 的状态栏取色;跟进之后可以把那层 Align 去掉。

bggRGjQaUbCoE and others added 12 commits August 23, 2026 11:28
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
…#2655)

二级评论新增独立排序设置(设置-其他设置-二级评论展示),默认按时间排序,避免热度排序下对话链断裂(回复者排在被回复者前面)。一级评论排序不受影响,与官方楼中楼行为一致。

Co-authored-by: Meteor-3 <meteor3@users.noreply.github.com>
* Add Command-R refresh for macOS recommendations

* Fix macOS recommendation refresh shortcut handling
* feat: font utils

* feat: font setting page
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
@cnoim
cnoim merged commit 8ea3b5f into dev4harmony:ohos Aug 24, 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.

[Bug] MacBook neo登录账号后状态异常 [Bug] 安卓2.1.1更新后只显示灰屏

8 participants