用途:在 Flutter 的 Widget Previewer(flutter widget-preview)中隔离渲染单个 Widget,让代理无头截图、人工可选在本地 Chrome 打开同一 localhost 地址同步查看,从而迭代设计、明暗主题与平板尺寸,无需启动完整应用。
适用条件(三者须同时满足):项目为 Flutter 项目(cwd 有 pubspec.yaml、存在 lib/);PATH 上有 Flutter ≥ 3.35(或经 fvm flutter);用户只想迭代单个 Widget,而非整屏或端到端流程。
主要能力与脚本:check_preview_support.sh 校验 Flutter 版本并打印解析到的二进制与版本;start_preview.sh 后台启动 flutter widget-preview start、解析日志中的 URL 并写状态文件,幂等,--stop 关闭;screenshot_preview.sh 用无头 Chrome 截图,支持 --out、--size(默认 1600x2400)、--wait(默认 10000)、--url;list_previews.sh 在 lib/ 中查找已有 @Preview、@<Custom>Preview 与 MultiPreview 定义。四个脚本均带 --help。
使用方式:每个项目需一次性创建顶层 Widget previewWrapper(Widget child) 包装函数,复现真实祖先链(主题 cubit、ProviderScope、MaterialApp、本地化、MediaQuery 等),可从 assets/preview_wrapper.dart.template 复制并补全 provider。随后用 @Preview(name: ..., wrapper: previewWrapper) 标注顶层函数、类的公开静态方法或无必填参数的公开构造函数;注解值须为 const,回调须为公开顶层或静态函数。启动服务后截图、编辑 Dart、等待约 2 秒再截图,预览器会自动热重启。每轮涉及预览器的回复末尾应打印 Preview: http://localhost:<port>,结束时可用 --stop 清理。
限制:flutter widget-preview 为实验性,API 与 CLI 标志可能随版本变化;预览器运行在 Chrome 中,不支持 dart:io、dart:ffi 或原生插件;资源路径须写成 packages/<name>/...;size 约束的是 Widget 而非画布;截图仅能整页捕获,无单预览 URL;首次绘制较慢(5–10 秒,必要时提高 --wait);一个服务仅对应一个项目;缺少 wrapper 时读取 provider/cubit 的 Widget 会抛 ProviderNotFoundException。其余细节暂未提供。