{"id":18305113,"url":"https://github.com/openapphub/flutter-template","last_synced_at":"2025-04-09T10:41:44.004Z","repository":{"id":251943343,"uuid":"838891769","full_name":"openapphub/flutter-template","owner":"openapphub","description":"my  flutter template","archived":false,"fork":false,"pushed_at":"2024-08-11T15:42:39.000Z","size":323,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T04:43:55.026Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openapphub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-06T14:44:00.000Z","updated_at":"2024-08-11T15:42:43.000Z","dependencies_parsed_at":"2024-08-11T16:48:12.525Z","dependency_job_id":null,"html_url":"https://github.com/openapphub/flutter-template","commit_stats":null,"previous_names":["openapphub/flutter-template"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openapphub%2Fflutter-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openapphub%2Fflutter-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openapphub%2Fflutter-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openapphub%2Fflutter-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openapphub","download_url":"https://codeload.github.com/openapphub/flutter-template/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248023656,"owners_count":21035106,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T15:32:43.159Z","updated_at":"2025-04-09T10:41:43.983Z","avatar_url":"https://github.com/openapphub.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"```markdown\n# flutter-template\n\n我的 Flutter 模板项目结构。\n\n## 开始使用\n\n### 生成模型\n\n从 JSON 文件生成模型，使用以下命令：\n\n```sh\nget generate model on model with assets/models/user.json --skipProvider\n```\n\n从返回 JSON 的 URL 生成模型，使用：\n\n```sh\nget generate model on model from \"https://api.github.com/users/CpdnCristiano\"\n```\n\n### 添加提供者\n\n创建用于 API 调用的提供者，使用：\n\n```sh\nget create provider:api on data\n```\n\n### 国际化\n\n生成语言文件，使用：\n\n```sh\nget generate locales lib/lang\n```\n\n## 项目结构\n\n项目结构如下：\n\n```plaintext\n.\n├── app\n│   ├── data\n│   │   ├── model\n│   │   │   ├── login_req_model.dart\n│   │   │   └── login_res_model.dart\n│   │   ├── providers\n│   │   │   └── login_provider.dart\n│   │   └── repositories\n│   │       └── login_repository.dart\n│   ├── global_widgets\n│   │   ├── custom_bottom_nav_item.dart\n│   │   ├── custom_button.dart\n│   │   └── custom_text_field.dart\n│   ├── modules\n│   │   ├── home\n│   │   │   ├── home_binding.dart\n│   │   │   ├── home_controller.dart\n│   │   │   └── home_view.dart\n│   │   ├── login\n│   │   │   ├── login_binding.dart\n│   │   │   ├── login_controller.dart\n│   │   │   └── login_view.dart\n│   │   ├── main\n│   │   │   ├── main_binding.dart\n│   │   │   ├── main_controller.dart\n│   │   │   └── main_view.dart\n│   │   ├── profile\n│   │   │   ├── profile_binding.dart\n│   │   │   ├── profile_controller.dart\n│   │   │   └── profile_view.dart\n│   │   ├── root\n│   │   │   ├── root_binding.dart\n│   │   │   ├── root_controller.dart\n│   │   │   └── root_view.dart\n│   │   └── settings\n│   │       ├── settings_binding.dart\n│   │       ├── settings_controller.dart\n│   │       └── settings_view.dart\n│   └── routes\n│       ├── app_pages.dart\n│       └── app_routes.dart\n├── core\n│   ├── theme\n│   │   ├── app_themes.dart\n│   │   ├── color_schemes.dart\n│   │   ├── text_styles.dart\n│   │   └── theme_service.dart\n│   ├── translation\n│   │   └── translation_service.dart\n│   ├── utils\n│   │   └── helpers\n│   │       └── date_helper.dart\n│   └── values\n├── generated\n│   └── locales.g.dart\n├── infrastructure\n│   ├── navigation\n│   │   ├── navigation_controller.dart\n│   │   └── route_guards\n│   │       └── auth_guard.dart\n│   └── services\n│       ├── analytics\n│       ├── api\n│       │   ├── api_endpoints.dart\n│       │   ├── api_interceptors.dart\n│       │   └── api_service.dart\n│       ├── auth\n│       │   └── auth_service.dart\n│       ├── connectivity\n│       ├── logger\n│       │   └── log_service.dart\n│       ├── storage\n│       │   ├── storage_keys.dart\n│       │   └── storage_service.dart\n│       └── ui\n│           └── ui_service.dart\n├── initializer.dart\n├── lang\n│   ├── en_US.json\n│   └── zh_CN.json\n└── main.dart\n```\n\n### 目录说明\n\n- **app**: 包含主要应用程序代码。\n  - **data**: 处理数据模型、提供者和仓库。\n    - **model**: 数据模型如 `login_req_model.dart` 和 `login_res_model.dart`。\n    - **providers**: API 提供者如 `login_provider.dart`。\n    - **repositories**: 业务逻辑仓库如 `login_repository.dart`。\n  - **global_widgets**: 可重用的小部件如 `custom_button.dart`。\n  - **modules**: 功能模块如 `home`、`login`、`profile` 等。\n    - 每个模块包含 `binding`、`controller` 和 `view`。\n  - **routes**: 应用程序路由和页面配置。\n- **core**: 核心功能如主题、翻译、工具和值。\n  - **theme**: 应用程序主题和样式。\n  - **translation**: 国际化服务。\n  - **utils**: 辅助函数和工具。\n  - **values**: 常量值和配置。\n- **generated**: 自动生成的文件如语言翻译。\n- **infrastructure**: 基础设施服务如导航、API、认证等。\n  - **navigation**: 导航控制器和路由守卫。\n  - **services**: 各种服务如分析、API、认证、连接性、日志、存储和 UI。\n- **initializer.dart**: 应用程序初始化逻辑。\n- **lang**: 语言文件用于国际化。\n- **main.dart**: 应用程序的入口点。\n\n## 仓库模式的好处\n\n你询问了在 GetX 架构中引入仓库层的好处。以下是一些主要优势：\n\n1. **关注点分离**：\n   - **Controller**: 管理视图状态和用户交互。\n   - **Repository**: 处理业务逻辑和数据操作。\n   - **Provider**: 管理网络请求或数据源交互。\n\n2. **可测试性**：\n   - 将业务逻辑放在 Repository 中使得单元测试变得更加容易。\n   - 可以轻松模拟（mock）Repository 来测试 Controller。\n\n3. **代码复用**：\n   - 多个 Controller 可能需要相同的数据操作逻辑。将这些逻辑放在 Repository 中可以避免代码重复。\n\n4. **数据源抽象**：\n   - Repository 可以抽象化数据来源（API、本地数据库、缓存等），使 Controller 不需要关心数据的具体来源。\n\n5. **易于维护**：\n   - 当需要更改数据获取逻辑时，只需要修改 Repository，而不需要修改所有使用该数据的 Controller。\n\n6. **符合单一职责原则**：\n   - 每个类都有明确的职责，使代码结构更清晰。\n\n对于较大的项目，特别是涉及复杂的数据操作或多个数据源时，引入 Repository 层可以显著改善代码结构和可维护性。\n\n如果你需要进一步的解释或对特定场景的建议，请随时告诉我！\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenapphub%2Fflutter-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenapphub%2Fflutter-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenapphub%2Fflutter-template/lists"}