video_player_avfoundation 贡献指南:Pigeon 代码生成文件的更新流程与实战解析
移动开发跨平台【免费下载链接】pluginsPlugins for Flutter maintained by the Flutter team项目地址https://gitcode.com/gh_mirrors/pl/plugins点击查看免费下载本指南围绕 Flutter 官方插件仓库中video_player_avfoundationvideo_player的 iOS 实现包的贡献说明文档展开核心讲解在修改pigeons/目录后如何正确重新生成 Dart 与 Objective-C 桥接代码、如何用仓库脚本统一格式化以及如何通过dependency_overrides联调 Pigeon 本体更新。读完本文你将掌握该插件的代码生成工具链、底层调用关系与可复现的提交前检查步骤。一、背景为什么video_player_avfoundation需要重新生成代码video_player_avfoundation是video_player插件的 iOS 实现属于 endorsed联邦插件机制 中的平台实现包应用只需正常依赖video_player该包会被自动引入。其 Dart 侧入口 video_player_avfoundation.dart 仅导出一个文件 avfoundation_video_player.dart其中AVFoundationVideoPlayer实现了VideoPlayerPlatform接口通过 Pigeon 生成的AVFoundationVideoPlayerApi与原生侧通信。关键点在于Dart 与 Objective-C 两侧的桥接代码不是手写的而是由 Pigeon 从统一接口定义自动生成。因此只要改动接口定义pigeons/messages.dart就必须重新生成否则会直接破坏 Dart 侧调用与 iOS 原生侧实现之间的契约。这正是 CONTRIBUTING.md 存在的意义。二、更新 Pigeon 生成文件的标准命令流程修改pigeons/目录下的文件后在packages/video_player/video_player_avfoundation/目录中依次执行flutter pub upgrade flutter pub run pigeon --input pigeons/messages.dart # git commit your changes so that your working environment is clean (cd ../../../; ./script/tool_runner.sh format --clang-formatclang-format-7)各步骤的作用flutter pub upgrade将依赖含pigeon升级到 pubspec 约束范围内的最新兼容版本确保生成器版本与 pubspec.yaml 中dev_dependencies: pigeon: ^2.0.1一致。flutter pub run pigeon --input pigeons/messages.dart以pigeons/messages.dart为唯一输入源执行 Pigeon 生成。注意生成产物输出路径、Objective-C 前缀、版权头等并非来自命令行参数而是由该文件顶部的ConfigurePigeon(PigeonOptions(...))注解自动获取详见第三节。git commit先提交本次改动注释明确要求先让工作区干净因为下一步格式化工具只对已提交内容做统一格式化与校验。./script/tool_runner.sh format --clang-formatclang-format-7在仓库根目录运行 Flutter 官方插件工具集。从 tool_runner.sh 源码可见它实际执行dart pub global run flutter_plugin_tools对本分支涉及的包--packages-for-branch做格式化。--clang-formatclang-format-7明确指定 Objective-C 侧使用 clang-format 第 7 版风格确保生成出的.m/.h文件符合仓库统一格式要求。三、配置从哪来pigeons/messages.dart顶部的ConfigurePigeon文档强调配置会自动从pigeons/messages.dart获取见文件顶部的ConfigurePigeon。对照 pigeons/messages.dart 顶部ConfigurePigeon(PigeonOptions( dartOut: lib/src/messages.g.dart, dartTestOut: test/test_api.g.dart, objcHeaderOut: ios/Classes/messages.g.h, objcSourceOut: ios/Classes/messages.g.m, objcOptions: ObjcOptions( prefix: FLT, ), copyrightHeader: pigeons/copyright.txt, ))该注解指定了四处生成产物的落盘位置产物路径说明Dart 桥接代码lib/src/messages.g.dart供AVFoundationVideoPlayer直接 import 使用Dart 测试桩test/test_api.g.dart生成TestHostVideoPlayerApi宿主测试接口Objective-C 头文件ios/Classes/messages.g.h供FLTVideoPlayerPlugin使用Objective-C 源文件ios/Classes/messages.g.m桥接实现其中prefix: FLT决定了原生侧类的前缀如FLTVideoPlayerPlugin、FLTFrameUpdatercopyrightHeader指向 pigeons/copyright.txt其内容为标准的 Flutter BSD 版权声明。生成的 messages.g.dart 开头也标注了Autogenerated from Pigeon (v2.0.1), do not edit directly并携带一组ignore_for_file注释明确告知任何手改生成文件的行为都是不被允许的。四、接口定义与底层实现一个方法如何走完全链路messages.dart中定义的消息类与HostApi接口共同构成 Dart↔iOS 的完整方法集。以播放接口为例接口定义HostApi(dartHostTestHandler: TestHostVideoPlayerApi) abstract class AVFoundationVideoPlayerApi { ObjCSelector(play:) void play(TextureMessage msg); ... }生成后Dart 侧 avfoundation_video_player.dart 的play(int textureId)会构造TextureMessage并调用_api.play(...)Objective-C 侧 FLTVideoPlayerPlugin.m 中的FLTVideoPlayer则持有AVPlayer并通过AVPlayerItem的 KVO 观察status、duration、presentationSize、playbackBufferEmpty/Full等与AVPlayerItemDidPlayToEndTimeNotification通知把播放状态回传给 Dart 侧事件流。文档没有展开的部分恰恰是理解为什么要重新生成的关键生成文件同时存在于 Dart 与 Objective-C 两侧任何一侧的ObjCSelector、消息类字段变更都要求两侧同步更新测试也依赖生成物test/test_api.g.dart 生成的TestHostVideoPlayerApi被 avfoundation_video_player_test.dart 以_ApiLogger形式实现并记录每次调用日志用来验证AVFoundationVideoPlayer发出的消息内容如create返回 textureId 3、position返回 234ms 等断言因此改动messages.dart后若漏掉重新生成Dart 测试桩、iOS 头文件和源文件将集体失真CI 分析也会失败——这正是文档要求严格按序执行命令的根本原因。五、联调 Pigeon 本体更新dependency_overrides 的用法当需要修改Pigeon 工具本身并在本插件中验证改动时文档给出了联调方案在pubspec.yaml的dependency_overrides中临时添加路径引用。前提是已把flutter/packages仓库检出到与plugins仓库同级的目录兄弟目录例如pigeon: path: ../../../../packages/packages/pigeon/解释与注意事项路径../../../../packages/packages/pigeon/是相对plugins仓库根目录而言的先回溯到两个仓库共同的父目录再进入packages/packages/pigeon/即 flutter/packages 仓库内的 Pigeon 源码目录。若两个仓库的相对位置不同需自行调整层级。添加后重新执行第二节的命令。执行pub get/pub upgrade时Flutter 会给出正在使用 override的警告属预期行为。联调完成后必须发布新版 Pigeon因为CI 使用的是 pub.dev 上最新已发布版本的 Pigeon 运行分析而非你的本地改动或main分支版本。也就是说本地 override 只用于开发验证要让改动落地到 CI 与用户侧必须先publish pigeon之后才能合入本插件的更新。这是文档明确强调的发布顺序约束。六、提交前自检清单综合文档与仓库现状给贡献者一份可直接照做的检查清单改动是否只落在pigeons/messages.dart与手工代码上从不手改messages.g.dart/messages.g.h/messages.g.m/test_api.g.dart这些文件头部均有do not edit directly声明是否在包目录内依次执行flutter pub upgrade→flutter pub run pigeon --input pigeons/messages.dart并且改动已git commit是否在仓库根目录执行了./script/tool_runner.sh format --clang-formatclang-format-7完成 Dart 与 Objective-C 的统一格式化若涉及 Pigeon 自身修改是否已通过dependency_overrides本地验证、pub get是否给出 override 警告、以及新版 pigeon 是否已发布本地运行flutter test包目录下确认 avfoundation_video_player_test.dart 中的注册与消息断言全部通过再提交 PR。七、总结video_player_avfoundation的贡献流程本质上是一条接口定义 → 代码生成 → 统一格式化 → 测试验证 → 发布依赖的闭环Pigeon 将 pigeons/messages.dart 中的一处定义同步到 Dart 与 Objective-C 两侧的生成产物仓库脚本 tool_runner.sh 保证格式一致而dependency_overrides则让 Pigeon 本体的改动可以先行本地验证。理解这条链路不仅能为该插件提交高质量的改动也能推广到仓库内其他使用 Pigeon 的插件如webview_flutter_wkwebview、file_selector_ios等——它们遵循同一套生成与格式化约定。赞分享移动开发跨平台【免费下载链接】pluginsPlugins for Flutter maintained by the Flutter team项目地址https://gitcode.com/gh_mirrors/pl/plugins点击查看免费下载相关推荐video_player_android 插件 Pigeon 代码生成与更新流程实战指南video_player_android 插件 Pigeon 代码生成与更新流程实战指南 导读 本指南以 Flutter 官方插件仓库中 packages/vi移动开发跨平台grpc-gateway 贡献指南代码评审、生成文件再生成与发布流程全解grpc gateway 贡献指南代码评审、生成文件再生成与发布流程全解 本文围绕 grpc gateway 仓库根目录的 CONTRIBUTING.md h后端API网关开发工具gRPCFlutter Pigeon 贡献者指南源码结构、三层测试体系与 Isolate 代码生成原理Flutter Pigeon 贡献者指南源码结构、三层测试体系与 Isolate 代码生成原理 Pigeon 是 Flutter 官方包仓库pac/pack跨平台移动开发UI组件开发工具上一篇从Markdown到语音Parsedown与文本转语音集成全指南下一篇Windows Defender彻底移除一键制作专业安装程序终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

