Zhou Weidong 0cb57d084d merge: 将 develop 合入 release/v1.0.0
# Conflicts:
#	lib/core/config/app_config.dart
#	lib/main.dart
#	test/config/server_endpoint_test.dart
2026-10-20 20:36:43 +08:00

FruitShorts(ReelShort)客户端

FruitShorts 是面向印尼市场的短剧 Flutter 客户端。当前版本已连接 FruitServer 的 /app/** 接口,支持沉浸播放、找剧、账号、观看记录、收藏、 下载授权、评论互动、站内通知和中英印尼三语界面。

技术栈

  • Flutter 3.47.7 / Dart 3.13.5
  • Provider 状态管理与依赖注入
  • dio 网络请求
  • video_player 播放
  • shared_preferences 与 SharedPreferencesAsync 本地配置
  • flutter_localizations,支持 en、zh、id
  • Android 系统画中画

目录结构

lib/
  core/
    config/       地址、语言和运行时配置
    data/         models、remote API、repository、controller
    formatting/   文案与日期格式化
    platform/     触觉等平台能力
    theme/        颜色与主题
    widgets/      跨页面复用组件
  l10n/           三语 ARB 与生成代码
  pages/          业务页面
test/             单元、组件、页面和联调测试
integration_test/ 设备侧集成测试
android/          Android 工程
ios/              iOS 工程与 SPM 配置
assets/           图标、图片和本地媒体文件

已接接口

以下接口均在 lib/core/data/remote/ 中有实际调用,共 26 个不同路径、 31 个 HTTP 方法级调用。

分组 契约 接口
账号 §1.1 POST /app/auth/register、/login、/refresh、/logout
内容 §1.3、§1.4 GET /app/home/feed、/app/discover/feed、/app/categories、/app/dramas/{id}、/app/episodes/{id}/play
观看记录 §1.5 POST/GET /app/watch/progress、GET /app/watch/recent、DELETE /app/watch/progress/{dramaId}、DELETE /app/watch/progress
收藏 §1.5 POST /app/favorites/toggle、GET /app/favorites、DELETE /app/favorites/{dramaId}
下载授权 §1.6 GET /app/downloads/policy、PUT /app/downloads/settings、POST/GET /app/downloads、GET /app/downloads/{episodeId}/url、POST /app/downloads/{episodeId}/progress、DELETE /app/downloads/{episodeId}、DELETE /app/downloads
互动 §1.7 GET/POST /app/comments、DELETE /app/comments/{id}、POST /app/likes/toggle、POST /app/reports
公告 §1.9.2 GET /app/notices

客户端没有调用 /app/config 或创作者入驻接口。

运行

安装依赖

flutter pub get

Android USB

手机开启 USB 调试并连接电脑后:

adb devices
adb reverse tcp:8081 tcp:8081
flutter run -d <device> \
  --dart-define=API_BASE_URL=http://127.0.0.1:8081

adb reverse 将手机的 127.0.0.1:8081 转发到电脑;USB 断开或重新连接后需要 重新执行。

Android 模拟器访问宿主机时使用:

flutter run --dart-define=API_BASE_URL=http://10.0.2.2:8081

iOS

手机与 Mac 需在同一网络,首次启动允许“本地网络”权限:

flutter run -d <udid> \
  --dart-define=API_BASE_URL=http://<Mac局域网IP>:8081

Debug 运行时地址

debug 版本可在「我的 → 设置 → 服务器地址」修改后端地址,保存后重启 App 生效。 地址优先级:

本地运行时设置 > --dart-define(API_BASE_URL) > 平台默认地址

因此不带 --dart-define 构建的 debug APK 也可在安装后改成当前电脑 IP。 release 版本不显示入口,也不会读取本地覆盖。

环境注意

iOS Swift 版本

pubspec.yaml 将 shared_preferences_foundation 固定为 2.5.6。该版本兼容 Xcode 16.2 / Swift 6.0.3;2.6.0 的生成代码使用 Swift 6.1 才支持的 trailing comma。不要手工升级该依赖,flutter pub get 后应显示 shared_preferences_foundation 2.5.6 (overridden)。

iOS SPM 包缺失

如果 Xcode 报 Missing package product FlutterGeneratedPluginSwiftPackage:

rm -rf ~/Library/Developer/Xcode/DerivedData/Runner-*
flutter clean
flutter pub get
xcodebuild -resolvePackageDependencies \
  -project ios/Runner.xcodeproj \
  -scheme Runner

随后重新打开工程构建。Runner.xcscheme 的 PreAction 会先执行 flutter pub get,再执行 Flutter prepare。

Android libdartjni

若启动时报 libdartjni.so 加载失败,通常是旧安装中的原生库残留:

adb uninstall com.stormg.lumadrama
flutter run -d <device> \
  --dart-define=API_BASE_URL=http://127.0.0.1:8081

门禁

dart analyze lib test
flutter test
flutter build apk --debug

测试文件按模块放在 test/ 下,用例名使用 should_<期望>_when_<条件>。真实后端联调测试在服务未启动时会跳过。

当前边界

  • 下载仅管理服务端授权,不落盘、不续传、不支持离线播放。
  • 没有独立搜索接口,搜索能力尚未形成完整闭环。
  • 站内通知没有已读/未读和红点状态。
  • 支付、金币和会员权益尚未形成客户端闭环。
  • Android 支持系统画中画;iOS 画中画尚未接入。
S
Description
No description provided
Readme
10 MiB
0 Stars 1 Watchers 0 Forks
Languages
Dart 97.5%
PowerShell 1.1%
Swift 0.8%
Kotlin 0.4%
Python 0.2%