Skip to content

Feat/sync upstream 2.1.4 - #177

Merged
wm-develop merged 34 commits into
dev4harmony:ohosfrom
wm-develop:feat/sync-upstream-2.1.4
Sep 15, 2026
Merged

wm-develop merged 34 commits into
dev4harmony:ohosfrom
wm-develop:feat/sync-upstream-2.1.4

Conversation

@wm-develop

Copy link
Copy Markdown
Member

跟进上游 2.1.4(ce17223a8)

一、逐提交处置

提交 标题 处置
d7fb17b91 opt: mpv args & native event loop (bggRGjQaUbCoE#2873) 🟡 mpv_convert_webp.dart 的 idle=once / mpv_request_event / 只认 SHUTDOWN 全跟;pubspec 里 media_kit 换到 My-Responsitories/media-kit@native 不跟(鸿蒙锁 feat-ohos fork),见第二节
5aa7b02e3 feat: page order ✅ 全跟(收藏夹详情页新增「页码顺序 正序/倒序」,PageOrderMixin)
879679fc6 add seek position ✅ 全跟(seekPosition / progress / onSeekStart,播放器与听视频页进度条拖动时显示目标位置)
78d266ae7 fix(linux): single instance (bggRGjQaUbCoE#2884) ✅ 原样合入(linux/,鸿蒙不构建)
444898e4f tweaks (bggRGjQaUbCoE#2889) ✅ 全跟(直播间/聊天面板/tcp/live.dart/LaTeX 转换器/wbi_sign 等零散调整,无冲突)
9c9076a4c refa dyn reaction (bggRGjQaUbCoE#2894) 🟡 「赞与转发」拆成「转发」「赞」两个 tab、like_list/ repost_list/ 新页面、grpc/dyn.dart 新接口全跟;DynTabBar 不跟(依赖上游 tabs.patch 打开 SDK 私有类),动态详情页仍用普通 TabBar(isScrollable: true),见第二节
d7c6263c8 update position on seek ✅ 全跟
9730d29a8 fix bggRGjQaUbCoE#2892 ✅ 全跟
5b1e909d6 opt dyn repost item ✅ 全跟
68fb0e396 upgrade deps ⛔ lib/scripts/material/scaffold.patch 保持删除;pubspec.lock 见 47e94b33b
74203a89f pass uidOffset to dyn like list ✅ 全跟
7a86daba8 migrate reply main list api ✅ 全跟(评论主列表换接口)
32538c4d7 opt block segment edit panel ✅ 全跟(手机上片段起止时间改用底部弹层编辑;鸿蒙的 ExtendedVisibilityDetector + Stack FAB 骨架保留)
8795d0628 opt ui 🟡 switch_item.dart、直播/视频顶栏按钮、kDebugMode || enableSponsorBlock 全跟;视频/直播全屏顶栏保留鸿蒙的 AppBar 外壳(上游改成 Padding),见第二节
1f1ac0fbe fix bggRGjQaUbCoE#2909 🟡 三个调用点改成 PiliAndroidHelper.openUrl 全跟;鸿蒙替身实现直接 PageUtils.launchURL,bindings.g.dart 存根补 isDomainVerified/openUrl;AndroidHelper.java 原样合入
cd096d337 flutter 3.47.3 ⛔ 不跟,.fvmrc / pubspec.yaml 保持 3.41.9
b8eeeb78c improve emote tooltip 🟡 表情 tooltip(新设置项「点击表情显示 Tooltip」,默认关)全跟;custom_tooltip.dart 的 Dart 3.12 私有具名参数改写、WidgetSpan(rawText:) 全部去掉(3.41 没有),见第二节
3e030b202 keep fav resources order on copy/cut ✅ 全跟
1a4bb7ba9 feat: search all ✅ 全跟(搜索「综合」tab 重写:用户卡/活动卡/pgc_card_v_search 删除)
827ee5d66 upgrade deps ⛔ 不跟
47e94b33b update proto 🟡 43 个 pb 文件全跟(纯 protoc 重生成,没有新增任何字段/消息);生成代码要求 protobuf 6.1.0 运行时,pubspec.lock 里 protobuf 6.0.0 → 6.1.0,见第二节
861ab3f91 opt ui ✅ 全跟
152547941 refa load previous video ✅ 全跟(RefreshIndicator_ 抽成公共组件;video/member/view.dart 整份取上游)
21a0fc069 show search trending showName instead ✅ 全跟(热搜列表显示 show_name,跳转仍用 keyword)
7f1792f64 show search esports ✅ 全跟
04fe7be29 only inner scroll if is locating video 🟡 isLocating/setIsLocating 骨架全跟;onlyInnerScroll 在鸿蒙上是空操作(依赖 extended_nested_scroll_view fork 的 dev 分支),见第二节
2ddf574aa fix bggRGjQaUbCoE#2956 ✅ 全跟
2b9fc8bf1 fix bggRGjQaUbCoE#2950 ✅ 全跟
7c717237e fix bggRGjQaUbCoE#2949 ✅ 全跟
51a041a5b opt search esports ✅ 全跟
84a3b5ff2 upgrade dep ⛔ 不跟(extended_nested_scroll_view 升到 dev,见第二节)
d07da9861 flutter 3.47.4 ⛔ 不跟
ce17223a8 Release 2.1.4 🟡 不跟上游 2.1.4+1;鸿蒙侧发 2.1.4-ohos(build_env.dart + pubspec.yaml)

逐 hunk 落地核验(上游本轮新增的 lib/**.dart 行去空白后在最终工作区找):2858 行中缺 258 行,全部属于下列有意不跟的项——dyn_tab_bar.dart 整文件(169)、bindings.g.dart 的 JNI 绑定(56)、android_helper.dart 的 JNI 实现(17)、视频/直播顶栏的 Padding 外壳与 AndroidHelper.isPipAvailable(5)、custom_tooltip.dart 的私有具名参数(3)、DynTabBar/platformAlwaysClampingPhysics show 子句(3)、ctr.current(3,鸿蒙 fork 无此 API)、.emote 简写(1,鸿蒙保留 ImageType.emote)、热搜 parameters: {'keyword': item.keyword} 折成一行(1,语义已落地)。


二、取舍说明

47e94b33b update proto —— pb 全跟,protobuf 运行时升到 6.1.0

上游用新版 protoc_plugin 重生成了全部 pb 文件:create() 打上 @Deprecated,createEmptyInstance / subBuilder / $_defaultFor 全部改成传 X.$_createMessage(返回 GeneratedMessage)。这套签名 protobuf 6.0.0 不认($_defaultFor<T> 要 T Function(),$_createMessage 也不存在),dart analyze 看不出来——lib/grpc/bilibili/** 在 analysis_options.yaml 里是排除的——是 flutter test 编译时炸出 60+ 个 Error 才暴露。

两条路:回退 43 个 pb 文件到鸿蒙版(这轮重生成零新增字段/消息,回退不丢功能),或把 protobuf 升到上游锁的 6.1.0。选了后者:pb 文件与上游逐字节一致,下一轮上游再动 proto 时不会在两万行生成代码里撞冲突;protobuf 是纯 Dart 的 hosted 包,与鸿蒙无关。pubspec.lock 因此有且只有 protobuf 这一项变化(flutter pub upgrade protobuf),pubspec.yaml 的 protobuf: ^6.0.0 两边本来就一样。

这是 pubspec.lock 第一次在跟进中动,以后不变量脚本改成「lock 的 diff 只允许落在 protobuf 条目」。

b8eeeb78c improve emote tooltip —— 全跟,去 rawText,改私有具名参数

  • CustomTooltip 重写(TriggerMode_ 枚举、jumpUrl 点击跳转、指示三角可倒置、命中测试改成子树命中才转发点击、否则关闭)整份取上游,只把 _RenderToolTip 的 this._onDismiss / required this._target / …(Dart 3.12 私有具名参数)展开成普通形参 + 初始化列表。
  • 上游给 WidgetSpan 传了 rawText:(3.4x SDK 新增,用于文本选择/复制时取回原文),3.41 的 WidgetSpan 没有这个参数,opus_content.dart、whisper_detail/widget/chat_item.dart、rich_node_panel.dart 三处全部去掉。之前几轮鸿蒙侧就是这么处理的(HEAD 上这三个文件本来就没有 rawText)。
  • rich_node_panel.dart 保留鸿蒙版骨架(表情 case 在「投票」之后、TextStyle(height: 1.65) 挂在每个文本 span 上而不是外层、ImageType.emote 全称),只把表情 case 按上游包一层 emoteTooltipBuilder(floor == 1 && isDetail && !isSave 才包)。新增的三个形参 floor / isDetail / isSave 与调用方 content_panel.dart 都是自动合并进来的。
  • reply_item_grpc.dart 只动 import:加 emote_tooltip / string_ext,去掉不再用的 image_type;上游的 selectable_region_ext import 不要(鸿蒙没有这个文件)。
  • live_emote/view.dart、emote/view.dart 无冲突自动合并,原来手写的 CustomTooltip 换成 emoteTooltipBuilder(enable: true, …)。

9c9076a4c refa dyn reaction —— 新页面全跟,DynTabBar 不跟

DynTabBar extends TabBar 覆写了 TabBarState.applyFillAlignment / buildTabLabelBar / buildIndicator,这些钩子和 TabBarState / IndicatorPainter / TabBarLayoutCallback 等 typedef 全是上游 lib/scripts/material/tabs.patch 打进 Flutter SDK material/tabs.dart 里的;作用只是把最后一个 tab(「赞」)推到最右边。鸿蒙 SDK 不打这个补丁,vendored 的 flutter/page/tabs.dart 也只复制了 TabBarView,要跟得再 vendor 一份 1500 行的 TabBar。为一个对齐效果不值,处置:

  • 删除 lib/common/widgets/flutter/dyn_tab_bar.dart;
  • dynamics_detail/view.dart 的 _buildTabBar 用回 TabBar(isScrollable: true, …),三个 tab 改由 DynType.values 生成(转发 / 评论 / 赞,initialIndex 落在评论);
  • _buildTabBody 仍走鸿蒙的 tabBarView(controller:, children:) 助手(scroll_physics.dart),children 换成上游的三页;
  • 刷新圈改用上游抽出来的公共 RefreshIndicator_(common/widgets/refresh_indicator.dart),鸿蒙这边原先自己维护的 refreshController / _startRefresh 那套一并删掉——RefreshIndicator_ 用到的 CircularProgressIndicator.defaultAnimationDuration 与 controller: 3.41 都有。
  • HarmonyChannel.setShellBarsHidden 包住转发弹层、ReloadScrollPhysics(controller:) 不带 parent:、不引 NoOverscrollIndicator——这些鸿蒙差异原封不动。

04fe7be29 / 84a3b5ff2 —— extended_nested_scroll_view 不升,onlyInnerScroll 空操作

上游把 extended_nested_scroll_view fork 从 161cd202 升到 dev(d9136d5),新版本加了 ExtendedNestedScrollViewState.onlyInnerScroll(定位视频时只滚内层列表),但中间的4b49976 drop visibility_detector 把 ExtendedVisibilityDetector 从包里删了,de88c22/7cd9461 又把 RefreshScrollPhysics 改成 RefreshScrollPhysicsMixin(onDrag 签名变了)。鸿蒙侧还有 6 处 ExtendedVisibilityDetector 和自己 vendored 的 flutter/refresh_indicator.dart
(import 'package:extended_nested_scroll_view/…' show RefreshScrollPhysics)依赖旧版本,升 fork 等于连带重做这两块。这轮不动:

  • pubspec.yaml 仍锁 161cd202;
  • member_video/controller.dart 的 set onlyInnerScroll(bool) 改成空实现(注释写明缘由),setIsLocating(value, isOnlyInnerScroll:) 这层 API 与调用方 member_video/view.dart 照上游保留,日后升 fork 时把实现填回 scrollKey.currentState?.onlyInnerScroll = value 即可;顺手删掉因此不再用的 member/controller.dart import。

行为差异:从视频页 UP 主视频列表「定位到当前视频」时,鸿蒙上外层 NestedScrollView仍可能跟着滚,与 2.1.3.1 相同。

d7fb17b91 opt: mpv args & native event loop —— 逻辑跟,依赖不跟

上游把 media_kit 全家换到 My-Responsitories/media-kit@native,鸿蒙锁的 feat-ohos fork(762fdc63)不动。mpv_convert_webp.dart 的三处 mpv 层改动都是标准 libmpv API,与 fork 无关,全跟:options 加 'idle': 'once'(转完第一个文件自动退出)、mpv_request_event(VIDEO_RECONFIG, 0) 关掉无用事件、完成判定只认 MPV_EVENT_SHUTDOWN(原来 END_FILE || SHUTDOWN)。
鸿蒙 fork 的 bindings 里 mpv_event_id 是 abstract class + int 常量,mpv_request_event(ctx, int, int) 直接可用。MediaKitAdapt.createInitializer / setPlayerHeader、Int8 指针转换等鸿蒙适配保留。

8795d0628 opt ui —— 顶栏外壳保留鸿蒙 AppBar

上游把视频与直播的全屏顶栏从 AppBar 换成 Padding(vertical: 12/13) + Column/Row。鸿蒙侧上一轮(2.1.3.1)为挖孔避让专门保留了 AppBar(toolbarHeight: isFullScreen ? 34 : null / showFSActionItem ? 112 : null、primary: false),这次两处冲突都取鸿蒙版,Column 内部的按钮改动(kDebugMode || enableSponsorBlock、.end/.start 简写、按钮尺寸常量)跟上游。header_control.dart 其余 200 多行 opt ui 改动无冲突自动合并;OS.isHarmony 画中画分支、Floating().isPipAvailable + PiPStatus.unavailable 提示、file_picker_ohos 全部在。

879679fc6 / d7c6263c8 seek position —— 全跟,refreshPlayer 保留鸿蒙实现

PlPlayerController 新增 seekPosition / progress / onSeekStart,view.dart、bottom_control.dart、audio/view.dart 无冲突合入。refreshPlayer() 冲突:上游用 ctr.current.last.copyWith(start:)重开(鸿蒙 media_kit fork 没有 Player.current),鸿蒙这边是自己按 dataSource 重设 audio-files 再 open 的版本(9599c0db8 链路切换那轮写的),保留;只把上游这次的语义补上——直播不带 start(start: isLive ? null : Duration(milliseconds: positionInMilliseconds))。
上游同时加的 assert(!isLive || seekTo == null) 自动合进了 _createVideoController,鸿蒙侧唯一的 seekTo: 传参在 setDataSource 里且来自调用方,与上游一致。截图那段保留鸿蒙版(fork 的 screenshot() 返回 Uint8List?,上游是 ui.Image)。

1f1ac0fbe fix #2909 —— Android App Links

上游在 Android 12+ 上先查 isDomainVerified 再决定走系统还是浏览器。鸿蒙替身 PiliAndroidHelper.openUrl(url, {domain}) 直接 PageUtils.launchURL(url),行为与之前一致;bindings.g.dart 存根类补两个静态方法保持 API 形态。android_helper.dart 头部的 jni import 等全不要。

其余固定项

文件 处置
.fvmrc、pubspec.yaml(依赖部分)、lib/scripts/material/scaffold.patch、tabs.patch 鸿蒙版 / 保持删除
pubspec.lock 鸿蒙版 + protobuf 6.1.0(见上)
geetest_webview_dialog.dart 鸿蒙版(ScaledWidgetsFlutterBinding 归一、useHybridComposition: false、铺满 html),只跟 substring1 和 string_ext import;desktop_webview_window import 不要
live_room/widgets/header_control.dart 鸿蒙版(上游只改了 Padding 的数值,鸿蒙没有那个 Padding)
search_trending/view.dart 鸿蒙版骨架(Scaffold + AppBar、switch 表达式),只跟 item.keyword 去 ! 与 item.showName
video_card_h.dart 鸿蒙的 _CoverBuilderH(布局缓存,8e88d70d2)保留,上游抽出的顶层 pushVideoH()、类级 onLongPress、直播卡不显示播放/弹幕数全跟
video/member/view.dart 整份取上游(鸿蒙版只是把 theme 一路当形参传,没有实质分歧;上游改成 Stack + NotificationListener + RefreshIndicator_ 加载更早的视频)
post_panel/view.dart 只合 import;上游底部弹层编辑器无冲突落地,鸿蒙的 ExtendedNestedScrollController 判断 + Stack FAB 保留
extra_settings.dart 鸿蒙的 flutter/refresh_indicator.dart 全量 import(vendored 版没有 refreshDragExtent),加 emote_tooltip import;新设置项自动合入
fav_detail/view.dart、common_dyn_page.dart、video/member/controller.dart 上游

三、冲突处置

git merge 报 26 个文件冲突(上一轮 26 个)。分布:

类别 文件 处置
上游改、鸿蒙已删(modify/delete) lib/scripts/material/scaffold.patch、tabs.patch 保持删除(git rm)
固定取鸿蒙侧 .fvmrc、pubspec.yaml、pubspec.lock、lib/utils/android/bindings.g.dart、lib/utils/android/android_helper.dart --ours(+ 存根)
整份取上游 lib/pages/video/member/view.dart --theirs
上游 hunk + 3.41 改写 custom_tooltip.dart(私有具名参数)、opus_content.dart/chat_item.dart(去 rawText) 见第二节
鸿蒙骨架 + 上游语义 dynamics_detail/view.dart、rich_node_panel.dart、search_trending/view.dart、video_card_h.dart、pl_player/controller.dart、mpv_convert_webp.dart、video/widgets/header_control.dart 见第二节
只合 import post_panel/view.dart、reply_item_grpc.dart、extra_settings.dart、fav_detail/view.dart、geetest_webview_dialog.dart 取并集,去掉鸿蒙没有的
其余 common_dyn_page.dart、video/member/controller.dart(上游)、live_room/widgets/header_control.dart(鸿蒙) —

「无冲突 ≠ 无问题」的三处(git 自动合并成功但需要人工收尾):

  1. lib/common/widgets/flutter/dyn_tab_bar.dart 是新增文件,直接落盘,但依赖打了补丁的 SDK TabBarState,3.41 上编译不过 → 删除,页面改回 TabBar;
  2. lib/pages/member_video/controller.dart 自动合进了 state.onlyInnerScroll = value,鸿蒙锁的 extended_nested_scroll_view 没有这个 setter(dart analyze 唯一的 error)→ 空实现;
  3. 43 个 *.pb.dart 自动合并,dart analyze 因排除规则看不见,flutter test 编译时报 60+ 个 Error($_createMessage 不存在 / GeneratedMessage Function() 不能赋给 T Function())→ protobuf 升 6.1.0。

四、下一轮注意

  • WidgetSpan(rawText:) 是新的固定改写点:3.41 的 WidgetSpan 没有这个参数,上游每次加都要去掉(opus_content / chat_item / rich_node_panel / 以后可能更多)。不变量脚本盯着。
  • extended_nested_scroll_view 锁 161cd202 是新的长期分歧点:上游 dev 去掉了 ExtendedVisibilityDetector(鸿蒙 6 处在用)、改了 RefreshScrollPhysics(鸿蒙 vendored flutter/refresh_indicator.dart 在用)。要升就得一起做:把 ExtendedVisibilityDetector vendor 进仓库、refresh_indicator.dart 跟到上游版本(带 refreshDragExtent)、member_video/controller.dart 的 onlyInnerScroll 填回实现。
  • DynTabBar / 打补丁的 TabBar:上游 tabs.patch 现在不只是 TabBarView,还开了 TabBarState 的钩子。若上游继续往 DynTabBar 上堆功能,考虑把 SDK 的 TabBar 整份 vendor 到 flutter/page/tabs.dart 旁边并套上游补丁,现在只是删了文件。
  • pubspec.lock 不再是「固定取 ours」:protobuf 这类纯 Dart hosted 包跟上游锁的版本走,OHOS fork(media_kit / inappwebview / file_picker_ohos / device_info_plus …)仍固定 ours。47e94b33b 这种重生成 pb 的提交要看 flutter test 的编译输出,dart analyze 看不见。
  • refreshPlayer() / screenshot():鸿蒙 media_kit fork 没有 Player.current,screenshot 返回 Uint8List?,这两段每轮都会冲突,固定以鸿蒙版为基底再补上游语义。
  • 视频/直播全屏顶栏的 AppBar 外壳、rich_node_panel.dart 的骨架、search_trending/view.dart 的 Scaffold 骨架、video_card_h.dart 的 _CoverBuilderH、dynamics_detail/view.dart 的 tabBarView 助手 + HarmonyChannel.setShellBarsHidden——老分歧点,每轮冲突。
  • custom_tooltip.dart 的 _RenderToolTip 构造器是 Dart 3.12 私有具名参数的改写点,RenderTriangle 上一轮已改过;上游再动构造器就要重做。
  • lib/utils/android/bindings.g.dart 存根本轮补了 isDomainVerified / openUrl,仍固定 --ours。

My-Responsitories and others added 30 commits September 7, 2026 11:07
* opt: mpv args & native event loop

* fix: mock ReceivePort listen event
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
* opt: closure

* twk

* opt: latex

* twk

* twk
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Closes bggRGjQaUbCoE#2899

Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Closes bggRGjQaUbCoE#2918

Signed-off-by: dom <githubaccount56556@proton.me>
Related bggRGjQaUbCoE#2850

Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
bggRGjQaUbCoE and others added 4 commits September 13, 2026 14:01
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
@wm-develop
wm-develop merged commit 3389b43 into dev4harmony:ohos Sep 15, 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

4 participants