B站视频总结免费额度难对齐?TaoToken 这样配 Codex 的 config.toml

B站视频总结免费额度难对齐?TaoToken 这样配 Codex 的 config.toml

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 18:07:13 阅读更多 →
Claude Code 用 Qwen 报 400?TaoToken 这样配 Base URL

Claude Code 用 Qwen 报 400?TaoToken 这样配 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 15:55:00 阅读更多 →
OpenClaw 横向对比国产龙虾,模型 Base URL 填 TaoToken

OpenClaw 横向对比国产龙虾,模型 Base URL 填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 18:04:40 阅读更多 →

最新新闻

淘宝排名靠前技巧揭秘:3个源码级优化点,面试必问的底层逻辑

淘宝排名靠前技巧揭秘:3个源码级优化点,面试必问的底层逻辑

淘宝排名靠前技巧揭秘:3个源码级优化点,面试必问的底层逻辑 官方文档堆砌术语,读完还是不会用?这行混久了都知道,真正的硬核知识往往藏在底层实现里。今天不扯虚的,直接拆解淘宝搜索排名的核心逻辑。很多开发者在面试中被问倒,不是不懂业务,而是不懂…

2026/9/22 18:07:24 阅读更多 →
5分钟吃透Reveal源码,手写实现核心逻辑不踩坑

