{"id":26223433,"url":"https://github.com/swiftdo/xuezi","last_synced_at":"2026-04-19T20:38:37.585Z","repository":{"id":281484042,"uuid":"935852040","full_name":"swiftdo/xuezi","owner":"swiftdo","description":"成人文盲学字 app","archived":false,"fork":false,"pushed_at":"2025-03-31T13:26:47.000Z","size":548,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-26T09:34:58.594Z","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":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swiftdo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-20T05:54:32.000Z","updated_at":"2025-09-30T04:33:14.000Z","dependencies_parsed_at":"2025-03-09T12:36:50.702Z","dependency_job_id":null,"html_url":"https://github.com/swiftdo/xuezi","commit_stats":null,"previous_names":["swiftdo/xuezi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/swiftdo/xuezi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fxuezi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fxuezi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fxuezi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fxuezi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swiftdo","download_url":"https://codeload.github.com/swiftdo/xuezi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fxuezi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32022557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2025-03-12T17:33:41.559Z","updated_at":"2026-04-19T20:38:37.532Z","avatar_url":"https://github.com/swiftdo.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 学习 - Flutter 整洁架构实现\n\n这个项目是一个汉字学习应用，采用整洁架构（Clean Architecture）实现。项目展示了如何在 Flutter 应用中应用 SOLID 原则和依赖注入等最佳实践。\n\n## 文档\n\n- [快速开始指南](doc/guides/getting_started.md)\n- [架构设计文档](doc/architecture/clean_architecture.md)\n- [API 文档](doc/api/)\n\n## 主要功能\n\n- 汉字学习进度追踪\n- 个性化学习计划\n- 学习数据统计\n- 离线学习支持\n\n## 技术栈\n\n- Flutter\n- Bloc (状态管理)\n- GetIt (依赖注入)\n- ObjectBox (本地数据库)\n- Freezed (代码生成)\n\n## 项目结构\n\n```\nlib/\n├── core/           # 核心功能\n├── data/           # 数据层\n├── domain/         # 领域层\n├── infrastructure/ # 基础设施\n└── presentation/   # 表现层\n```\n\n## 快速开始\n\n1. 克隆项目\n```bash\ngit clone https://github.com/swiftdo/xuezi.git\ncd xuezi\n```\n\n2. 安装依赖\n```bash\nflutter pub get\n```\n\n3. 运行项目\n```bash\nflutter run\n```\n\n更多详细信息，请查看[快速开始指南](doc/guides/getting_started.md)。\n\n## 许可证\n\nMIT License - 详见 [LICENSE](LICENSE) 文件\n\n## 架构概述\n\n项目采用分层架构，从内到外分为以下几层：\n\n### 1. 领域层（Domain Layer）\n\n这是最内层，包含业务逻辑和规则。不依赖于任何外部框架。\n\n```\nlib/domain/\n├── entities/          # 业务实体\n│   └── learned_character.dart\n├── repositories/      # 仓库接口\n│   └── character_repository.dart\n└── usecases/         # 用例实现\n    ├── get_learned_characters.dart\n    └── save_learned_character.dart\n```\n\n- **实体（Entities）**：定义核心业务对象，如 `LearnedCharacter`\n- **仓库接口（Repository Interfaces）**：定义数据操作的抽象接口\n- **用例（Use Cases）**：实现具体的业务逻辑\n\n### 2. 数据层（Data Layer）\n\n负责实现领域层定义的仓库接口，处理数据持久化和外部数据访问。\n\n```\nlib/data/\n├── repositories/      # 仓库实现\n│   └── character_repository_impl.dart\n└── datasources/      # 数据源\n```\n\n- **仓库实现**：实现领域层定义的仓库接口\n- **数据源**：处理具体的数据访问逻辑\n\n### 3. 表现层（Presentation Layer）\n\n处理 UI 和用户交互，使用 BLoC 模式管理状态。\n\n```\nlib/presentation/\n├── bloc/             # 状态管理\n│   ├── character_bloc.dart\n│   ├── character_event.dart\n│   └── character_state.dart\n├── pages/           # 页面\n│   ├── home_page.dart\n│   └── character_detail_page.dart\n└── router/          # 路由配置\n    └── router.dart\n```\n\n- **BLoC**：使用 BLoC 模式处理业务逻辑和状态管理\n- **页面**：UI 实现\n- **路由**：处理页面导航\n\n### 4. 基础设施层（Infrastructure Layer）\n\n提供技术实现和外部服务集成。\n\n```\nlib/infrastructure/\n├── database/         # 数据库配置\n│   └── objectbox/\n└── services/         # 外部服务\n```\n\n- **数据库**：ObjectBox 配置和实现\n- **服务**：外部服务集成\n\n### 5. 核心层（Core Layer）\n\n包含共享的工具和配置。\n\n```\nlib/core/\n├── di/              # 依赖注入\n├── error/           # 错误处理\n├── usecase/         # 用例基类\n├── network/         # 网络相关\n└── theme/           # 主题配置\n```\n\n## 依赖注入\n\n使用 GetIt 和 Injectable 实现依赖注入，主要注册以下组件：\n\n```dart\nFuture\u003cvoid\u003e configureDependencies() async {\n  // 仓库\n  getIt.registerLazySingleton\u003cCharacterRepository\u003e(\n    () =\u003e CharacterRepositoryImpl(),\n  );\n\n  // 用例\n  getIt.registerLazySingleton(\n    () =\u003e GetLearnedCharacters(getIt()),\n  );\n  getIt.registerLazySingleton(\n    () =\u003e SaveLearnedCharacter(getIt()),\n  );\n\n  // BLoC\n  getIt.registerFactory(\n    () =\u003e CharacterBloc(\n      getLearnedCharacters: getIt(),\n      saveLearnedCharacter: getIt(),\n    ),\n  );\n}\n```\n\n## 状态管理\n\n使用 BLoC 模式管理状态，主要包含：\n\n- **事件（Events）**：触发状态变化的动作\n  - `started`：初始化加载\n  - `saved`：保存学习的汉字\n\n- **状态（States）**：应用的不同状态\n  - `initial`：初始状态\n  - `loading`：加载中\n  - `loaded`：加载完成\n  - `error`：错误状态\n\n## 错误处理\n\n使用 Either 类型处理错误，返回 `Either\u003cFailure, Success\u003e`：\n\n```dart\nFuture\u003cEither\u003cFailure, List\u003cLearnedCharacter\u003e\u003e\u003e getLearnedCharacters();\n```\n\n## 主要功能流程\n\n1. 用户打开应用\n   - 加载主页面\n   - BLoC 发送 `started` 事件\n   - 获取已学习的汉字列表\n\n2. 用户学习新汉字\n   - 进入详情页面\n   - 滑动卡片学习\n   - 保存学习记录\n   - BLoC 发送 `saved` 事件\n   - 更新已学习列表\n\n## 架构优势\n\n1. **可测试性**：\n   - 业务逻辑与 UI 分离\n   - 依赖倒置原则使得容易模拟依赖\n   - 清晰的用例边界便于单元测试\n\n2. **可维护性**：\n   - 关注点分离\n   - 清晰的依赖关系\n   - 模块化结构\n\n3. **可扩展性**：\n   - 易于添加新功能\n   - 易于更改实现细节\n   - 最小化修改影响范围\n\n4. **依赖规则**：\n   - 外层依赖内层\n   - 内层不知道外层的存在\n   - 依赖指向领域层\n\n## 使用的设计模式\n\n1. **仓库模式**：抽象数据访问\n2. **依赖注入**：管理依赖关系\n3. **BLoC 模式**：状态管理\n4. **工厂模式**：创建对象\n5. **策略模式**：数据源实现\n\n\n我们将功能分 4大模块，学习新知识、复习已经学过的知识、测验、然后统计分析。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fxuezi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswiftdo%2Fxuezi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fxuezi/lists"}