- 接入火山引擎豆包 Chat API 生成儿童故事(SSE 流式进度) - 新增 /api/stories 接口加载历史故事到书架 - 新增 /api/playlist 接口加载历史歌曲到唱片架 - 书架排序:预设故事在前,AI 生成在后 - AI 生成的故事显示"暂无封面"淡紫渐变占位 - 保存故事时传回真实标题+内容(不再用 mock) - 修复 Windows GBK 编码导致的中文乱码问题 - 新增 MusicGenerationService 单例管理音乐生成 - 音乐页心情卡片 UI 重做 + 歌词可读性优化 - 添加豆包 API 参考文档和故事创作 prompt Co-authored-by: Cursor <cursoragent@cursor.com>
3.7 KiB
3.7 KiB
Flutter Web 本地调试启动指南
本文档供 AI 编码助手阅读,用于在本项目中正确启动 Flutter Web 调试环境。
项目结构
- Flutter 应用目录:
airhub_app/ - 后端服务入口:
server.py(根目录,FastAPI + Uvicorn,端口 3000) - 前端端口:
8080
环境要求
- Flutter SDK(3.x)
- Python 3.x(后端服务)
- PowerShell(Windows 环境)
操作系统
Windows(所有命令均为 PowerShell 语法)
启动流程(严格按顺序执行)
1. 杀掉旧进程并确认端口空闲
# 杀掉占用 8080 和 3000 的旧进程
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue | ForEach-Object { taskkill /F /PID $_.OwningProcess 2>$null }
Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue | ForEach-Object { taskkill /F /PID $_.OwningProcess 2>$null }
# 等待端口释放
Start-Sleep -Seconds 3
# 确认端口已空闲(无输出 = 空闲)
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue
Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue
2. 启动后端服务器(音乐生成功能依赖此服务)
# 工作目录:项目根目录
cd d:\Airhub
python server.py
成功标志:
INFO: Uvicorn running on http://0.0.0.0:3000 (Press CTRL+C to quit)
[Server] Music Server running on http://localhost:3000
3. 设置国内镜像源 + 启动 Flutter Web Server
# 工作目录:airhub_app 子目录
cd d:\Airhub\airhub_app
# 设置镜像源(必须,否则网络超时)
$env:PUB_HOSTED_URL = "https://pub.flutter-io.cn"
$env:FLUTTER_STORAGE_BASE_URL = "https://storage.flutter-io.cn"
# 启动 web-server 模式
flutter run -d web-server --web-port=8080 --no-pub
成功标志:
lib\main.dart is being served at http://localhost:8080
4. 访问应用
浏览器打开:http://localhost:8080
关键规则
必须使用 web-server 模式
- 禁止使用
flutter run -d chrome(会弹出系统 Chrome 窗口,不可控) - 必须使用
flutter run -d web-server(只启动 HTTP 服务,手动用浏览器访问)
--no-pub 的使用条件
- 仅修改 Dart 代码(无新依赖、无新 asset)→ 加
--no-pub,编译更快 - 新增了
pubspec.yaml依赖或assets/资源文件 → 不能加--no-pub
端口管理
- 固定使用 8080(Flutter)和 3000(后端),不要换端口绕过占用
- 每次启动前必须先确认端口空闲
- 停止服务后等 3 秒再重新启动
热重载
- 在 Flutter 终端按
r= 热重载(保留页面状态) - 按
R= 热重启(重置页面状态) - 浏览器
Ctrl+Shift+R= 强制刷新
停止服务
# 方法1:在 Flutter 终端按 q 退出
# 方法2:强制杀进程
Get-NetTCPConnection -LocalPort 8080 | ForEach-Object { taskkill /F /PID $_.OwningProcess }
Get-NetTCPConnection -LocalPort 3000 | ForEach-Object { taskkill /F /PID $_.OwningProcess }
常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 端口被占用 | 旧进程未退出 | 执行第1步杀进程,等3秒 |
| 编译报错找不到包 | 使用了 --no-pub 但有新依赖 |
去掉 --no-pub 重新编译 |
| 网络超时 | 未设置镜像源 | 设置 PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL |
| 页面白屏 | 缓存问题 | 浏览器 Ctrl+Shift+R 强刷 |
| 音乐功能不工作 | 后端未启动 | 先启动 python server.py |
编译耗时参考
- 首次完整编译(含 pub get):90-120 秒
- 增量编译(
--no-pub):60-90 秒 - 热重载(按 r):3-5 秒
- 热重启(按 R):10-20 秒