Repository navigation
Feat/sync upstream 2.1.4 - #177
Merged
wm-develop merged 34 commits intoSep 15, 2026
Merged
Conversation
* 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>
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>
Signed-off-by: dom <githubaccount56556@proton.me>
Signed-off-by: dom <githubaccount56556@proton.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
跟进上游 2.1.4(
ce17223a8)一、逐提交处置
d7fb17b91mpv_convert_webp.dart的idle=once/mpv_request_event/ 只认SHUTDOWN全跟;pubspec 里 media_kit 换到My-Responsitories/media-kit@native不跟(鸿蒙锁feat-ohosfork),见第二节5aa7b02e3PageOrderMixin)879679fc6seekPosition/progress/onSeekStart,播放器与听视频页进度条拖动时显示目标位置)78d266ae7linux/,鸿蒙不构建)444898e4ftcp/live.dart/LaTeX 转换器/wbi_sign等零散调整,无冲突)9c9076a4clike_list/repost_list/新页面、grpc/dyn.dart新接口全跟;DynTabBar不跟(依赖上游tabs.patch打开 SDK 私有类),动态详情页仍用普通TabBar(isScrollable: true),见第二节d7c6263c89730d29a85b1e909d668fb0e396lib/scripts/material/scaffold.patch保持删除;pubspec.lock见47e94b33b74203a89f7a86daba832538c4d7ExtendedVisibilityDetector+StackFAB 骨架保留)8795d0628switch_item.dart、直播/视频顶栏按钮、kDebugMode || enableSponsorBlock全跟;视频/直播全屏顶栏保留鸿蒙的AppBar外壳(上游改成Padding),见第二节1f1ac0fbePiliAndroidHelper.openUrl全跟;鸿蒙替身实现直接PageUtils.launchURL,bindings.g.dart存根补isDomainVerified/openUrl;AndroidHelper.java原样合入cd096d337.fvmrc/pubspec.yaml保持 3.41.9b8eeeb78ccustom_tooltip.dart的 Dart 3.12 私有具名参数改写、WidgetSpan(rawText:)全部去掉(3.41 没有),见第二节3e030b2021a4bb7ba9pgc_card_v_search删除)827ee5d6647e94b33bprotobuf 6.1.0运行时,pubspec.lock里 protobuf6.0.0 → 6.1.0,见第二节861ab3f91152547941RefreshIndicator_抽成公共组件;video/member/view.dart整份取上游)21a0fc069show_name,跳转仍用keyword)7f1792f6404fe7be29isLocating/setIsLocating骨架全跟;onlyInnerScroll在鸿蒙上是空操作(依赖extended_nested_scroll_viewfork 的 dev 分支),见第二节2ddf574aa2b9fc8bf17c717237e51a041a5b84a3b5ff2extended_nested_scroll_view升到 dev,见第二节)d07da9861ce17223a82.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/platformAlwaysClampingPhysicsshow 子句(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_extimport 不要(鸿蒙没有这个文件)。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 SDKmaterial/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_viewfork 从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.dartimport。行为差异:从视频页 UP 主视频列表「定位到当前视频」时,鸿蒙上外层
NestedScrollView仍可能跟着滚,与 2.1.3.1 相同。d7fb17b91 opt: mpv args & native event loop—— 逻辑跟,依赖不跟上游把 media_kit 全家换到
My-Responsitories/media-kit@native,鸿蒙锁的feat-ohosfork(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/d7c6263c8seek 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头部的jniimport 等全不要。其余固定项
.fvmrc、pubspec.yaml(依赖部分)、lib/scripts/material/scaffold.patch、tabs.patchpubspec.lockgeetest_webview_dialog.dartScaledWidgetsFlutterBinding归一、useHybridComposition: false、铺满 html),只跟substring1和string_extimport;desktop_webview_windowimport 不要live_room/widgets/header_control.dartPadding的数值,鸿蒙没有那个Padding)search_trending/view.dartScaffold+AppBar、switch 表达式),只跟item.keyword去!与item.showNamevideo_card_h.dart_CoverBuilderH(布局缓存,8e88d70d2)保留,上游抽出的顶层pushVideoH()、类级onLongPress、直播卡不显示播放/弹幕数全跟video/member/view.darttheme一路当形参传,没有实质分歧;上游改成Stack+NotificationListener+RefreshIndicator_加载更早的视频)post_panel/view.dartExtendedNestedScrollController判断 +StackFAB 保留extra_settings.dartflutter/refresh_indicator.dart全量 import(vendored 版没有refreshDragExtent),加emote_tooltipimport;新设置项自动合入fav_detail/view.dart、common_dyn_page.dart、video/member/controller.dart三、冲突处置
git merge报 26 个文件冲突(上一轮 26 个)。分布:modify/delete)lib/scripts/material/scaffold.patch、tabs.patchgit 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--theirscustom_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.dartpost_panel/view.dart、reply_item_grpc.dart、extra_settings.dart、fav_detail/view.dart、geetest_webview_dialog.dartcommon_dyn_page.dart、video/member/controller.dart(上游)、live_room/widgets/header_control.dart(鸿蒙)「无冲突 ≠ 无问题」的三处(git 自动合并成功但需要人工收尾):
lib/common/widgets/flutter/dyn_tab_bar.dart是新增文件,直接落盘,但依赖打了补丁的 SDKTabBarState,3.41 上编译不过 → 删除,页面改回TabBar;lib/pages/member_video/controller.dart自动合进了state.onlyInnerScroll = value,鸿蒙锁的extended_nested_scroll_view没有这个 setter(dart analyze唯一的 error)→ 空实现;*.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(鸿蒙 vendoredflutter/refresh_indicator.dart在用)。要升就得一起做:把ExtendedVisibilityDetectorvendor 进仓库、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。