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
生产打包(Android)
生产环境只需要以下两个 ABI,不要出通用包:
| ABI | 适用设备 | 包体参考 |
|---|---|---|
arm64-v8a |
现代手机(64 位) | 约 21MB |
armeabi-v7a |
老 32 位机 | 约 19MB |
flutter build apk --release --split-per-abi
# 产出:
# build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
# build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
或只打这两个架构的单个 APK:
flutter build apk --release --target-platform android-arm64,android-arm
说明:
x86_64只用于模拟器,不进入生产包。- 不要使用
flutter build apk --release出通用包:会把arm64-v8a、armeabi-v7a、x86_64三套原生库都打进去,包体约 57MB。 - 上架应用商店优先用
flutter build appbundle --release,由商店按设备下发对应 ABI。
门禁
dart analyze lib test
flutter test
flutter build apk --debug
测试文件按模块放在 test/ 下,用例名使用
should_<期望>_when_<条件>。真实后端联调测试在服务未启动时会跳过。
当前边界
- 下载仅管理服务端授权,不落盘、不续传、不支持离线播放。
- 没有独立搜索接口,搜索能力尚未形成完整闭环。
- 站内通知没有已读/未读和红点状态。
- 支付、金币和会员权益尚未形成客户端闭环。
- Android 支持系统画中画;iOS 画中画尚未接入。