面向儿童的学习类应用,采用 Kotlin Multiplatform + Compose Multiplatform,一套 Kotlin 代码同时支持 Android / iOS。当前阶段为算术题练习,后续可扩展英语等模块。
| 层级 | 说明 |
|---|---|
| shared (commonMain) | 业务模型、难度规则、题目生成、判题逻辑、UI 状态、ViewModel(平台无关,无 Android/iOS API) |
| composeApp | 跨平台 UI(Compose Multiplatform)、应用入口 |
- UI:全部业务界面用 Compose Multiplatform 编写,不依赖 SwiftUI/UIKit 写业务 UI。
- 数据流:单向数据流,Event → ViewModel → State → UI。
| 界面 | 说明 |
|---|---|
| 主界面 (Main) | 显示「第 X / 总数 题」、题目表达式、答案输入框、计算器式数字键盘(0–9、清空、退格)、提交 / 下一题;做完本组后显示「本组已完成」与「再练一组」。 |
| 设置 (Settings) | 难度选择、每组题数、每道题倒计时等;顶部返回主界面。 |
- 主界面顶部可进入设置;设置内点击「返回」回到主界面。
- 主界面在手机为上下布局,在平板(宽屏)为左右分栏(题目区 + 键盘区)。
- 10 以内加法
- 10 以内加减法(结果不为负数)
- 100 以内加法
- 100 以内加减法(结果不为负数)
- 减法题由
ProblemGenerator保证结果非负(例如先选被减数再在合法范围内选减数)。
- 10 题 / 20 题 / 30 题 / 50 题
- 修改难度:保存新难度,并从第 1 题重新开始本组练习(用新难度出题)。
- 修改题数:保存新题数,并从第 1 题重新开始本组练习(用新题数作为本组总数)。
- 返回主界面后会看到更新后的题目与「第 1 / 新总数 题」,无需手动刷新。
- 题号:主界面显示「第 currentQuestionNumber / totalQuestions 题」。
- 单题流程:输入答案 → 提交 → 显示对/错 → 点击「下一题」进入下一题。
- 本组做完:当已做题目数达到本组题数时,进入「本组已完成」;点击「再练一组」从第 1 题重新开始(难度与题数沿用当前设置)。
状态集中在 AppState / ArithmeticState(shared),由 AppViewModel 统一处理事件并更新状态。
| 文件/目录 | 职责 |
|---|---|
shared/.../Difficulty.kt |
难度枚举(id、标题、数值范围、运算符、是否允许负数);byIdOrDefault 按 id 解析。 |
shared/.../ProblemGenerator.kt |
按难度随机生成题目(保证减法结果非负等)。 |
shared/.../ModuleDifficultySettings.kt |
设置数据:难度 id、每组题数、每道题倒计时等。 |
shared/.../AppViewModel.kt |
平台无关 ViewModel:处理导航、难度/题数变更(并重置会话)、输入、提交、下一题、再练一组等。 |
composeApp/.../AppRoot.kt |
根 Composable,根据 Screen 显示主界面、设置或做题记录。 |
composeApp/.../MainScreen.kt |
主界面:题号、题目、输入、键盘、提交/下一题/再练一组等。 |
composeApp/.../SettingsScreen.kt |
设置界面:难度、题数、每道题倒计时等;用固定 id 列表保证难度选项。 |
- ChangeDifficulty:更新难度 id,并重置算术会话(新会话从第 1 题开始,总题数为当前设置题数)。
- UpdateTotalQuestions:更新题数,并重置算术会话(新会话从第 1 题开始,总题数为新题数)。
- RestartSession:不改难度和题数,仅重新开始一组(从第 1 题开始)。
- 主界面始终从
state读取当前题号、总题数、题目、输入与对错结果,因此修改难度或题数后返回会自然「刷新」为新一轮练习。
以上即为当前项目的整体逻辑与行为约定。