Author SHA1 Message Date
Zhou Weidong ecdff54f2e merge: 合并 K98 登录键盘避让 2026-10-21 19:27:21 +08:00
Zhou Weidong 6c2f77926b fix(auth): 登录注册与手机号登录键盘避让 2026-10-21 19:26:46 +08:00
Zhou Weidong 86588d7faa build(android): release 包显式剔除 x86_64 原生库 2026-10-21 19:13:27 +08:00
Zhou Weidong 91a622733c build(android): 生产包 abiFilters 仅保留 arm64-v8a 与 armeabi-v7a 2026-10-21 19:10:05 +08:00
Zhou Weidong 08980ff09b docs(readme): 生产包合并 arm64-v8a 与 armeabi-v7a 单包输出 2026-10-21 19:06:56 +08:00
Zhou Weidong 30a6bcccfc docs(readme): 记录 Android 生产打包只保留 arm64-v8a 与 armeabi-v7a 2026-10-21 19:02:57 +08:00
Zhou Weidong a42d3a26ac merge: 合并 K97.1 剧场搜索框圆角调整 2026-10-21 18:55:00 +08:00
Zhou Weidong c278503d0e fix(theater): 减小剧场搜索框圆角 2026-10-21 18:54:49 +08:00
Zhou Weidong 76f347cc35 merge: 合并 K97 iOS 评论键盘避让 2026-10-21 18:47:04 +08:00
Zhou Weidong 349ea12404 fix(comment): 修复 iOS 评论输入弹窗键盘避让 2026-10-21 18:46:43 +08:00
Zhou Weidong dfc33027d8 merge: 合并 K96 剧场分类分页 2026-10-21 18:24:28 +08:00
Zhou Weidong 13a14f3e85 feat(theater): 剧场分类列表服务端分页 2026-10-21 18:24:14 +08:00
Zhou Weidong f8769f2e1d Revert "merge: 合并 K95.2 首切频道封面过渡"
This reverts commit a2a491d056, reversing
changes made to 838ca2ce2a.
2026-10-21 18:07:25 +08:00
Zhou Weidong a2a491d056 merge: 合并 K95.2 首切频道封面过渡 2026-10-21 18:06:17 +08:00
Zhou Weidong c9adf8b399 fix(home): 频道切换用封面过渡 2026-10-21 18:06:09 +08:00
Zhou Weidong 838ca2ce2a merge: 合并 K95.1 首次切换频道无感 2026-10-21 17:54:10 +08:00
Zhou Weidong 677e49fa6e fix(home): 首切频道预取并保留播放画面 2026-10-21 17:53:58 +08:00
Zhou Weidong dfa79bed88 merge: 合并 K95 频道切换加载修复 2026-10-21 17:46:49 +08:00
Zhou Weidong 3c4d65a9b2 fix(home): 修复频道快速切换卡 loading 2026-10-21 17:46:42 +08:00
Zhou Weidong c8392b2f2a merge: 合并 K94 首页类型 Feed 2026-10-21 17:34:02 +08:00
Zhou Weidong ae61d9ec4c feat(home): 首页按内容类型分频道 Feed 并支持分页 2026-10-21 17:33:52 +08:00
Zhou Weidong 4d0be47ee3 merge: 合并 K90 点赞与评论按集 2026-10-21 16:15:44 +08:00
Zhou Weidong 83822a0cbb feat(player): 点赞与评论改为按集 2026-10-21 16:15:29 +08:00
Zhou Weidong e6f34977f5 merge: 合并 K87.1 下拉刷新冻结位移修复 2026-10-21 15:23:51 +08:00
Zhou Weidong 35860e056b fix(ui): 下拉刷新刷新期间冻结下拉位移 2026-10-21 15:23:46 +08:00
Zhou Weidong 01bef7f758 merge: 合并 K87 下拉刷新完成后回弹 2026-10-21 15:12:46 +08:00
Zhou Weidong 45e8707f1e feat(ui): 下拉刷新完成后才回弹 2026-10-21 15:12:41 +08:00
Zhou Weidong d39d8d43c1 merge: 合并 K86.22 评论输入面板安全区修复 2026-10-21 15:00:26 +08:00
Zhou Weidong 3fbfa9ab81 fix(player): 去除评论输入面板安全区导致的收键盘位移 2026-10-21 15:00:20 +08:00
Zhou Weidong 036bd29855 merge: 合并 K86.21 评论输入浮层稳定定位修复 2026-10-21 14:54:12 +08:00
Zhou Weidong d2f2459a96 fix(player): 固定评论输入浮层位置避免收键盘跳动 2026-10-21 14:54:05 +08:00
Zhou Weidong e90217bdfd merge: 合并 K86.20 评论输入浮层打开状态修正 2026-10-21 14:48:10 +08:00
Zhou Weidong ea1a9f424b fix(player): 返回键仅收起评论输入键盘 2026-10-21 14:48:01 +08:00
Zhou Weidong 18a1d06821 merge: 合并 K86.20 评论输入初始键盘与聚焦修正 2026-10-21 14:43:56 +08:00
Zhou Weidong a66cdb2e1b fix(player): 修正评论输入浮层初始键盘高度与聚焦 2026-10-21 14:43:43 +08:00
Zhou Weidong 6c72f8bf22 merge: 合并 K86.19 评论输入实色填充保障 2026-10-21 14:35:54 +08:00
Zhou Weidong c892d9b995 fix(player): 评论输入面板下方改为实色填充 2026-10-21 14:35:40 +08:00
Zhou Weidong 2ae4aedac0 merge: 合并 K86.18 输入浮层实底填充修正 2026-10-21 14:30:04 +08:00
Zhou Weidong db6fbd58ea fix(player): 评论输入浮层补齐键盘区域实底 2026-10-21 14:29:52 +08:00
Zhou Weidong 8dc9d55106 merge: 合并 K86.18 评论输入透明浮层 2026-10-21 14:24:36 +08:00
Zhou Weidong 4908dc9d76 fix(player): 评论输入改为透明浮层并消除收起键盘抖动 2026-10-21 14:24:24 +08:00
Zhou Weidong 5b4526cb97 merge: 合并 K86.17 输入弹窗位置固定修正 2026-10-21 14:15:11 +08:00
Zhou Weidong bac42bc653 fix(player): 键盘收起后保持评论输入弹窗位置 2026-10-21 14:14:58 +08:00
Zhou Weidong bc971c17d5 merge: 合并 K86.17 输入弹窗收起规则修复 2026-10-21 14:10:20 +08:00
Zhou Weidong cb58f649c1 fix(player): 收起键盘不关闭评论输入弹窗 2026-10-21 14:10:09 +08:00
Zhou Weidong f9f77090d9 merge: 合并 K86.16 评论提示与输入弹层修复 2026-10-21 13:59:16 +08:00
Zhou Weidong 5d459dd08a fix(player): 评论成功提示改黑色浮层并去除输入弹窗遮罩 2026-10-21 13:59:04 +08:00
Zhou Weidong c3e6e02e47 merge: 合并 K86.15 评论发布成功提示 2026-10-21 13:47:46 +08:00
Zhou Weidong e86daf559a feat(player): 评论发布成功提示 2026-10-21 13:47:36 +08:00
Zhou Weidong 9c0c1b8982 merge: 合并 K86.14 评论输入紧凑弹窗修正 2026-10-21 13:37:04 +08:00
Zhou Weidong e0024ed123 fix(player): 评论输入弹窗改为紧凑高度 2026-10-21 13:36:52 +08:00
Zhou Weidong c8ac2c9823 merge: 合并 K86.14 评论输入独立弹窗 2026-10-21 13:31:54 +08:00
Zhou Weidong 282f51c24b fix(player): 评论输入改为独立弹窗 2026-10-21 13:31:41 +08:00
Zhou Weidong aa14d0a835 merge: 合并 K86.13 评论面板半屏高度 2026-10-21 13:20:33 +08:00
Zhou Weidong 50edbf40c4 fix(player): 评论面板固定半屏高度 2026-10-21 13:20:28 +08:00
Zhou Weidong fc877f25bf merge: 合并 K86.12 评论文字居中修复 2026-10-21 13:16:39 +08:00
Zhou Weidong f87b0d2689 fix(player): 评论入口文字垂直居中 2026-10-21 13:16:34 +08:00
Zhou Weidong 146cd2a29e merge: 合并 K86.11 评论假输入框入口 2026-10-21 13:12:39 +08:00
Zhou Weidong 425ea4c0b7 fix(player): 评论入口改为假输入框点击唤起 2026-10-21 13:12:30 +08:00
Zhou Weidong a142a6c318 merge: 合并 K86.10 评论面板高度与收起流程 2026-10-21 13:04:40 +08:00
Zhou Weidong d081cff3e4 fix(player): 评论面板保持高度并两段式收起 2026-10-21 13:04:29 +08:00
Zhou Weidong 9876772d06 merge: 合并 K86.9 评论面板键盘态布局修复 2026-10-21 13:00:20 +08:00
Zhou Weidong bc4c84a4ae fix(player): 修正评论面板键盘态布局重叠 2026-10-21 13:00:05 +08:00
Zhou Weidong a7c0576a03 merge: 合并 K86.8 评论列表与焦点保持 2026-10-21 12:53:56 +08:00
Zhou Weidong ad69ef7f54 fix(player): 聚焦时保留评论列表并稳定焦点 2026-10-21 12:53:46 +08:00
Zhou Weidong de99c09454 merge: 合并 K86.7 键盘弹出不压缩视频页 2026-10-21 12:48:01 +08:00
Zhou Weidong 1776c622ae fix(player): 键盘弹出不压缩视频页 2026-10-21 12:47:52 +08:00
Zhou Weidong 33b49c161a merge: 合并 K86.6 评论输入聚焦修复 2026-10-21 12:40:25 +08:00
Zhou Weidong c7b230263a fix(player): 修复评论输入聚焦时面板消失 2026-10-21 12:40:12 +08:00
Zhou Weidong 226ac5920c merge: 合并 K86.5 隐藏评论操作入口 2026-10-21 12:26:26 +08:00
Zhou Weidong 9bd46521aa fix(player): 评论暂时隐藏举报与删除入口 2026-10-21 12:26:14 +08:00
Zhou Weidong 838beaaa3e merge: 合并 K86.4 评论展开输入面板 2026-10-21 12:21:28 +08:00
Zhou Weidong 519cab20fe fix(player): 评论聚焦态改为展开输入面板 2026-10-21 12:21:17 +08:00
Zhou Weidong 8b51a7c18e merge: 合并 K86.3 Android 键盘窗口修正 2026-10-21 12:14:19 +08:00
Zhou Weidong dbeb9883a5 fix(android): 键盘弹出不再压缩整页 2026-10-21 12:14:09 +08:00
Zhou Weidong 5160ab437d merge: 合并 K86.2 评论面板间距与键盘修正 2026-10-21 12:07:39 +08:00
Zhou Weidong ab476cab7d fix(player): 评论面板自适应高度并只顶起输入框 2026-10-21 12:07:30 +08:00
Zhou Weidong 97735763a1 merge: 合并 K86.1 评论面板补修 2026-10-21 12:00:37 +08:00
Zhou Weidong 2659c29501 fix(player): 评论总数含回复并改用相对时间 2026-10-21 12:00:27 +08:00
Zhou Weidong 22cb74ded4 merge: 合并 K86 评论面板重做 2026-10-21 11:53:07 +08:00
Zhou Weidong 7862e0be09 fix(player): 评论面板按参考图重做 2026-10-21 11:52:59 +08:00
Zhou Weidong bdd3a53632 merge: 合并 K85 收藏与评论数实时刷新 2026-10-21 11:40:08 +08:00
Zhou Weidong 5e2b8d9e4d fix(player): 收藏与评论数实时刷新 2026-10-21 11:39:58 +08:00
Zhou Weidong 97bbced02c merge: 合并 K83-A 互动栏图标资源 2026-10-21 11:02:20 +08:00
Zhou Weidong cbb9f60f7f feat(player): 互动栏改用参考图同款图标资源 2026-10-21 11:02:05 +08:00
Zhou Weidong 35de4095b0 merge: 合并 K82-A 右侧互动栏图标升级 2026-10-21 10:52:31 +08:00
Zhou Weidong 4b1aea29c7 feat(player): 右侧互动栏图标按参考图替换并放大 2026-10-21 10:52:14 +08:00
Zhou Weidong e6a31a60df merge: 合并 K81-A 更多面板文字减重 2026-10-21 10:43:51 +08:00
Zhou Weidong 622dc2f9e8 fix(player): 更多面板文字减重并缩小标签 2026-10-21 10:43:36 +08:00
Zhou Weidong 62f87040d6 merge: 合并 K80-A 更多面板重做 2026-10-21 10:34:32 +08:00
Zhou Weidong 7fccd16750 feat(player): 更多面板按参考图重做 2026-10-21 10:34:18 +08:00
Zhou Weidong c06a67c4b0 merge: 合并 K79-A 进度拖动防闪 2026-10-21 10:24:47 +08:00
Zhou Weidong 1993ff1102 fix(player): 修复拖动进度条时加载态闪烁 2026-10-21 10:24:34 +08:00
Zhou Weidong 72708630ba merge: 合并 K78-A 底部导航放大 2026-10-21 10:16:28 +08:00
Zhou Weidong d6b2d308eb feat(nav): 底部导航图标与文字放大 2026-10-21 10:16:16 +08:00
Zhou Weidong 0ba6ea9c52 merge: 合并 K77-A 播放加载进度态 2026-10-21 10:07:47 +08:00
Zhou Weidong cf4b07aa69 feat(player): 未就绪改由进度条展示加载态 2026-10-21 10:07:34 +08:00
Zhou Weidong 76cc52ad66 merge: 合并 K76-A 开发默认地址 2026-10-21 09:58:09 +08:00
Zhou Weidong 99b45e4f12 chore(config): 开发默认地址改回 192.168.31.187 2026-10-21 09:57:58 +08:00
Zhou Weidong c0697c01e3 merge: 合并 K75-A 首页淡入转场 2026-10-21 09:23:48 +08:00
Zhou Weidong 8c04099d97 feat(player): 首页进详情与播放页改为淡入转场 2026-10-21 09:23:30 +08:00
Zhou Weidong 3a636ca894 merge: 合并 K74-A 开发本机地址 2026-10-21 09:17:06 +08:00
Zhou Weidong d13b601ae8 chore(config): 开发默认地址改回本机 10.39.237.1 2026-10-21 09:16:37 +08:00
Zhou Weidong 827c972da0 merge: 补齐客户端埋点 SDK 2026-10-21 06:32:08 +08:00
Zhou Weidong 92bfc76e50 feat: C3 客户端埋点 SDK(EventTracker 批量上报 + 核心事件) 2026-10-21 06:27:56 +08:00
Zhou Weidong 1dbc3acd80 merge: 合并 K71-A 首页导航安全区底色 2026-10-20 22:13:00 +08:00
Zhou Weidong 66e9062ba5 fix(home): 首页深色底部导航补齐安全区底色 2026-10-20 22:11:56 +08:00
Zhou Weidong ac1202c329 merge: 合并 K70-A 开发默认公网地址 2026-10-20 21:56:12 +08:00
Zhou Weidong 0c6a103c1c chore(config): 开发默认地址改为公网 39.162.50.99 2026-10-20 21:55:51 +08:00
Zhou Weidong 51c363540a merge: 合并 K68-A 锁定编译期接口地址 2026-10-20 20:21:00 +08:00
Zhou Weidong 9ebb54ecfd fix(config): 指定 API_BASE_URL 时跳过地址探测 2026-10-20 20:20:46 +08:00
Zhou Weidong 2c5ff3579c merge: 合并 K67-A 删除无引用代码与资源 2026-10-20 20:06:31 +08:00
Zhou Weidong 3fefd544fb chore(cleanup): 删除无引用代码与无用资源 2026-10-20 20:06:17 +08:00
Zhou Weidong d2174c5b74 merge: 合并 K66-A 启动页停留至首页就绪 2026-10-20 19:57:28 +08:00
Zhou Weidong 7871b0cfbb feat(home): 启动页停留至首页就绪 2026-10-20 19:57:13 +08:00
Zhou Weidong c76b388814 merge: 合并 K65-A 冷启动首页预取 2026-10-20 19:51:55 +08:00
Zhou Weidong 9b31d83e39 perf(home): 冷启动提前拉取首页数据 2026-10-20 19:51:41 +08:00
Zhou Weidong 1199db760f merge: 合并 K64-A 原生品牌启动图 2026-10-20 19:42:03 +08:00
Zhou Weidong 8f60046ec3 feat(splash): 原生开屏改为品牌启动图 2026-10-20 19:41:50 +08:00
Zhou Weidong 210ccc97cb merge: 合并 K63-A 首页 feed 跳转登录页暂停播放 2026-10-20 19:25:05 +08:00
Zhou Weidong 699fd427b8 fix(player): 路由覆盖时暂停播放 2026-10-20 19:24:49 +08:00
Zhou Weidong 911f13f464 merge: 合并 K62 安卓桌面图标资源 2026-10-20 19:16:42 +08:00
Zhou Weidong 4c8ae7bcec fix(android): 按设计源图重做桌面图标资源 2026-10-20 19:16:29 +08:00
Zhou Weidong 51e94029e4 merge: 合并 K61 导航栏闪白修复 2026-10-20 19:04:38 +08:00
Zhou Weidong 0aa5a99a22 fix(flutter): 修复详情与播放器底部闪白 2026-10-20 19:04:25 +08:00
Zhou Weidong 9eec9ed77a merge: 合并 K60 flutter_native_splash 原生开屏 2026-10-20 18:51:54 +08:00
Zhou Weidong 983e99a4b6 feat(flutter): 接入 flutter_native_splash 原生开屏 2026-10-20 18:51:28 +08:00
Zhou Weidong 7c2fd090e0 merge: 合并 K59 隐藏视频调试文字 2026-10-20 18:43:52 +08:00
Zhou Weidong a756faca6c fix(flutter): 隐藏视频常驻调试文字 2026-10-20 18:43:41 +08:00
Zhou Weidong da549492b0 merge: 合并 K58 浅色开屏 2026-10-20 18:38:10 +08:00
Zhou Weidong 398dc3f8b4 feat(flutter): 优化浅色开屏与原生过渡 2026-10-20 18:37:59 +08:00
Zhou Weidong 576f2b95f4 merge: 合并 K57 视频首帧防闪 2026-10-20 18:29:20 +08:00
Zhou Weidong 6b397015b1 fix(flutter): 修复 iOS 视频首帧闪屏 2026-10-20 18:29:10 +08:00
Zhou Weidong ca6776580f merge: 合并 K56 服务地址编辑器 2026-10-20 18:23:58 +08:00
Zhou Weidong c259b0b543 feat(flutter): 增加 debug 服务地址编辑器 2026-10-20 18:23:44 +08:00
Zhou Weidong eab5d3e230 merge: 合并 K55 目录加载诊断 2026-10-20 18:17:46 +08:00
Zhou Weidong 730a96559b feat(flutter): 增加目录加载诊断与前台重试 2026-10-20 18:17:36 +08:00
Zhou Weidong d68734cdab merge: 合并 iOS shared_preferences 兼容修复 2026-10-20 18:08:44 +08:00
Zhou Weidong aac9195e05 fix(flutter): 钉住 shared_preferences_foundation 2.5.6 兼容当前 Xcode。 2026-10-20 18:08:17 +08:00
Zhou Weidong ae11846b63 merge: 合并 K54 iOS 网络修复 2026-10-20 18:01:25 +08:00
Zhou Weidong a63334f5a5 fix(flutter): 修复 iOS 启动网络加载 2026-10-20 18:01:12 +08:00
Zhou Weidong 23059578d2 merge: 合并 K53 详情页首帧修复 2026-10-20 17:54:19 +08:00
Zhou Weidong bb92996db5 fix(flutter): 修复详情页首帧闪屏 2026-10-20 17:54:08 +08:00
Zhou Weidong a11ba50b13 merge: 合并 K52 原生开屏清理 2026-10-20 17:45:44 +08:00
Zhou Weidong fe5b6e6efa feat(flutter): 移除原生静态开屏 2026-10-20 17:45:33 +08:00
Zhou Weidong 53591abcd0 merge: 合并 K50 开屏品牌强化 2026-10-20 17:40:23 +08:00
Zhou Weidong c147645824 feat(flutter): 强化开屏品牌标识展示 2026-10-20 17:40:13 +08:00
Zhou Weidong fcf30ff39c merge: 合并 K50 图标最终资源 2026-10-20 17:36:55 +08:00
Zhou Weidong dfaff9714a fix(flutter): 同步水果短剧品牌图标最终资源 2026-10-20 17:36:49 +08:00
Zhou Weidong 04609ace7c merge: 合并 K50 品牌图标资源 2026-10-20 17:34:25 +08:00
Zhou Weidong 7e60e5ebc4 feat(flutter): 替换水果短剧品牌图标与开屏图 2026-10-20 17:34:15 +08:00
Vicky 375b013b1c merge: 合并 K51 详情页灰屏修复 2026-10-20 17:33:05 +08:00
Zhou Weidong 353196aaa3 fix(flutter): 修复详情页跳转灰屏 2026-10-20 17:32:53 +08:00
Zhou Weidong da78d8723d merge: 合并 K50 品牌开屏动画 2026-10-20 17:20:16 +08:00
Zhou Weidong 15570f117a feat(flutter): 重做品牌开屏动画 2026-10-20 17:20:06 +08:00
Zhou Weidong 499e42b511 merge: 合并 K49 加速态清屏按钮修正 2026-10-20 17:12:37 +08:00
Zhou Weidong 5034ac7670 fix(flutter): 隐藏首页加速态恢复清屏按钮 2026-10-20 17:12:28 +08:00
Zhou Weidong 030a0e7986 merge: 合并分类弧线方向修正 2026-10-20 17:09:46 +08:00
Zhou Weidong 420da29658 fix(flutter): 调整分类弧线开口方向 2026-10-20 17:09:37 +08:00
Zhou Weidong 3ce2599754 merge: 合并 K48 分类 tab 修正 2026-10-20 17:07:33 +08:00
Zhou Weidong 5af70c345a fix(flutter): 优化分类弧线与自动滚动 2026-10-20 17:07:25 +08:00
Zhou Weidong 3041849344 merge: 合并下拉刷新主色文案修正 2026-10-20 17:02:28 +08:00
Zhou Weidong 107ae40d2a fix(flutter): 统一下拉刷新主色文案 2026-10-20 17:02:20 +08:00
Zhou Weidong 8bcd882aa5 merge: 合并 K47 剧场搜索清空修正 2026-10-20 17:00:14 +08:00
Zhou Weidong 9870502901 fix(flutter): 增加剧场搜索清空按钮 2026-10-20 17:00:03 +08:00
Zhou Weidong fb0585c9cf merge: 合并下拉刷新页面跟随修正 2026-10-20 16:57:36 +08:00
Zhou Weidong 69eaacd74f fix(flutter): 修复下拉刷新页面跟随 2026-10-20 16:57:28 +08:00
Zhou Weidong 8f3049f374 merge: 合并 K46-A 榜单新剧分页与预约刷新 2026-10-20 16:53:15 +08:00
Zhou Weidong c4dcb714ab feat(flutter): 增加榜单新剧分页与预约刷新 2026-10-20 16:53:07 +08:00
Zhou Weidong 805762f761 merge: 合并 K45-A 文字下拉刷新 2026-10-20 16:47:20 +08:00
Zhou Weidong 5bdcb989bb feat(flutter): 统一文字下拉刷新 2026-10-20 16:47:13 +08:00
Zhou Weidong 0ad2cd5e95 merge: 合并 K44-A 个人资料页修正 2026-10-20 16:42:34 +08:00
Zhou Weidong b2a8bfa59f fix(flutter): 精简个人资料并修正保存文案 2026-10-20 16:42:27 +08:00
Zhou Weidong dc73f4e3bb merge: 合并 K43-A 首页冷启动灰屏修复 2026-10-20 16:39:55 +08:00
Zhou Weidong 0d2680e6c1 fix(flutter): 修复首页冷启动灰屏 2026-10-20 16:39:48 +08:00
Zhou Weidong 37802b24bf merge: 合并 K42-A 收藏页星标修正 2026-10-20 16:37:04 +08:00
Zhou Weidong 1d8582dfaa fix(flutter): 调整收藏页星标操作 2026-10-20 16:36:56 +08:00
Zhou Weidong 4c9bb18403 merge: 合并 K42-A 观看历史删除按钮修正 2026-10-20 16:34:38 +08:00
Zhou Weidong f62324084e fix(flutter): 优化观看历史删除按钮 2026-10-20 16:34:31 +08:00
Zhou Weidong 9f4dc93d11 merge: 合并 K42-A 收藏与观看历史页重做 2026-10-20 16:32:08 +08:00
Zhou Weidong 794dc87083 feat(flutter): 重做收藏与观看历史页 2026-10-20 16:31:59 +08:00
Zhou Weidong 7285a1cd4e merge: 合并 K41-A 登录页重设计 2026-10-20 16:21:14 +08:00
Zhou Weidong 81bb1543bb feat(flutter): 修复登录输入并升级登录页 2026-10-20 16:21:06 +08:00
Zhou Weidong f72cb41670 merge: 合并详情页顶部按钮统一 2026-10-20 16:16:01 +08:00
Zhou Weidong c1dd033581 fix(flutter): 统一详情页顶部圆形按钮 2026-10-20 16:15:53 +08:00
Zhou Weidong 230f16a44a merge: 合并 K40-B 评论入口登录闸 2026-10-20 16:12:34 +08:00
Zhou Weidong 870a170fad fix(flutter): 评论入口增加登录闸 2026-10-20 16:12:27 +08:00
Zhou Weidong a5c84b0297 merge: 合并 K39 返回按钮优化 2026-10-20 16:09:19 +08:00
Zhou Weidong 8493c4ef3b fix(flutter): 优化二级页面返回按钮样式 2026-10-20 16:09:10 +08:00
Zhou Weidong 457d2fa6f2 merge: 合并 K40-B 评论登录闸 2026-10-20 16:05:54 +08:00
Zhou Weidong d0c1a5f499 fix(flutter): 评论输入增加登录闸 2026-10-20 16:05:47 +08:00
Zhou Weidong 1eea9fafe7 merge: 合并 K40-A 播放加载修复 2026-10-20 15:59:32 +08:00
Zhou Weidong fa5fd124a4 fix(flutter): 优化播放加载占位与主题色 2026-10-20 15:59:23 +08:00
Zhou Weidong 9864c8e102 merge: 合并 K39-A 二级页头统一 2026-10-20 15:55:21 +08:00
Zhou Weidong 1c6c92170d feat(flutter): 统一二级页头并恢复新剧暖色 2026-10-20 15:55:12 +08:00
Zhou Weidong 7b2970d5c5 merge: 合并 K38-A 短剧详情页重做 2026-10-20 15:47:00 +08:00
Zhou Weidong 69faa7818c feat(flutter): 重做短剧详情页 2026-10-20 15:46:53 +08:00
Zhou Weidong 7250b5f0f9 merge: 合并 K37-A 剧场筛选页 2026-10-20 15:39:53 +08:00
Zhou Weidong 850f8e7c8c feat(flutter): 新增剧场筛选页 2026-10-20 15:39:46 +08:00
Zhou Weidong 85ba2a4fec merge: 合并 K36-A 首映厅与档期预约 2026-10-20 15:28:09 +08:00
Zhou Weidong 4f81bcf2b1 feat(flutter): 新剧首映厅与档期预约页 2026-10-20 15:28:09 +08:00
Zhou Weidong fdee89b345 merge: 合并 K34-H 吸顶闪动修复 2026-10-20 15:25:15 +08:00
Zhou Weidong 6463436a0d fix(flutter): 吸顶分类行背景常驻清除闪动 2026-10-20 15:25:15 +08:00
Zhou Weidong fcc1995d8b merge: 合并 K35-A 创作页重做 2026-10-20 15:21:54 +08:00
Zhou Weidong 6e9a93c920 feat(flutter): 去掉剧场封面角标并重做创作页 2026-10-20 15:21:54 +08:00
Zhou Weidong 72410b2a87 merge: 合并 K34-G 剧场吸顶修复 2026-10-20 15:17:46 +08:00
Zhou Weidong d1abfd47c7 fix(flutter): 修复剧场吸顶分类行闪烁并压缩间距 2026-10-20 15:17:46 +08:00
Zhou Weidong 963f376159 merge: 合并 K34-E 卡片直达播放追加 2026-10-20 15:15:30 +08:00
Zhou Weidong 720fd26935 fix(flutter): 剧场与榜单卡片直接进播放页 2026-10-20 15:15:27 +08:00
Zhou Weidong 9949b61560 merge: 合并 K34-E 榜单与吸顶优化 2026-10-20 15:13:12 +08:00
Zhou Weidong 04a1a4ee82 feat(flutter): 榜单前三铺满与剧场分类吸顶下划线 2026-10-20 15:13:12 +08:00
Zhou Weidong d80fff74ba merge: 合并 K34-D 榜单三强横排 2026-10-20 15:08:43 +08:00
Zhou Weidong 881088a428 feat(flutter): 榜单页三强横排与第四名起列表 2026-10-20 15:08:43 +08:00
Zhou Weidong ffedde0db5 merge: 合并 K34-C 榜单新剧预约页 2026-10-20 15:03:07 +08:00
Zhou Weidong bfba2b7c72 feat(flutter): 剧场搜索框改白底并新增榜单新剧预约页 2026-10-20 15:03:02 +08:00
Zhou Weidong 7a75ee6de8 merge: 合并 K34-B 剧场搜索框样式 2026-10-20 14:58:18 +08:00
Zhou Weidong eccd3c6dc1 fix(flutter): 剧场搜索框改为浅灰胶囊 2026-10-20 14:58:18 +08:00
Zhou Weidong 63ace3b574 merge: 合并 K34-A 剧场页精致化 2026-10-20 14:52:46 +08:00
Zhou Weidong 5283ab2549 feat(flutter): 剧场页搜索与吸顶筛选精致化 2026-10-20 14:52:41 +08:00
Zhou Weidong f9d4f982f0 merge: 合并 K33-K 首页 feed 固定顶栏 2026-10-20 14:46:13 +08:00
Zhou Weidong 9175a7f253 fix(flutter): 首页 feed 顶栏固定悬浮 2026-10-20 14:46:08 +08:00
Zhou Weidong 1cb4c56261 merge: 合并 K33 暂停按钮尺寸调整 2026-10-20 14:41:27 +08:00
Zhou Weidong 551da77e67 fix(flutter): 缩小播放暂停按钮 2026-10-20 14:41:27 +08:00
Zhou Weidong 33de925f65 merge: 合并 K33-J 清屏进度与长按恢复 2026-10-20 14:38:12 +08:00
Zhou Weidong b2c219d6bd fix(flutter): 清屏态进度可拖动并长按恢复播放 2026-10-20 14:38:09 +08:00
Zhou Weidong 8327c1dd13 merge: 合并 K33-I feed 清屏与寻址恢复 2026-10-20 14:33:39 +08:00
Zhou Weidong c87798fb16 fix(flutter): feed 清屏保留顶栏并寻址恢复播放 2026-10-20 14:33:35 +08:00
Zhou Weidong 9b99d96a07 merge: 合并 K33-H 画中画回前台复位 2026-10-20 14:29:02 +08:00
Zhou Weidong bc8f3bcab7 fix(flutter): 回前台复位残留画中画状态 2026-10-20 14:28:05 +08:00
Zhou Weidong 28ff9a7642 merge: 合并 K33-G feed rail 与更多弹窗 2026-10-20 14:23:40 +08:00
Zhou Weidong 7e415f6f4f fix(flutter): feed rail 底部对齐并复用播放页更多 2026-10-20 14:23:36 +08:00
Zhou Weidong e800f5971f merge: 合并 K33-F feed 长按与刷新 2026-10-20 14:19:20 +08:00
Zhou Weidong ea9ea6e606 fix(flutter): feed 长按加速与刷新转圈 2026-10-20 14:19:14 +08:00
Zhou Weidong 564c0dbbef merge: 合并 K33-E 首页 feed 刷新与进度优化 2026-10-20 14:11:46 +08:00
Zhou Weidong 82fe237c24 fix(flutter): 首页 feed 静默刷新与进度条细节 2026-10-20 14:11:42 +08:00
Zhou Weidong a3126723d2 merge: 合并 K33-D 首页 feed 精修 2026-10-20 14:05:28 +08:00
Zhou Weidong 636b369bd4 fix(flutter): 首页 feed 去底色并优化整集条 2026-10-20 14:05:24 +08:00
Zhou Weidong f94926cff5 merge: 合并 K33-C 弹幕文案清理 2026-10-20 13:58:27 +08:00
Zhou Weidong 521ebfc1ab fix(flutter): 清理未使用的弹幕文案 key 2026-10-20 13:58:26 +08:00
Zhou Weidong c3f5f43744 merge: 合并 K33-C 首页 feed 精修 2026-10-20 13:56:55 +08:00
Zhou Weidong 321c62664c fix(flutter): 精修首页 feed 交互与底色 2026-10-20 13:56:51 +08:00
Zhou Weidong 435fbbbbb1 merge: 合并 K33-B 深色首页导航追加 2026-10-20 13:48:45 +08:00
Zhou Weidong d36d62f6a6 fix(flutter): 去除关注 tab 并加深色首页导航 2026-10-20 13:48:42 +08:00
Zhou Weidong ea28420489 merge: 合并 K33-B 首页 feed 浮层重做 2026-10-20 13:46:24 +08:00
Zhou Weidong ee6f0d7e72 feat(flutter): 按参考图重做首页 feed 浮层 2026-10-20 13:46:20 +08:00
Zhou Weidong d6b055dc62 merge: 合并 K33-A 失效轮播用例清理 2026-10-20 13:35:40 +08:00
Zhou Weidong fe84244e7d test(flutter): 移除失效的首页轮播用例 2026-10-20 13:35:40 +08:00
Zhou Weidong 53cd2dbba1 merge: 合并 K33-A 首页沉浸式 feed 2026-10-20 13:35:13 +08:00
Zhou Weidong b7926d64a5 feat(flutter): 首页改为沉浸式 feed 流 2026-10-20 13:35:09 +08:00
Zhou Weidong 698fb12e07 merge: 合并 K32-A 识别入口移除 2026-10-20 13:27:07 +08:00
Zhou Weidong 5e2fba1746 fix(flutter): 移除搜索框识剧入口 2026-10-20 13:27:03 +08:00
Zhou Weidong edfef61ee5 merge: 合并 K32-A 剧场页重做 2026-10-20 13:24:24 +08:00
Zhou Weidong 5a51af4264 feat(flutter): 剧场页按参考图重做 2026-10-20 13:24:21 +08:00
Zhou Weidong 2abb8c7032 merge: 合并 K31-G 首页通知铃铛 2026-10-20 13:11:49 +08:00
Zhou Weidong 524b7f5b35 feat(flutter): 首页顶栏改为通知铃铛入口 2026-10-20 13:11:46 +08:00
Zhou Weidong e32fa58979 merge: 合并 K31-F 移除封面锁定角标 2026-10-20 13:08:07 +08:00
Zhou Weidong 1fc25ec5d1 fix(flutter): 首页剧卡移除封面锁定角标 2026-10-20 13:08:03 +08:00
Zhou Weidong 40e23793b4 merge: 合并 K31-E 首页剧卡压缩 2026-10-20 13:03:22 +08:00
Zhou Weidong 124ba75ab8 feat(flutter): 压缩首页剧卡并把播放次数上封面 2026-10-20 13:03:19 +08:00
Zhou Weidong 8e2cd5c838 merge: 合并 K31-D 首页频道吸顶 2026-10-20 12:56:17 +08:00
Zhou Weidong 7cc65b7b09 feat(flutter): 首页频道行滚动吸顶 2026-10-20 12:56:13 +08:00
Zhou Weidong cfc41efddc merge: 合并 K31-C 频道选中态主题色 2026-10-20 12:50:40 +08:00
Zhou Weidong 0e48c0773e fix(flutter): 首页频道选中态改用主题色 2026-10-20 12:50:37 +08:00
Zhou Weidong 290b92c6a7 merge: 合并 K31-B 首页频道与轮播改版 2026-10-20 12:45:16 +08:00
Zhou Weidong a24f1fa7c0 feat(flutter): 首页频道叠加轮播并改下划线选中 2026-10-20 12:45:13 +08:00
Zhou Weidong 36c71e63b4 merge: 合并 K31-A 加速态底部修正 2026-10-20 12:39:55 +08:00
Zhou Weidong 033ae5987c fix(flutter): 加速态隐藏底部选集与清屏按钮 2026-10-20 12:39:52 +08:00
Zhou Weidong 7a7bf0c207 merge: 合并 K31-A 播放页长按手势 2026-10-20 12:36:38 +08:00
Zhou Weidong 96074bc5e8 feat(flutter): 播放页长按手势与加速态 2026-10-20 12:36:35 +08:00
Zhou Weidong 7bb2714941 merge: 合并 K30-F 半透明播放按钮追加 2026-10-20 12:30:09 +08:00
Zhou Weidong a72adcfc3f fix(flutter): 放大播放图标并加半透明底 2026-10-20 12:30:06 +08:00
Zhou Weidong b8d2617873 merge: 合并 K30-F 播放按钮放大追加 2026-10-20 12:27:17 +08:00
Zhou Weidong 8013cc18ad fix(flutter): 放大透明播放按钮 2026-10-20 12:27:13 +08:00
Zhou Weidong ac73bf2208 merge: 合并 K30-F 简介灰字与透明暂停按钮 2026-10-20 12:24:41 +08:00
Zhou Weidong 02763c3dfb fix(flutter): 简介灰字统一并透明暂停按钮 2026-10-20 12:24:37 +08:00
Zhou Weidong 427e7a7897 merge: 合并 K30-E 选集条箭头靠右 2026-10-20 12:19:23 +08:00
Zhou Weidong 90769de3b7 fix(flutter): 选集条箭头靠右排列 2026-10-20 12:19:20 +08:00
Zhou Weidong ced0fae64a merge: 合并 K30-D 评论输入框尺寸修正 2026-10-20 12:16:06 +08:00
Zhou Weidong 8709b64dec fix(flutter): 修正评论输入框高度与圆角 2026-10-20 12:16:03 +08:00
Zhou Weidong edcd25fe68 merge: 合并 K30-C 评论面板视觉重做 2026-10-20 12:11:48 +08:00
Zhou Weidong 9493ad23bb fix(flutter): 重做评论面板视觉 2026-10-20 12:11:44 +08:00
Zhou Weidong ced1ec3d9e merge: 合并 K30-B 播放页数量与评论面板 2026-10-20 12:06:23 +08:00
Zhou Weidong bed6bbb75b feat(flutter): 播放页互动数量与评论面板收紧 2026-10-20 12:06:21 +08:00
Zhou Weidong e39aa766ac merge: 合并 K29.9 播放页底部细节 2026-10-20 11:55:31 +08:00
Zhou Weidong d25519bed7 fix(flutter): 调整播放页底部信息排版 2026-10-20 11:55:28 +08:00
Zhou Weidong 55d22a9940 merge: 合并 K29.8 更多面板小窗播放 2026-10-20 11:48:02 +08:00
Zhou Weidong 0af5de9641 fix(flutter): 更多面板增加小窗播放入口 2026-10-20 11:47:58 +08:00
Zhou Weidong 3b2bdb8e5a merge: 合并 K29.7 更多面板单行排列 2026-10-20 11:44:45 +08:00
Zhou Weidong f083a161e6 fix(flutter): 更多面板倍速清晰度改为单行排列 2026-10-20 11:44:42 +08:00
Zhou Weidong 1e3e5b64dc merge: 合并 K29.6 更多面板精简 2026-10-20 11:40:15 +08:00
Zhou Weidong c4797cd239 fix(flutter): 精简播放页更多面板 2026-10-20 11:40:15 +08:00
Zhou Weidong 08440b0160 merge: 合并 K29.5 进度条保留修正 2026-10-20 11:35:48 +08:00
Zhou Weidong d849834ce6 fix(flutter): 清屏时保留进度条 2026-10-20 11:35:48 +08:00
Zhou Weidong b26ca6cb9f merge: 合并 K29.5 清屏范围 2026-10-20 11:33:23 +08:00
Zhou Weidong 3068eb99da fix(flutter): 收窄清屏范围并保留底栏 2026-10-20 11:33:23 +08:00
Zhou Weidong a26b0071e4 merge: 合并 K29.4 透明播放页 2026-10-20 11:29:02 +08:00
Zhou Weidong 0af68f2455 fix(flutter): 播放页改为透明叠层 2026-10-20 11:29:02 +08:00
Zhou Weidong d762511412 merge: 合并 K29.3 深色播放器 2026-10-20 11:25:28 +08:00
Zhou Weidong 1dbe2cb8e9 fix(flutter): 恢复播放器深色外观 2026-10-20 11:25:28 +08:00
Zhou Weidong b2284b3a74 merge: 合并 K29.2 底栏清屏 2026-10-20 11:19:14 +08:00
Zhou Weidong 1666bc220e fix(flutter): 底栏右侧改为清屏 2026-10-20 11:19:14 +08:00
Zhou Weidong 9429257d62 merge: 合并 K29.1 浅色播放页底栏 2026-10-20 11:14:08 +08:00
Zhou Weidong e2162773e2 fix(flutter): 改为浅色播放页底栏 2026-10-20 11:14:08 +08:00
Zhou Weidong cc26c5472b merge: 合并 K29.1 播放页视觉收紧 2026-10-20 11:12:12 +08:00
Zhou Weidong cf93d8d794 fix(flutter): 收紧播放页底部与互动栏 2026-10-20 11:12:12 +08:00
Zhou Weidong 7b4a792c12 merge: 合并 K29 全屏胶囊双态切换 2026-10-20 11:03:53 +08:00
Zhou Weidong 6dbeb3e505 fix(flutter): 支持全屏胶囊双态切换 2026-10-20 11:03:53 +08:00
Zhou Weidong c4ad5d72d7 merge: 合并 K29 播放页与语言切换 2026-10-20 11:01:55 +08:00
Zhou Weidong 8c43e9e385 feat(flutter): 重构播放页并增加语言切换 2026-10-20 11:01:38 +08:00
Zhou Weidong f1efbc5be8 merge: 合并 K28-C 播放页与操作面板 2026-10-20 10:42:05 +08:00
Zhou Weidong 9a4269b847 feat(flutter): 重设计播放页与操作面板 2026-10-20 10:41:56 +08:00
Zhou Weidong 148fbc3c93 merge: 合并 K28-B 创作与我的页面 2026-10-20 10:28:38 +08:00
Zhou Weidong 03c3964353 feat(flutter): 重设计创作与我的页面 2026-10-20 10:28:31 +08:00
Zhou Weidong d50c6e6d9f merge: 合并 K28-A2 剧场与 Hero 重设计 2026-10-20 10:24:26 +08:00
Zhou Weidong 73aef4e44e feat(flutter): 重设计剧场与首页 Hero 2026-10-20 10:24:19 +08:00
Zhou Weidong 678b976ce1 merge: 合并 K28-S 四槽导航修正 2026-10-20 10:18:18 +08:00
Zhou Weidong 2f1a4c5c69 fix(flutter): 回退底部导航为四槽 2026-10-20 10:18:12 +08:00
Zhou Weidong e448003f1b merge: 合并 K28-S 浅色暖橙视觉主题 2026-10-20 10:15:12 +08:00
Zhou Weidong 634b63e16c feat(flutter): 应用浅色暖橙视觉主题 2026-10-20 10:15:03 +08:00
Zhou Weidong 0d2367431d merge: 合并 K28-A1 客户端四 Tab 首页 2026-10-20 09:57:17 +08:00
Zhou Weidong 49f3e63ed0 feat(flutter): 完成 K28-A1 四 Tab 首页 2026-10-20 09:57:10 +08:00
Zhou Weidong f981f88e0d merge: 合并 K28-A 客户端 UI 重构 2026-10-20 09:49:51 +08:00
Zhou Weidong 959edc0a32 feat(flutter): 重构四 Tab 与浏览页 2026-10-20 09:49:42 +08:00
Zhou Weidong 99c72e2c32 chore(config): 探测地址改为本机后端 127.0.0.1:8081 2026-10-20 09:26:12 +08:00
Zhou Weidong 6022d789ed chore(tools): 添加短剧资源批量上线脚本 2026-10-20 09:11:45 +08:00
Zhou Weidong 842e716ea6 merge: 红果式三 Tab 剧场与极简我的页 2026-10-20 05:29:54 +08:00
Zhou Weidong 12e57de3b3 chore(l10n): 清理已移除语言入口文案 2026-10-20 05:29:21 +08:00
Zhou Weidong 35338cbfc8 feat(app): 剧场页九宫格与极简我的页 2026-10-20 05:28:51 +08:00
Zhou Weidong dc8ca7b743 feat(app): 底部导航精简为三 Tab 2026-10-20 05:14:52 +08:00
Zhou Weidong 19caaa0a22 fix(app): 增加公网地址回退,远程/移动网络可连后端 2026-10-20 05:04:36 +08:00
Zhou Weidong 7ca7d20630 merge: 第二轮 App 接口对接 2026-10-20 04:39:51 +08:00
Zhou Weidong 7850dfc746 style(app): 格式化并拆分长函数 2026-10-20 04:38:36 +08:00
Zhou Weidong 2b2b7e9913 feat(app): 播放器增加清晰度档位入口 2026-10-20 04:37:42 +08:00
Zhou Weidong 30a5fa0776 feat(app): 剧场列表增加语种筛选 2026-10-20 04:35:48 +08:00
Zhou Weidong ade0cc3566 feat(app): 搜索改为调用后端并渲染卡片结果 2026-10-20 04:34:12 +08:00
Zhou Weidong 730e38622f feat(app): 接入金币充值与会员商品下单 2026-10-20 04:32:03 +08:00
Zhou Weidong ec2db6842e merge: Flutter P0-P2 App 对接完成 2026-10-19 23:58:11 +08:00
Zhou Weidong dfc650456a feat(app): 展示真实点赞与评论计数 2026-10-19 23:56:12 +08:00
Zhou Weidong 7b927c794e feat(app): 接入首页轮播 banner 2026-10-19 23:53:03 +08:00
Zhou Weidong 061aac6577 fix(app): 移除设置页调试服务器地址 2026-10-19 23:51:15 +08:00
Zhou Weidong 2b95c79931 feat(app): 增加首页榜单 tab 2026-10-19 23:50:03 +08:00
Zhou Weidong 136ee74618 feat(app): 完成 P0 钱包解锁、下载落盘与手机号登录 2026-10-19 23:46:47 +08:00
Zhou Weidong de941c841c fix(app): 对齐 release 修复(播放明文HTTP、shared_preferences 降级防崩溃、双网络访问) 2026-10-19 22:43:04 +08:00
Zhou Weidong 190e4f9c67 merge: 恢复开发默认服务器地址 2026-10-19 18:31:58 +08:00
Zhou Weidong d75b69621f chore(config): 恢复开发默认服务器地址 2026-10-19 18:31:23 +08:00
Zhou Weidong 75438c204d merge: 更新开发默认服务器地址 2026-10-19 18:27:51 +08:00
Zhou Weidong cb2fa920ea chore(config): 更新开发默认服务器地址 2026-10-19 18:27:17 +08:00
Zhou Weidong 53b77263ca merge: 更新开发默认服务器地址 2026-10-19 18:20:12 +08:00
Zhou Weidong 501446b3a6 chore(config): 更新开发默认服务器地址 2026-10-19 18:19:36 +08:00
Zhou Weidong 75dacf22ab merge: 增加瀑布流与下拉刷新 2026-10-19 18:11:05 +08:00
Zhou Weidong d271c43feb feat(discover): 增加瀑布流与下拉刷新 2026-10-19 18:10:30 +08:00
Zhou Weidong cabc0e72f5 merge: 点击页面取消搜索焦点 2026-10-19 18:04:38 +08:00
Zhou Weidong 884687d10a fix(discover): 点击页面取消搜索焦点 2026-10-19 18:04:00 +08:00
Zhou Weidong bbae8cf4ed merge: 封面完整显示并移除图上标题 2026-10-19 18:02:20 +08:00
Zhou Weidong 4c2384fea9 fix(discover): 封面完整显示并移除图上标题 2026-10-19 18:01:37 +08:00
Zhou Weidong 149b51b2c1 merge: 固定发现页顶栏 2026-10-19 17:55:26 +08:00
Zhou Weidong 16175803ed fix(discover): 固定发现页顶栏 2026-10-19 17:54:44 +08:00
Zhou Weidong 1eaab2a150 merge: 调整 rail 倍速弹窗与进度时间 2026-10-19 17:44:40 +08:00
Zhou Weidong 4d7173d035 fix(player): 调整 rail 倍速弹窗与进度时间 2026-10-19 17:44:06 +08:00
Zhou Weidong 87628e7d10 merge: 倍速改为底部弹窗选择 2026-10-19 17:32:52 +08:00
Zhou Weidong 3a7e0bc4b7 feat(player): 倍速改为底部弹窗选择 2026-10-19 17:32:17 +08:00
Zhou Weidong 5ca5846a26 merge: 共享清屏状态并左贴集数 2026-10-19 17:29:39 +08:00
Zhou Weidong 5b7a8bd775 fix(player): 共享清屏状态并左贴集数 2026-10-19 17:29:01 +08:00
Zhou Weidong 99a57ec502 merge: 中心按钮仅暂停时显示 2026-10-19 17:20:56 +08:00
Zhou Weidong 71e317f4ab fix(player): 中心按钮仅暂停时显示 2026-10-19 17:20:19 +08:00
Zhou Weidong b1747afbe8 merge: 保持清屏并常驻中心按钮 2026-10-19 17:14:40 +08:00
Zhou Weidong 0d977da75b fix(player): 保持清屏并常驻中心按钮 2026-10-19 17:14:03 +08:00
Zhou Weidong bc5feebf39 merge: 修正清屏态点击与滑动复位 2026-10-19 17:06:32 +08:00
Zhou Weidong aea130be11 fix(player): 修正清屏态点击与滑动复位 2026-10-19 17:05:52 +08:00
Zhou Weidong a2de5e8eb7 merge: 增加退出清屏浮动按钮 2026-10-19 16:53:57 +08:00
Zhou Weidong e2e809e2d5 fix(player): 增加退出清屏浮动按钮 2026-10-19 16:53:23 +08:00
Zhou Weidong 3fcfd68660 merge: 仅在暂停时显示播放按钮 2026-10-19 16:51:20 +08:00
Zhou Weidong 0eabb0a763 fix(player): 仅在暂停时显示播放按钮 2026-10-19 16:50:44 +08:00
Zhou Weidong 60ec19f08d merge: 改为显式清屏交互 2026-10-19 16:44:31 +08:00
Zhou Weidong f613033088 fix(player): 改为显式清屏交互 2026-10-19 16:43:50 +08:00
Zhou Weidong f4e1a5424e merge: 修正详情选集等宽网格 2026-10-19 16:33:20 +08:00
Zhou Weidong fbfb9769a0 fix(detail): 选集改为等宽懒加载网格 2026-10-19 16:32:09 +08:00
Zhou Weidong cbbd4c80e4 merge: 修正六屏顶栏与内容间距 2026-10-19 16:26:01 +08:00
Zhou Weidong 2fd92cdbea fix(ui): 修正六屏顶栏与内容间距 2026-10-19 16:25:25 +08:00
Zhou Weidong e03ea76505 merge: 统一暂停按钮并自动隐藏控制层 2026-10-19 16:16:53 +08:00
Zhou Weidong 03e34b3b57 fix(player): 统一暂停按钮并自动隐藏控制层 2026-10-19 16:16:14 +08:00
Zhou Weidong 568f051b7a merge: 修复详情暂停重复按钮 2026-10-19 16:07:42 +08:00
Zhou Weidong f0c53542ef fix(player): 移除详情暂停重复按钮 2026-10-19 16:07:06 +08:00
Zhou Weidong c82502559b merge: 清理 K26 旧 UI 与死代码 2026-10-19 15:59:03 +08:00
Zhou Weidong 5422581f8b refactor(ui): 清理 K26 旧 UI 与死代码 2026-10-19 15:58:22 +08:00
Zhou Weidong a5398daab3 merge: K26 客户端六屏按预览校正 2026-10-19 15:51:04 +08:00
Zhou Weidong 8767b5644b test(ui): 更新三 Tab 预览断言 2026-10-19 15:50:24 +08:00
Zhou Weidong fecc5b0d27 feat(ui): 新增登录入口与我的页预览 2026-10-19 15:50:15 +08:00
Zhou Weidong 21d457fd98 feat(ui): 校正首页发现详情播放器预览 2026-10-19 15:50:11 +08:00
Zhou Weidong 87db548591 feat(theme): 校正 K26 预览色板与导航 2026-10-19 15:50:07 +08:00
Zhou Weidong eefabb6898 merge: 修复播放器全屏进入方式 2026-10-19 15:24:40 +08:00
Zhou Weidong 1c94b727fb fix(player): 恢复详情与选集全屏播放 2026-10-19 15:24:06 +08:00
Zhou Weidong 04fddce1d1 merge: K25 客户端详情页与播放器 2026-10-19 15:17:18 +08:00
Zhou Weidong 689063a694 feat(player): 新增卡片式播放器 2026-10-19 15:16:40 +08:00
Zhou Weidong ec163f905d feat(detail): 重做详情页视觉结构 2026-10-19 15:16:36 +08:00
Zhou Weidong 4553606ec2 merge: K24 客户端 UI 对齐设计稿 2026-10-19 15:02:44 +08:00
Zhou Weidong e8c1859e70 feat(ui): 重做三 Tab 首页与发现页 2026-10-19 15:01:45 +08:00
Zhou Weidong eae1c533ce feat(theme): 接入 Obsidian Flare 设计系统 2026-10-19 15:01:41 +08:00
Zhou Weidong b1c69e22af feat(auth): 合并 K21 登录页优化 2026-10-19 10:34:37 +08:00
Zhou Weidong 8a96f341c8 feat(auth): 优化登录页布局与字段反馈 2026-10-19 10:33:33 +08:00
Zhou Weidong e44fbdf6f2 style(ui): 合并 K20 客户端视觉统一 2026-10-19 10:23:38 +08:00
Zhou Weidong 5f1df401dc fix(ui): 保留空态既有字号口径 2026-10-19 10:23:24 +08:00
Zhou Weidong c5bfd006fa style(ui): 统一页面字号间距与状态样式 2026-10-19 10:21:28 +08:00
Zhou Weidong df5fbe5b08 feat(ui): 增加视觉 token 与统一导航 2026-10-19 10:16:12 +08:00
Zhou Weidong 42ce1d1d84 fix(account): 合并网络异常文案修复 2026-10-19 10:00:48 +08:00
Zhou Weidong 27ab7cebfb fix(account): 本地化网络异常文案 2026-10-19 09:59:45 +08:00
Zhou Weidong 9b3ab9d5de feat(account): 合并 K19 账号中心 2026-10-19 09:55:37 +08:00
Zhou Weidong 7151bc9d8b style(account): 保持账号入口首屏可用 2026-10-19 09:54:10 +08:00
Zhou Weidong 6fce24d9ec refactor(account): 收敛账号页组件结构 2026-10-19 09:51:23 +08:00
Zhou Weidong da095115d4 feat(account): 增加账号中心页面与入口 2026-10-19 09:50:23 +08:00
Zhou Weidong c68f02449f feat(account): 增加账号中心页面逻辑 2026-10-19 09:48:07 +08:00
Zhou Weidong ef7f4ce3b6 feat(account): 同步资料保存后的登录态 2026-10-19 09:47:28 +08:00
Zhou Weidong 44f6feb249 feat(account): 接入个人中心接口模型 2026-10-19 09:47:06 +08:00
Zhou Weidong 7d68699523 fix(config): 合并开发默认服务器地址 2026-10-19 09:34:54 +08:00
Zhou Weidong 60043d1e41 fix(config): 更新开发默认服务器地址 2026-10-19 09:34:44 +08:00
Zhou Weidong 9df36bc358 feat(ui): 合并品牌启动页与选集交互 2026-10-19 09:28:27 +08:00
Zhou Weidong c1cb7d1c11 feat(ui): 更新品牌启动页与选集交互 2026-10-19 09:28:16 +08:00
Zhou Weidong 4778ce2c75 merge: 合并 K15 首页服务器设置修复 2026-10-17 23:13:07 +08:00
Zhou Weidong c4694c6f18 fix(flutter): 增加首页服务器设置并更新真机默认地址 2026-10-17 23:12:47 +08:00
Zhou Weidong 9fe62d13cb merge: 合并 K14 文档接口统计修正 2026-10-17 23:03:52 +08:00
Zhou Weidong 213c86e93c docs(client): 修正已接接口数量说明 2026-10-17 23:03:43 +08:00
Zhou Weidong 27e5286b10 merge: 合并 K14 客户端文档 2026-10-17 23:02:47 +08:00
Zhou Weidong 5a28845b5e docs(client): 重写 README 并补充任务与文件说明 2026-10-17 23:02:28 +08:00
Zhou Weidong f95325d581 merge: 合并 K13 开发服务器地址设置 2026-10-17 22:54:25 +08:00
Zhou Weidong 907562a874 feat(flutter): 增加 debug 运行时服务器地址设置 2026-10-17 22:54:07 +08:00
Zhou Weidong b76228905c merge: 合并 K12 首页与空态视觉修订 2026-10-17 22:44:40 +08:00
Zhou Weidong 2dd4627bdc feat(flutter): 精简首页标题并重做空态视觉 2026-10-17 22:44:21 +08:00
Zhou Weidong b5a8656ff0 merge: 合并 K11 首页三列网格 2026-10-17 22:34:38 +08:00
Zhou Weidong f0db631fa2 feat(flutter): 首页网格改为三列并首位显示全部 2026-10-17 22:34:14 +08:00
Zhou Weidong 0466b4b425 merge: 合并 K10 统一空态组件 2026-10-17 17:44:58 +08:00
Zhou Weidong 6d08330388 feat(flutter): 统一空列表占位组件 2026-10-17 17:44:44 +08:00
Zhou Weidong 19babb8f4a merge: 合并 iOS shared_preferences 编译修复 2026-10-17 17:30:50 +08:00
Zhou Weidong 2c30f83ab3 chore(ios): 固定 shared_preferences_foundation 2.5.6 2026-10-17 17:30:33 +08:00
Zhou Weidong a4415c872d chore(deps): 同步依赖锁文件 2026-10-17 17:27:07 +08:00
Zhou Weidong 2c381be5e8 merge: 合并 K9 首页全部剧目网格 2026-10-17 17:24:58 +08:00
Zhou Weidong cf03178cc5 feat(flutter): 首页改为两列全部剧目网格 2026-10-17 17:24:45 +08:00
Zhou Weidong 99f64ab870 merge: 合并 K8 登录页视觉重设计 2026-10-17 17:15:09 +08:00
Zhou Weidong 45c3c645ff feat(flutter): 重设计登录页视觉 2026-10-17 17:14:56 +08:00
Zhou Weidong 6cc5bfc3be merge: 合并首页轮播与观看历史真机修复 2026-10-17 17:00:20 +08:00
Zhou Weidong 5058853af3 fix(flutter): 注册目录仓库并修正首页轮播数据源 2026-10-17 17:00:07 +08:00
Zhou Weidong 3e8703b840 merge: 合并 K7 轮播与站内通知 2026-10-17 16:50:38 +08:00
Zhou Weidong b870956665 feat(flutter): 增加轮播自动播放与站内通知 2026-10-17 16:50:25 +08:00
Zhou Weidong b7b1c50427 merge: 合并 K6 导航与观看历史缺陷修复 2026-10-17 16:41:35 +08:00
Zhou Weidong 732483465c fix(flutter): 修复导航白线与观看记录错误透传 2026-10-17 16:41:24 +08:00
Zhou Weidong ac706a42a5 merge: 合并 K6 iOS SPM 构建修复 2026-10-17 16:32:22 +08:00
Zhou Weidong cc037a2956 fix(ios): 刷新 Flutter SPM 包后再准备框架 2026-10-17 16:32:11 +08:00
Zhou Weidong 0cedaab795 merge: 合并 K6 登录导航与震动反馈 2026-10-17 16:16:07 +08:00
Zhou Weidong 8a481d5c62 feat(flutter): 增加关键操作震动反馈 2026-10-17 16:15:46 +08:00
Zhou Weidong e609e3ad8d feat(flutter): 优化登录页与底部导航 2026-10-17 16:11:01 +08:00
Zhou Weidong e52d81881c merge: 合并 K5 克莱因蓝主题与印尼语适配 2026-10-17 15:58:29 +08:00
Zhou Weidong 10d448c8ba feat(flutter): 应用克莱因蓝主题与印尼语适配 2026-10-17 15:58:17 +08:00
Zhou Weidong e1147cfcba merge: 合并 K3 举报错误透传修复 2026-10-17 15:29:27 +08:00
Zhou Weidong 1488ee8f85 fix(flutter): 透传举报本人评论错误 2026-10-17 15:29:18 +08:00
Zhou Weidong 9db6935308 merge: 合并 K3 客户端互动能力 2026-10-17 15:26:51 +08:00
Zhou Weidong d361034226 feat(flutter): 接入互动评论点赞举报 2026-10-17 15:26:42 +08:00
Zhou Weidong 45f5f25640 merge: 合并 K2 客户端分类记录收藏与下载授权 2026-10-17 14:49:36 +08:00
Zhou Weidong cc4d7c5a9d feat(flutter): 接入分类记录收藏与下载授权 2026-10-17 14:49:16 +08:00
jianghaifeng 00280ca0da merge: 同步 main 的作者标识提交到 develop
main 的 eaf8fb4 机械性地给全仓加了 // Author 头,develop 侧包名已改 fruitshorts、
并删除了 demo_media/home_feed_category/home_feed_sections 三个文件,故按 develop 口径解决冲突:
保留 fruitshorts 包名与删除结果,补回 Author 头。
2026-10-17 13:48:31 +08:00
Vicky 84a1f58a0a test(client): 新增设备侧集成测试(真机跑通后端可达性)
红线第 10 条(设备验证必须设备侧取证)配套:integration_test/app_backend_test.dart
在手机进程里真实请求 /app/home/feed 与 /app/dramas/{id},并用真 App 断言首页剧目列表能渲染。
把 API_BASE_URL 打进设备日志,便于区分地址不对与设备连不上。

