这份文档只描述 BuSic 当前推荐的开发顺序。它不是 Flutter 通用教程,而是帮助你在本项目里少走弯路。
默认阅读顺序:
- ../00-start-here/agent-quickstart.md
- ../10-project/project-overview.md
- ../10-project/project-specific-rules.md
- ../30-reference/source-of-truth.md
如果改的是特化系统,再补读对应专题:
- B 站接口、Cookie、WBI、评论、收藏夹: ../10-project/bilibili-integration.md
- 字幕、歌词、缓存、重试: ../10-project/subtitle-and-lyrics.md
- 分享、备份、跨设备导入: ../10-project/share-and-backup.md
- 更新系统、Manifest、发布资产: ../10-project/update-system.md
- 桌面端、托盘、极简模式、壳层差异: ../10-project/ui-and-platform-quirks.md
满足以下条件时,通常不需要先写规划文档:
- 单个 feature 内的小改动
- 不涉及数据库迁移
- 不涉及多系统联动
- 不改变分享、更新、字幕、桌面生命周期等关键约束
满足以下任一条件时,先在 ../40-feature-plans/ 新建规划文档:
- 涉及多个 feature 联动
- 涉及数据库结构、导入导出协议、更新协议
- 涉及播放器主链路
- 需要分阶段落地
- 当前知识还不能直接沉淀成稳定文档
规划文档模板见 ../40-feature-plans/TEMPLATE.md。
不要从旧文档倒推实现。先确认 source of truth:
- 启动与依赖注入:
lib/main.dart - App 壳层与更新检查:
lib/app.dart - 路由:
lib/core/router/app_router.dart - 数据库与迁移:
lib/core/database/app_database.dart - B 站 HTTP 行为:
lib/core/api/bili_dio.dart - 播放器行为:
lib/features/player/application/player_notifier.dart - 下载回写:
lib/features/download/data/download_repository_impl.dart - 分享 / 备份协议:
lib/features/share/data/share_repository_impl.dart - 完整备份导入:
lib/features/share/data/sync_repository_impl.dart - 字幕链路:
lib/features/subtitle/data/subtitle_repository_impl.dart - 桌面壳层:
lib/shared/widgets/responsive_scaffold.dart
如果改动涉及数据结构、远端协议或缓存契约,先处理这些内容:
- Drift 表结构与迁移
- Repository 接口与实现
- JSON 模型 / Freezed 模型
- 分享或备份协议
- 更新 Manifest 或下载资产命名
常见约束:
- 歌曲唯一身份是
bvid + cid Songs.id只是本地主键,不能拿来做跨设备标识- 下载成功后必须回写
songs.localPath和songs.audioQuality - 分享 / 备份故意不带本地文件路径
versions-manifest.json与应用内更新逻辑必须保持一致
在 application/ 层整理状态和联动:
- UI 只通过 Provider 访问业务层
- 业务编排放在 Notifier
- 后台持续行为优先用
keepAlive - 跨 feature 联动优先用信号 Provider 或明确的依赖注入
当数据和编排已经稳定,再处理:
- Screen / Widget
ResponsiveScaffold适配app_router.dart路由接入- 极简模式、桌面端标题栏、托盘行为
至少检查:
lib/core/database/tables/lib/core/database/app_database.dart- 对应 Repository 映射逻辑
- 是否需要更新文档中的 schema / 迁移说明
必做动作:
- 更新 Table
- 更新
AppDatabase - 递增
schemaVersion - 写
onUpgrade - 运行
build_runner
至少检查:
lib/core/api/bili_dio.dart- 对应 feature 的 repository
- 登录态、Cookie 注入、Referer / UA
- 是否影响评论、收藏夹、字幕、播放解析
不要假设标准 CookieJar 方案可替换当前实现。SESSDATA 含逗号是已知坑点。
至少检查:
download_repository_impl.dartplayer_notifier.dartsongs.localPathsongs.audioQuality
不要只改下载任务表而忘记 songs 表的反向回写。
至少检查:
share_repository_impl.dartsync_repository_impl.dart- 歌曲去重逻辑是否仍以
bvid + cid为准 - 是否误把本地路径、下载任务、设备相关状态带入导出数据
至少检查:
subtitle_repository_impl.dart- DB 缓存表
- AI 字幕 URL 前缀校验
- 重试次数与失败回退
- 播放器时间轴同步
至少检查:
versions-manifest.jsonlib/features/app_update/data/update_repository_impl.dart.github/workflows/release.yml- release-workflow.md
如果改了 Release 资产名但没同步应用内匹配逻辑,更新功能会直接坏。
至少检查:
responsive_scaffold.dartwindow_service.darttray_service.dartminimal_screen.dart
桌面端关闭窗口默认不是退出,而是隐藏到托盘。极简模式也不是普通页面皮肤,而是独立生命周期策略。
改了以下内容后必须重新生成:
@riverpod@freezed- Drift 表 / 数据库
dart run build_runner build
flutter gen-l10n如果执行者是运行在沙箱中的 agent,请预期 flutter ...、dart run ... 和远程/写入型 Git 往往需要提权到沙箱外;本地只读 Git(如 git status、git log、git diff)通常可先在沙箱内尝试。统一分类见 ../00-start-here/agent-quickstart.md。
flutter analyze
flutter test完整的测试目录、模式、覆盖现状和补测优先级见:
如改动涉及具体平台,再补最小手动运行:
flutter run -d windows
flutter run -d <device_id>- 登录态是否正常
- 播放器是否能恢复、切歌、后台继续播放
- 下载完成后是否离线优先
- 分享 / 备份导入后歌单是否可重建
- 字幕是否命中正确内容而不是错配 AI 字幕
- 桌面端关闭窗口是否仍是托盘行为
优先更新当前主线 docs,不要把新知识继续埋进归档文档。
- 启动、路由、平台壳层:更新
10-project/project-overview.md或10-project/ui-and-platform-quirks.md - B 站协议:更新
10-project/bilibili-integration.md - 字幕 / 歌词:更新
10-project/subtitle-and-lyrics.md - 分享 / 备份:更新
10-project/share-and-backup.md - 更新系统:更新
10-project/update-system.md和20-workflows/release-workflow.md - 测试目录、测试策略、CI 验证要求:更新
20-workflows/testing-guide.md - 文档结构自身:更新
../README.md和../00-start-here/docs-maintenance.md
- 新开发者入口: ../00-start-here/newcomer-path.md
- 构建: build-guide.md
- 调试: debug-guide.md
- 测试维护: testing-guide.md
- 发布: release-workflow.md
- 架构速查: ../30-reference/architecture.md