# Deep Voice Flutter 应用程序,使用 GetX 状态管理和依赖注入。 ## 项目目录结构 ``` lib/ ├─ core/ │ ├─ bindings/ # 全局或通用的 Bindings │ ├─ constants/ # 常量、枚举、Key、全局配置等 │ ├─ errors/ # 异常/错误处理相关 │ ├─ themes/ # 主题(Color, TextStyle 等) │ ├─ translations/ # 国际化、语言相关 │ ├─ utils/ # 通用工具类、Helper、扩展函数等 │ └─ widgets/ # 通用的无业务逻辑的Widgets │ ├─ data/ │ ├─ models/ # 数据模型(可与后端DTO对应) │ ├─ repositories/ # 数据仓库(实际操作数据 CRUD, 远程或本地) │ ├─ services/ # 第三方或原生平台封装,如网络请求、缓存、数据库等 │ └─ providers/ # 适配器层,比如把网络、数据库等转换为 Repository 可调用的接口 │ ├─ modules/ │ ├─ login/ │ │ ├─ controllers/ # GetX Controller │ │ ├─ views/ # 页面、Widget │ │ ├─ bindings/ # 该模块的 Bindings │ │ └─ ... # 其他文件 │ ├─ home/ │ │ ├─ controllers/ │ │ ├─ views/ │ │ ├─ bindings/ │ │ └─ ... │ └─ ... │ ├─ routes/ │ ├─ app_pages.dart # 定义所有页面的 Route 列表 │ └─ app_routes.dart # 定义路由常量或路由字符串 │ └─ main.dart # 程序入口 ``` ### 本地调试内购(IAP)流程 不需要真实购买即可在本地跑通前端内购流程: - 在项目根目录的环境变量文件(如 `.env`)里添加: ``` APP_IAP_MOCK=1 ``` - 作用:在 `PayService` 中启用“本地内购模拟”,调用 `processGooglePayment` 或 `processApplePayment` 会: - 立即触发“已发起内购(本地模拟)”; - 短暂延时后触发“支付处理中…(本地模拟)”; - 再触发“支付成功(本地模拟)”。 - 注意:该模式不依赖 Google Play / App Store 安装来源,也不会进行服务器收据校验,仅用于前端 UI 与状态机验证。 - 关闭模拟:将 `APP_IAP_MOCK` 移除或设为 `0/false`,恢复真实内购流程。