注意:真机执行由用户负责(用户 20:45 指令),本文件按原样交付、不再改动。
本项目 iOS 用 SPM,无 Podfile,不需要 pod install。
2026-10-16 18:05:58 +08:00
Vicky d7eff4ca59 feat(client): 对接详情/播放/进度续看/收藏(K1 看剧闭环)+ 三态 UI
后端接口从 6 个扩到 13 个,全部走真数据:

- 新增 api:playback_api(/app/episodes/{id}/play)、watch_api(/app/watch/*)、
  library_api(/app/favorites*);票据从 CatalogApi 搬到 PlaybackApi
- 新增 repository:PlaybackRepository(含票据 TTL 缓存,默认 10 分钟,时钟可注入)、
  FavoriteRepository、WatchHistoryRepository 换成服务端模型(每剧一条续看记录,删掉 demoProfileId)
- PlayerLogic:起播前取票(拿不到给三态 UI,失败可重试);accessType 驱动锁定文案,
  不在前端猜;签名地址原样交给播放器(只补 host,不动 path/query);
  进度上报节流 5s → 10s,切集/退出/切后台各补一次,播完带 finished
- 续看定位:服务端记录里的那一集才 seek(其它集从头播),续看位置进详情/播放页时读一次
- FavoriteController:收藏以服务端为准,乐观更新 + 失败回滚;退出登录清空
- UI 三态:详情页(加载/失败可重试/空剧集 + 续看进度条 + 收藏按钮)、
  播放页(票据加载中/失败可重试/后端判定不可播)、我的页(续看失败可重试、收藏三态、最近观看)
- l10n 新增 8 个键(en/zh/id 三份):网络/进度/收藏失败、锁定提示、续看文案等

测试:flutter test 188 全过(存量 27 个测试文件未跑红);新增票据过期重取、进度节流、
续看定位、收藏回滚、签名 query 原样保留、真实后端端到端联调(live_watch_flow)
2026-10-16 17:39:05 +08:00
Vicky 94ff9f1177 fix(client): 兼容后端 Long 字段字符串化(id 与计数)
后端 J1 起 Long/long 一律以字符串下发(含雪花 id 与 viewCount/expiresIn)。
客户端 id 方向本来就是 (json['id'] ?? '').toString(),不受影响;会被 as num? 打挂的
是 Long 计数,这里加统一兼容解析并替换 3 处:

- lib/core/data/models/json_numbers.dart(新增,接受数字或数字字符串)
- lib/core/data/models/auth_session.dart(expiresIn,后端 long)
- lib/core/data/models/drama.dart(viewCount,后端 Long ×2)
- test/core/json_id_parsing_test.dart(新增 8 条回归用例)

其余 as num?(durationSec/unlockCoin/number/totalEpisodes/freeEpisodes/code)对应后端
Integer/int,仍是数字,未改动;未碰任何业务逻辑与 UI。
2026-10-16 16:44:02 +08:00
Vicky 61454e36b1 feat(client): 改名为 FruitShorts 并新增 id-ID 印尼语文案(1-3 + 1-4 合并)
为什么:a) 应用对外名称要统一成 FruitShorts(产品名,nontonki 是原型代号);
b) 首发市场是印尼,界面必须有印尼语;c) 归档要求"新增 id-ID 与改名合并生成一次 l10n,别分两次"。

改名:
- pubspec name: nontonki → fruitshorts(Dart 包名),description 同步;28 个文件的 package: 导入前缀替换
- Android android:label、iOS CFBundleDisplayName/CFBundleName → FruitShorts
- 图标资源 assets/icon/nontonki.png → fruitshorts.png(含 pubspec 两处引用)
- README 同步(补印尼语说明,顺带修掉写错的模块名 reelshort-app-api → fruitshorts-app-api)

文案:
- 三份 arb 的 appName → FruitShorts、brandMark → FRUITSHORTS、shareFooter → FruitShorts(不留 demo 标记)
- 新增 lib/l10n/app_id.arb:174 个值键与 en/zh 完全一致,按印尼语习惯翻译(Coin→Koin、Episode→Episode)
- 一次性 flutter gen-l10n 生成 app_localizations_id.dart;id 自动进入 supportedLocales,默认 locale 未改
- 新增 test/config/l10n_id_test.dart:钉住 id 文案、supportedLocales 含 id、品牌文案无 demo 标记、占位符渲染

不动:applicationId / bundle id(lumadrama 遗留,等裁定)、目录名、业务逻辑与页面结构、语言选择页(仍只有 en/zh)

门禁:dart analyze lib test 零告警;flutter test 159 全过(基线 155 + 新增 4);残留扫描 0 命中;
三份 arb 键集一致(174/174/174);真机(iPhone iOS 26.6.1)构建安装启动成功,devicectl 列出显示名 FruitShorts
2026-10-16 10:16:59 +08:00
Vicky 0e5d550b50 test(client): 用例名统一为 should_<期望>_when_<条件>(155/155)
为什么:红线第 8 条门禁立即生效,要求 Flutter 测试命名合规;此前 155 条用例名是英文自然语言
或中文描述,合规数 0/155,属存量欠账,按"先补齐再上新功能"在本批处理。

- 25 个测试文件、155 条用例改名,按「文件 + 旧名」精确定位,每条断言命中恰好 1 次才替换
- 只改名字字面量:改动行 155 删 + 155 增,无一行不含字符串字面量(断言与用例体零改动)
- 门禁:dart analyze lib test = No issues found;flutter test = 155 全过
2026-10-16 09:41:14 +08:00
Vicky 1853e1845c refactor(client): 网络层由官方 http 换成 dio(对外行为不变)
为什么:权威文档(AGENTS.md / CODING_STANDARDS.md)强制网络层用 dio,差异清单 A 组第 1 题
用户裁定选 A;原来用官方 http 是在无文档状态下按口头要求选的。

- ApiClient 改用 dio + BaseOptions(validateStatus 恒真、8s 超时、ResponseType.bytes 自行 UTF-8 解码)
- 新增 AuthHeaderInterceptor(Authorization / X-Device-Id)与 EnvelopeInterceptor
  (解包 {code,message,data} + 错误码映射 + 401 判定)
- 401 → 刷新 → 重发一次在 ApiClient 里编排,刻意不放在拦截器内重发:dio 的排队拦截器
  在回调里再发请求会自锁
- 接口层(auth_api/catalog_api)签名、全部 controller/logic/page 未改动
- 测试:新增假 dio adapter 替代 MockClient,断言口径一条未改;用例名改为 should_<期望>_when_<条件>;
  新增 api_client_test(解包/错误映射/请求头/查询参数/跳过重试)与 live_auth_test(真实后端 POST 链路)
- pubspec:加 dio、移除已无引用的 http
- 实测:dart analyze lib test 零告警;flutter test 155 全过;真实联调(8081)GET/POST 链路均通
2026-10-16 09:30:46 +08:00
Vicky ae49b10407 chore(client): 归档发现页 widgets(原型阶段新增目录) 2026-10-15 17:53:54 +08:00
Vicky feecc349a0 chore(client): 归档原型阶段新增文件(配置、主题、模型与测试)
为什么:上一批归档只覆盖了「已跟踪文件的修改」,原型阶段新增的文件(app_config、theme、
home_feed/play_ticket 模型、catalog_api、测试目录等)还是未入库状态 —— 而已入库的代码会 import 它们,
留在工作区会导致 HEAD 处的代码编译不过。一并归档,让 HEAD 自洽。

纯归档,无行为改动。
2026-10-15 17:53:45 +08:00
Vicky e1b98df509 feat(client): C 端 1-2 账号链路(邮箱登录/注册 + 令牌与 401 + 匿名/登录分叉)
为什么:客户端此前完全没有账号概念(mine 页的"登录"只是本地 demo 开关),
而受限动作(收藏/评论)要对到具体账号。本批把账号链路接上,为后续互动、进度同步、下载打底。

- AuthApi + AuthController + AuthSessionStore:注册/登录/登出/刷新,令牌与设备号存 shared_preferences
  (用 SharedPreferencesAsync,与 engagement 仓库同一套 API)
- ApiClient:统一带 Authorization 与 X-Device-Id;401 自动刷新一次并重试,刷新失败清登录态走 onUnauthorized
- 登录/注册页(pages/auth,沿用 binding/logic/view 与现有视觉):邮箱格式、密码 8-64 位含字母数字本地先校验,
  错误提示走 l10n;登录/注册一键切换
- 匿名/登录分叉:首页、发现、详情保持匿名可看;收藏/点赞等受限动作走 ensureSignedIn() 弹底部提示引导登录
- mine 页展示真实账号(昵称 + uid),拿不到才回落到演示文案
- 测试:新增 auth 控制器(注册落盘/401 刷新重试/刷新失败清会话/登出)与登录页(校验/切换)用例;
  widget_test 改为预置本地会话(账号不再是本地开关);修掉 playback 用例对 host 大小写的环境依赖断言

门禁:flutter analyze 0 问题;flutter test 148 全过。
2026-10-15 17:53:35 +08:00
Vicky 77d5748dbb chore(client): 归档原型阶段未提交改动(binding/logic/view 分层与各页迭代)
为什么:客户端原型在 14d7bd3 之后又做了一轮(页面分层、发现页、分类滑动、播放器控件等),
一直留在工作区没入库。下一批账号链路要改其中的 app.dart / home_view / player_view / mine_view,
先归档这批既存改动,本批的实际 diff 才说得清边界。

只归档,不改行为:当前工作区 flutter analyze 0 问题、flutter test 148 全过。
2026-10-15 17:53:27 +08:00
449 changed files with 55010 additions and 5978 deletions

No files matched your search

+7 -1
View File
@@ -45,7 +45,13 @@ app.*.map.json
/android/app/release
# Local demo media and internal planning are absent from the public repo.
/assets/
# Launcher/splash source icons are required at build time, so keep them tracked.
/assets/*
!/assets/icon/
!/assets/icon/*.png
!/assets/fonts/
!/assets/fonts/*.ttf
!/assets/fonts/OFL-*.txt
/server/
/docs/
/AGENTS.md
+170 -11
View File
@@ -1,17 +1,176 @@
一个使用 Flutter 开发的短剧播放 App 原型,面向海外用户,重点探索沉浸式刷剧、找剧和连续观看的移动端体验
# FruitShorts(ReelShort)客户端
## 主要功能
FruitShorts 是面向印尼市场的短剧 Flutter 客户端。当前版本已连接
`FruitServer` 的 `/app/**` 接口,支持沉浸播放、找剧、账号、观看记录、收藏、
下载授权、评论互动、站内通知和中英印尼三语界面。
- **沉浸式首页**:竖屏播放,上下滑切换短剧,左右滑切换内容类别;支持拖动进度、横屏全屏观看。
- **剧集播放**:从详情页进入后按集连续播放,支持选集和本地续看。
- **找剧与个人页**:浏览、搜索和查看剧集详情;在个人页查看观看记录、收藏与喜欢的内容。
- **互动与多语言**:本地演示评论、系统分享,以及英文和简体中文界面。
- **画中画**:Android 接入系统画中画;iOS 画中画尚未实现。
## 技术栈
## 技术实现
- Flutter 3.47.7 / Dart 3.13.5
- Provider 状态管理与依赖注入
- dio 网络请求
- video_player 播放
- shared_preferences 与 `SharedPreferencesAsync` 本地配置
- flutter_localizations,支持 `en`、`zh`、`id`
- Android 系统画中画
项目使用 Flutter、Provider 和 `video_player`。播放会话统一管理播放器生命周期;观看进度和演示互动数据保存在本机。首页、找剧、我的共用同一个根页面,切换时保留页面状态。
## 目录结构
## 当前说明
```text
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` 或创作者入驻接口。
## 运行
### 安装依赖
```bash
flutter pub get
```
### Android USB
手机开启 USB 调试并连接电脑后:
```bash
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 模拟器访问宿主机时使用:
```bash
flutter run --dart-define=API_BASE_URL=http://10.0.2.2:8081
```
### iOS
手机与 Mac 需在同一网络,首次启动允许“本地网络”权限:
```bash
flutter run -d <udid> \
--dart-define=API_BASE_URL=http://<Mac局域网IP>:8081
```
### Debug 运行时地址
debug 版本可在「我的 → 设置 → 服务器地址」修改后端地址,保存后重启 App 生效。
地址优先级:
```text
本地运行时设置 > --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`:
```bash
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` 加载失败,通常是旧安装中的原生库残留:
```bash
adb uninstall com.stormg.lumadrama
flutter run -d <device> \
--dart-define=API_BASE_URL=http://127.0.0.1:8081
```
## 生产打包(Android)
生产包只包含以下两个 ABI,**打成一个 APK**,不做 split:
| ABI | 适用设备 |
| --- | --- |
| `arm64-v8a` | 现代手机(64 位) |
| `armeabi-v7a` | 老 32 位机 |
```bash
flutter build apk --release --target-platform android-arm64,android-arm
# 产出单个:build/app/outputs/flutter-apk/app-release.apk(约 37MB)
```
说明:
- `android/app/build.gradle.kts` 的 `release` 已配置 `abiFilters`,只保留 `arm64-v8a` 与 `armeabi-v7a`,插件也不会再带入 `x86_64` 原生库。
- `x86_64` 只用于模拟器,不进入生产包。
- 不要直接运行 `flutter build apk --release`:默认会编译三套原生库,包体约 57MB。
- 只有需要进一步压缩单机下载体积时,才考虑 `--split-per-abi` 出分架构包(arm64 约 21MB、armv7 约 19MB),默认不用。
## 门禁
```bash
dart analyze lib test
flutter test
flutter build apk --debug
```
测试文件按模块放在 `test/` 下,用例名使用
`should_<期望>_when_<条件>`。真实后端联调测试在服务未启动时会跳过。
## 当前边界
- 下载仅管理服务端授权,不落盘、不续传、不支持离线播放。
- 没有独立搜索接口,搜索能力尚未形成完整闭环。
- 站内通知没有已读/未读和红点状态。
- 支付、金币和会员权益尚未形成客户端闭环。
- Android 支持系统画中画;iOS 画中画尚未接入。
+11 -3
View File
@@ -29,12 +29,13 @@ android {
buildTypes {
release {
// 生产包只保留 arm64-v8a 与 armeabi-v7a,避免插件带入 x86_64 原生库
ndk {
abiFilters += listOf("arm64-v8a", "armeabi-v7a")
}
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
// 反编译保护(法律红线配套):开启 R8 混淆 + 资源压缩,发布前替换正式签名。
isMinifyEnabled = true
isShrinkResources = true
}
}
}
@@ -45,6 +46,13 @@ kotlin {
}
}
// 生产包不允许出现 x86_64:部分插件 AAR 会带入少量 x86_64 原生库,这里显式剔除。
androidComponents {
onVariants(selector().withBuildType("release")) { variant ->
variant.packaging.jniLibs.excludes.add("lib/x86_64/**")
}
}
flutter {
source = "../.."
}
@@ -6,4 +6,6 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 开发期后端是明文 HTTP,仅调试构建放开。 -->
<application android:usesCleartextTraffic="true"/>
</manifest>
+5 -3
View File
@@ -1,10 +1,12 @@
<!-- Author: fruit.com.cn -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:label="Nontonki"
android:label="FruitShorts"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true"
@@ -15,7 +17,7 @@
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustNothing">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
@@ -8,6 +8,8 @@ import android.content.res.Configuration
import android.os.Build
import android.util.Rational
import android.content.pm.PackageManager
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
@@ -16,6 +18,8 @@ class MainActivity : FlutterActivity() {
private val shareRequestCode = 9041
private var pendingShare: MethodChannel.Result? = null
private var pipChannel: MethodChannel? = null
private var keyboardChannel: MethodChannel? = null
private var imeInset = 0
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
@@ -62,6 +66,37 @@ class MainActivity : FlutterActivity() {
result.error("share_failed", error.message, null)
}
}
keyboardChannel = MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"com.stormg.lumadrama/keyboard"
)
keyboardChannel?.setMethodCallHandler { call, result ->
if (call.method != "get") {
result.notImplemented()
return@setMethodCallHandler
}
val inset = currentImeInset()
emitImeInset(inset)
result.success(inset)
}
val decorView = window.decorView
ViewCompat.setOnApplyWindowInsetsListener(decorView) { view, insets ->
emitImeInset(insets.getInsets(WindowInsetsCompat.Type.ime()).bottom)
ViewCompat.onApplyWindowInsets(view, insets)
}
ViewCompat.requestApplyInsets(decorView)
}
private fun currentImeInset(): Int =
ViewCompat.getRootWindowInsets(window.decorView)
?.getInsets(WindowInsetsCompat.Type.ime())
?.bottom
?: 0
private fun emitImeInset(value: Int) {
if (value == imeInset) return
imeInset = value
keyboardChannel?.invokeMethod("insetsChanged", value)
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
@@ -77,4 +112,11 @@ class MainActivity : FlutterActivity() {
pendingShare = null
}
}
override fun onDestroy() {
ViewCompat.setOnApplyWindowInsetsListener(window.decorView, null)
keyboardChannel?.setMethodCallHandler(null)
keyboardChannel = null
super.onDestroy()
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
</layer-list>
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
</layer-list>
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
<item>
<bitmap
android:gravity="center"
android:src="@drawable/splash_icon" />
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
</layer-list>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_background" />
<item>
<bitmap
android:gravity="center"
android:src="@drawable/splash_icon" />
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground>
<inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 813 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@@ -6,6 +6,8 @@
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/splash_background</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@color/splash_background</item>
</style>
</resources>
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
@@ -15,6 +18,6 @@
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowBackground">@color/splash_background</item>
</style>
</resources>
@@ -6,6 +6,8 @@
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/splash_background</item>
</style>
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">@color/splash_background</item>
</style>
</resources>
+2 -3
View File
@@ -2,6 +2,5 @@
<!-- Author: fruit.com.cn -->
<resources>
<color name="splash_background">#FF000000</color>
<color name="ic_launcher_background">#D74A7D</color>
</resources>
<color name="splash_background">#1F1B16</color>
</resources>
+5 -2
View File
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Author: fruit.com.cn -->
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
@@ -15,6 +18,6 @@
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
<item name="android:windowBackground">@color/splash_background</item>
</style>
</resources>
@@ -6,4 +6,6 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 开发期后端是明文 HTTP,仅调试构建放开。 -->
<application android:usesCleartextTraffic="true"/>
</manifest>
+93
View File
@@ -0,0 +1,93 @@
Copyright 2021 The Outfit Project Authors (https://github.com/Outfitio/Outfit-Fonts)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
+93
View File
@@ -0,0 +1,93 @@
Copyright 2020 The Plus Jakarta Sans Project Authors (https://github.com/tokotype/PlusJakartaSans)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

+99
View File
@@ -0,0 +1,99 @@
# 客户端文件说明
## 目录树
```text
.
├── android/ Android 工程与 Gradle 配置
├── assets/
│ ├── icon/ 启动图标
│ ├── images/ 本地图片
│ └── media/ 本地视频文件(当前未在 pubspec 声明)
├── integration_test/ 设备侧集成测试
├── ios/
│ ├── Flutter/ Flutter 生成配置与 SPM 临时包
│ ├── Runner/ iOS Runner
│ ├── Runner.xcodeproj/ Xcode 工程与共享 Scheme
│ └── RunnerTests/ iOS 原生测试
├── lib/
│ ├── core/
│ │ ├── config/ 地址、语言、运行时服务器设置
│ │ ├── data/ models、remote、repositories、services
│ │ ├── formatting/ 多语言文案、日期和错误文本
│ │ ├── platform/ 平台能力封装
│ │ ├── theme/ 颜色与 ThemeData
│ │ └── widgets/ 通用组件
│ ├── l10n/ ARB 与本地化生成代码
│ └── pages/ 业务页面
├── test/ 单元和 Widget 测试
├── docs/ 客户端任务与文件说明
├── pubspec.yaml 依赖、资源和 Flutter 配置
└── README.md 运行、接口与环境说明
```
## 关键文件
| 路径 | 职责 |
| --- | --- |
| `lib/main.dart` | 初始化 Flutter、屏幕方向、debug 服务器覆盖并启动 App |
| `lib/app.dart` | Provider、repository、controller、ApiClient 和主题装配 |
| `lib/core/config/app_config.dart` | 地址优先级、超时、媒体 URL 和平台默认地址 |
| `lib/core/config/server_endpoint.dart` | debug 运行时地址规范化、读取、保存和清除 |
| `lib/core/config/locale_controller.dart` | 语言选择与系统语言回退 |
| `lib/core/data/models/` | 账号、剧目、评论、观看、下载、公告等数据结构 |
| `lib/core/data/remote/` | `/app/**` 接口调用;`api_client.dart` 统一鉴权和错误映射 |
| `lib/core/data/repositories/` | HTTP 与内存实现的 repository 边界 |
| `lib/core/data/services/` | 页面 controller、播放会话、分享、画中画等业务服务 |
| `lib/core/formatting/` | 本地化内容、日期与错误文本 |
| `lib/core/platform/haptics.dart` | 可注入的触觉反馈封装 |
| `lib/core/theme/app_colors.dart` | 克莱因蓝和界面颜色 token |
| `lib/core/theme/app_theme.dart` | light/dark ColorScheme 与组件主题 |
| `lib/core/widgets/empty_state.dart` | 统一空列表占位 |
| `lib/core/widgets/remote_image.dart` | 后端相对图片地址与失败占位 |
| `lib/core/widgets/auth_gate.dart` | 未登录操作拦截 |
| `lib/core/widgets/download_action.dart` | 下载授权操作 |
| `lib/pages/home/` | 根页面、四个底部 tab 和抽屉 |
| `lib/pages/player/` | 竖屏播放、选集、进度和播放器交互 |
| `lib/pages/discover/` | 首页/发现信息流、轮播、分类与三列剧目网格 |
| `lib/pages/drama_detail/` | 剧目详情与剧集入口 |
| `lib/pages/auth/` | 登录/注册页面与表单逻辑 |
| `lib/pages/mine/` | 我的页、片单、设置、语言与 debug 地址入口 |
| `lib/pages/favorites/` | 收藏列表 |
| `lib/pages/watch_records/` | 独立观看记录页 |
| `lib/pages/downloads/` | 下载授权与策略页面 |
| `lib/pages/notices/` | 站内通知分页和详情 |
| `lib/pages/interaction/` | 举报弹窗 |
| `lib/l10n/*.arb` | en/zh/id 源文案,修改后执行 `flutter gen-l10n` |
| `ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme` | iOS SPM 预构建脚本 |
## 测试结构
| 目录 | 覆盖范围 |
| --- | --- |
| `test/auth/` | 登录 controller、表单、视觉与交互 |
| `test/catalog/`、`test/category/` | 首页数据、分类和模型解析 |
| `test/comment/`、`test/interaction/` | 评论、点赞、举报和弹窗 |
| `test/config/` | 三语、系统语言和运行时服务器地址 |
| `test/core/` | ApiClient、ID 解析、触觉、分享和画中画 |
| `test/discover/`、`test/home/` | 首页、轮播、网格和导航 |
| `test/download/`、`test/library/`、`test/watch/` | 下载、收藏、观看记录 |
| `test/drama_detail/`、`test/player/`、`test/playback/` | 详情、播放器与播放队列 |
| `test/notice/` | 通知分页、空态、详情与入口 |
| `test/empty_state/`、`test/theme/` | 空态组件与主题 token |
| `test/integration/` | 依赖本机后端的联调测试,服务未启动时跳过 |
| `integration_test/app_backend_test.dart` | 设备侧后端连通性测试 |
| `test/support/` | fake repository、HTTP adapter、播放器和测试数据 |
## 生成物
以下内容由工具生成,不要手工修改:
- `lib/l10n/app_localizations*.dart`
- `*.g.dart`
- `.dart_tool/`
- `build/`
- `ios/Flutter/ephemeral/`
- `ios/Runner/GeneratedPluginRegistrant.h`
- `ios/Runner/GeneratedPluginRegistrant.m`
`pubspec.lock` 由 Dart 包管理工具维护,应提交但不手工编辑。
+38
View File
@@ -0,0 +1,38 @@
# 客户端任务清单
状态按当前 `develop` 中已合入的功能整理。契约章节以
`FruitServer/docs/api-phase1.md` 为准;任务过程记录见
`FruitServer/docs/plans/PROGRESS.md`。
## K1-K13
| 批次 | 范围 | 状态 | 关键提交或契约章节 | 备注 |
| --- | --- | --- | --- | --- |
| K1 | 详情、播放票据、观看进度、续看、收藏 | 已完成并合入 | §1.3-§1.5 | 已有三态和基础页面 |
| K2 | 分类、观看记录、收藏列表、下载授权管理 | 已完成并合入 | §1.2、§1.5、§1.6 | 下载只管理授权,不落盘 |
| K3 | 评论、回复、点赞、举报、分享 | 已完成并合入 | §1.7 | 分享使用系统分享面板 |
| K4 | 账号剩余能力 | 未开始 | §1.1 | Google 登录所需凭据和契约范围需核对 |
| K5 | 克莱因蓝主题、印尼语适配 | 已完成并合入 | 无接口变更 | 三语为 en/zh/id |
| K6 | 登录页、底部导航、触觉反馈 | 已完成并合入 | 无接口变更 | 触觉通过 `Haptics` 封装 |
| K7 | 首页轮播、站内通知 | 已完成并合入 | §1.3、§1.9.2 | 通知无已读态 |
| K8 | 登录页视觉重设计 | 已完成并合入 | 无接口变更 | 保留原有登录逻辑和校验 |
| K9 | 首页全部剧目双列网格 | 已完成并合入 | 无接口变更 | 数据源为 feed 分类结果 |
| K10 | 统一空列表占位 | 已完成并合入 | 无接口变更 | 评论弹窗使用 compact 变体 |
| K11 | 首页三列、分类首位“全部” | 已完成并合入 | 无接口变更 | 网格比例保持 2:3 |
| K12 | 首页去标题、空态视觉重做 | 已完成并合入 | 无接口变更 | 双层同心圆空态 |
| K13 | debug 运行时服务器地址 | 已完成并合入 | 无接口变更 | 保存后重启生效,release 不开放 |
## 待办
| 事项 | 状态 | 依赖或说明 |
| --- | --- | --- |
| K4 账号剩余能力 | 待办 | Google 登录需要客户端凭据、平台配置和后端契约,范围需核对 |
| B1 支付与金币 | 待办 | 客户端尚未接入 §1.8 的支付/权益闭环,商品、渠道和验证方式需核对 |
| 搜索 | 待办 | 当前没有独立搜索接口,接口契约和数据范围需核对 |
| 下载落盘 | 待办 | 需要新增文件下载、进度持久化、续传、离线播放和本地清理设计 |
## 维护规则
- 新批次完成后更新本表,不写未经确认的提交号。
- 功能状态以当前 `develop` 代码和自动化测试为准。
- “需核对”表示产品范围、接口或外部凭据尚未确认,不能按已完成处理。
+125
View File
@@ -0,0 +1,125 @@
# 开发进度
## 2026-10-21 K96 剧场页服务端分类分页
- 已完整读取 K96 `docs/plans/INBOX.md`。
- 已从最新 `origin/develop` 创建 ReelShort `feat/k96-theater-feed`。
- 计划见 FruitServer `docs/plans/2026-10-21-K96-theater-feed.md`。
- 客户端将新增 TheaterFeedController,并让剧场「全部 / 分类」改用
`/app/feed` 服务端游标分页;不改首页 K94/K95 已交付逻辑。
- 已完成 `CatalogApi.feed` / `CatalogRepository.fetchFeed` 可选 `categoryId`,
非空才拼请求参数。
- 已新增 `TheaterFeedController`:按分类独立缓存,缓存先渲染后静默刷新,
10 秒超时、游标追加去重、失败保留旧数据、失败分类切回自动重试。
- 剧场页「全部」和分类 chips 已改用 theater feed;滚动剩余不足 400px 触发
`loadMore`,下拉刷新同时执行 categories 与 theater 刷新,搜索模式保持独立。
- 已补分类参数、缓存切换、分页去重、hasMore 停止、失败保留、失败重试、
分类点击请求和滚动加载 widget 测试。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:52 +553: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 24.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:静态分析零告警,553 项全量测试通过,debug APK 构建成功;
`pubspec.lock` 已还原,无依赖变更,未安装或操作真机。
## 2026-10-21 K97 修复 iOS 评论输入弹窗键盘避让
- 已完整读取 K97 `docs/plans/INBOX.md`。
- 已从最新 `origin/develop` 创建 `fix/k97-ios-comment-keyboard`。
- 计划见 FruitServer `docs/plans/2026-10-21-K97-ios-comment-keyboard.md`。
- Android 保留既有 pinned/channel 策略;iOS 与其他平台改用实时
`MediaQuery.viewInsets.bottom`,并补 iOS 键盘避让测试。
- 已完成 `_isAndroid` 平台分流;Android 的 channel、80ms 防抖和 pinned 逻辑保持不变,
iOS/其他平台直接读取实时 viewInsets,超过屏幕 60% 的异常值按 0 处理。
- 面板已使用 160ms `easeOutCubic` AnimatedPadding;Android 不包裹 SafeArea,
iOS/其他平台使用 `SafeArea(top: false)` 处理 home indicator。
- 已补 iOS insets=300/0 测试,发表按钮在键盘上方;Android pinned 既有用例全部通过。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:54 +555: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
$ flutter build ios --simulator --no-codesign
Xcode build done. 44.0s
✓ Built build/ios/iphonesimulator/Runner.app
```
解读:静态分析零告警,555 项全量测试通过,Android 与 iOS simulator 构建成功;
`pubspec.lock` 已还原,无依赖变更,未安装或操作真机。
## 2026-10-21 K97.1 剧场搜索框圆角改小
- 已从最新 `origin/develop` 创建 `fix/k97.1-theater-search-radius`。
- 仅将剧场搜索框圆角从 22 调整为 12,高度 44、颜色、聚焦态及
清空/识剧逻辑保持不变,并同步更新对应 widget 断言。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:55 +555: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 25.8s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:静态分析零告警,555 项全量测试通过,debug APK 构建成功;
`pubspec.lock` 已还原,无依赖变更,未安装或操作真机。
## 2026-10-21 K98 修复登录与手机号登录键盘遮挡
- 已完整读取 K98 `docs/plans/INBOX.md`。
- 已从最新 `origin/develop` 创建 `fix/k98-auth-keyboard`。
- 计划见 FruitServer `docs/plans/2026-10-21-K98-auth-keyboard.md`。
- 将统一 viewInsets/channel 有效键盘高度,并给登录页与手机号弹窗增加
焦点/键盘变化后的字段滚动校正。
- 已新增 `effectiveKeyboardInset`,兼容 iOS 实时 viewInsets 与 Android
`adjustNothing` 下的 MethodChannel 键盘高度。
- 登录/注册页已增加 ScrollController、notifier 监听和邮箱/密码焦点校正;
手机号弹窗已同样接入手机号/验证码框滚动校正。
- 已补 iOS 登录/注册、Android channel、手机号验证码框键盘避让测试。
门禁原始输出:
```text
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test --no-pub
00:52 +559: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.2s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:静态分析零告警,559 项全量测试通过,debug APK 构建成功;
`pubspec.lock` 已还原,无依赖变更,未安装或操作真机。
+74
View File
@@ -0,0 +1,74 @@
// Author: fruit.com.cn
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fruitshorts/app.dart';
import 'package:fruitshorts/core/config/app_config.dart';
import 'package:fruitshorts/core/data/remote/api_client.dart';
import 'package:fruitshorts/core/data/remote/catalog_api.dart';
import 'package:integration_test/integration_test.dart';
/// 设备侧集成测试:**在手机进程里**真实请求开发机上的 app-api。
///
/// 跑法(红线第 10 条要求的"设备侧取证"):
/// ```
/// IP=$(ipconfig getifaddr en0)
/// flutter test integration_test -d <device-id> --dart-define=API_BASE_URL=http://$IP:8081
/// ```
/// 断言失败时会把实际使用的地址一起打出来,便于区分"地址不对"还是"设备连不上"。
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
final baseUrl = AppConfig.apiBaseUrl;
testWidgets('should_fetch_home_feed_and_drama_detail_when_device_reaches_backend', (
tester,
) async {
debugPrint('[device] API_BASE_URL=$baseUrl');
final client = ApiClient(baseUrl: baseUrl);
addTearDown(client.close);
final api = CatalogApi(client);
final feed = await api.homeFeed();
expect(
feed.dramas,
isNotEmpty,
reason: '设备侧拿不到首页列表(API_BASE_URL=$baseUrl)',
);
debugPrint('[device] 首页分区=${feed.sections.length} 剧目=${feed.dramas.length}');
final card = feed.dramas.first;
expect(card.id, isNotEmpty, reason: '设备侧首页卡片 id 为空');
final detail = await api.dramaDetail(card.id);
expect(detail.id, card.id, reason: '详情返回的 id 与卡片不一致');
expect(
detail.episodes,
isNotEmpty,
reason: '设备侧拿到的详情没有剧集(dramaId=${card.id})',
);
debugPrint('[device] 详情 id=${detail.id} 剧集=${detail.episodes.length}');
});
testWidgets('should_render_home_drama_list_when_app_boots_on_device', (
tester,
) async {
// 用真 App(真网络、真目录控制器):首页底部标签栏出现即代表"剧目列表加载成功",
// 也就是用户在真机上遇到的那个「剧目列表加载失败」已经消失。
await tester.pumpWidget(const LumaDramaApp());
var loaded = false;
for (var attempt = 0; attempt < 60 && !loaded; attempt++) {
await tester.pump(const Duration(milliseconds: 500));
loaded = find.byKey(const Key('home-tabs-bar')).evaluate().isNotEmpty;
}
expect(
loaded,
isTrue,
reason: '首页 30 秒内没渲染出剧目列表(API_BASE_URL=$baseUrl)',
);
debugPrint('[device] 首页剧目列表已渲染:API_BASE_URL=$baseUrl');
});
}
-1
View File
@@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
-1
View File
@@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
-43
View File
@@ -1,43 +0,0 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
+3 -3
View File
@@ -360,7 +360,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -487,7 +487,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -538,7 +538,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -6,11 +6,27 @@
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<PreActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Bootstrap Flutter SPM Package"
scriptText = "#!/bin/sh&#10;set -e&#10;FLUTTER=&quot;&quot;&#10;if [ -n &quot;${FLUTTER_ROOT:-}&quot; ] &amp;&amp; [ -x &quot;$FLUTTER_ROOT/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;$FLUTTER_ROOT/bin/flutter&quot;&#10;elif FLUTTER=&quot;$(command -v flutter)&quot;; then&#10; :&#10;elif [ -x &quot;$HOME/flutter/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;$HOME/flutter/bin/flutter&quot;&#10;elif [ -x &quot;/opt/homebrew/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;/opt/homebrew/bin/flutter&quot;&#10;fi&#10;if [ -z &quot;$FLUTTER&quot; ]; then&#10; echo &quot;error: Flutter executable not found. Set FLUTTER_ROOT or add Flutter to PATH.&quot; &gt;&amp;2&#10; exit 1&#10;fi&#10;if [ -z &quot;${SRCROOT:-}&quot; ]; then&#10; echo &quot;error: SRCROOT is not set; cannot locate the Flutter project.&quot; &gt;&amp;2&#10; exit 1&#10;fi&#10;cd &quot;$SRCROOT/..&quot;&#10;&quot;$FLUTTER&quot; pub get&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</EnvironmentBuildable>
</ActionContent>
</ExecutionAction>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Prepare Flutter Framework Script"
scriptText = "/bin/sh &quot;$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh&quot; prepare&#10;">
scriptText = "#!/bin/sh&#10;set -e&#10;FLUTTER=&quot;&quot;&#10;if [ -n &quot;${FLUTTER_ROOT:-}&quot; ] &amp;&amp; [ -x &quot;$FLUTTER_ROOT/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;$FLUTTER_ROOT/bin/flutter&quot;&#10;elif FLUTTER=&quot;$(command -v flutter)&quot;; then&#10; :&#10;elif [ -x &quot;$HOME/flutter/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;$HOME/flutter/bin/flutter&quot;&#10;elif [ -x &quot;/opt/homebrew/bin/flutter&quot; ]; then&#10; FLUTTER=&quot;/opt/homebrew/bin/flutter&quot;&#10;fi&#10;if [ -z &quot;$FLUTTER&quot; ]; then&#10; echo &quot;error: Flutter executable not found. Set FLUTTER_ROOT or add Flutter to PATH.&quot; &gt;&amp;2&#10; exit 1&#10;fi&#10;FLUTTER_ROOT=&quot;$(cd &quot;$(dirname &quot;$FLUTTER&quot;)/..&quot; &amp;&amp; pwd -P)&quot;&#10;if [ -z &quot;${SRCROOT:-}&quot; ]; then&#10; echo &quot;error: SRCROOT is not set; cannot locate the Flutter project.&quot; &gt;&amp;2&#10; exit 1&#10;fi&#10;cd &quot;$SRCROOT&quot;&#10;&quot;$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh&quot; prepare&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
+1 -1
View File
@@ -10,7 +10,7 @@ final class RunnerFlutterViewController: FlutterViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .black
view.backgroundColor = UIColor(red: 16.0 / 255.0, green: 12.0 / 255.0, blue: 10.0 / 255.0, alpha: 1)
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1001 B

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 958 B

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 889 B

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Loaded 100 of 449 files, more files were not shown because too many files have changed in this diff. Show more