5分钟吃透Reveal源码,手写实现核心逻辑不踩坑

5分钟吃透Reveal源码,手写实现核心逻辑不踩坑 面试被问“Reveal.js 源码是怎么实现页面切换动画的”,你答得上来吗?别慌,很多后端转全栈的兄弟都栽在这。不是让你背代码,而是得懂那套 手写实现…

2026/9/22 18:07:24 阅读更多 →
3步手写实现quicksort,彻底告别排序崩溃焦虑

3步手写实现quicksort,彻底告别排序崩溃焦虑

3步手写实现quicksort,彻底告别排序崩溃焦虑 上周凌晨两点,线上接口突然超时,CPU飙到100%。翻日志一看,全是 java.lang.OutOfMemoryError 和递归栈溢出的 StackOverflowError…

2026/9/22 18:07:24 阅读更多 →
3招搞定爱在星光里性能瓶颈,图解原理告别StackTrace报错

3招搞定爱在星光里性能瓶颈,图解原理告别StackTrace报错

3招搞定爱在星光里性能瓶颈,图解原理告别StackTrace报错 凌晨两点,服务器报警响了,我抓起电脑一看,CPU飙到95%,日志里全是红色的StackTrace。这种报错一堆看不懂的情况,每个后端开发都经历过。别慌,今天咱们不聊虚的,直接…

2026/9/22 18:07:24 阅读更多 →
3CDAEMON乱码速查手册:从堆栈到源码的性能突围

3CDAEMON乱码速查手册:从堆栈到源码的性能突围

3CDAEMON乱码速查手册:从堆栈到源码的性能突围 面对满屏红色的 StackTrace,是不是感觉脑子瞬间宕机?尤其是当 3CDAEMON 相关的日志输出变成一堆 ? 或 �…

2026/9/22 18:07:24 阅读更多 →
CF人物模型底层逻辑拆解:版本升级API变更保姆级教程

CF人物模型底层逻辑拆解:版本升级API变更保姆级教程

CF人物模型底层逻辑拆解:版本升级API变更保姆级教程 版本升级后 API 全变了?别慌,CF人物系统的底层映射没变。 很多老哥在接手项目时,一跑代码就报错,参数对不上,对象引用丢失。 这篇保姆级教程,带你从内存堆栈角度,彻底搞懂 CF…

2026/9/22 18:06:23 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →