外观
核心页面详解
本页聚焦真正参与当前交付闭环的页面。每个页面至少说明:
- 页面入口
- 用户动作
- 数据来源 / 状态源
- 关键跳转
- 当前状态边界
截图用于识别页面布局与状态,表格用于定位代码入口、状态源和跳转结果。
1. 启动与鉴权
启动页 SplashScreen
| 项目 | 内容 |
|---|---|
| 入口 | MaterialApp.home |
| 作用 | App 启动时检查登录态,决定进入主页或登录页 |
| 状态源 | SplashBloc,状态为 initial / checking / resolved |
| 关键跳转 | home 或 login 两个目标,通过 Navigator.pushReplacement 分流 |
| 当前状态边界 | 只承担启动分流,不承载业务错误页 |
启动页不会让用户手动选择路径。它只读取登录态并替换当前路由:已登录进入主容器,未登录进入手机号输入页。
手机号输入页 PhoneInputScreen
| 项目 | 内容 |
|---|---|
| 入口 | 启动页未登录分支 |
| 主要功能 | 输入手机号、发送验证码、切换到密码登录 |
| 状态源 | AuthBloc |
| 关键动作 | 发送验证码成功后跳转 VerificationCodeScreen;可转到 PasswordLoginScreen |
| 页面状态 | 表单校验失败、发送中、发送成功、AuthError SnackBar |
手机号页承担鉴权分支选择。验证码发送成功后保留返回上一页的能力;密码登录作为并行分支进入独立页面,不改变手机号页自身状态。
验证码页 VerificationCodeScreen
| 项目 | 内容 |
|---|---|
| 入口 | 手机号输入页发送验证码成功后 |
| 主要功能 | 输入 6 位验证码、倒计时、重新发送、完成注册 |
| 状态源 | AuthBloc + 本地 5 分钟倒计时 |
| 关键动作 | 注册成功后进入 RegistrationSuccessScreen |
| 页面状态 | 倒计时中 / 可重发 / 验证中 / 注册成功 / AuthError |
验证码页有两个容易误读的点:倒计时是页面本地状态;注册成功后的成功页点击“开始使用”会进入建档流程。
密码登录页 PasswordLoginScreen
| 项目 | 内容 |
|---|---|
| 入口 | 手机号输入页“使用密码登录” |
| 主要功能 | 手机号 + 密码登录 |
| 状态源 | AuthBloc |
| 关键动作 | 登录成功后根据 healthInfoCompleted 决定去 HomeScreen 还是 OnboardingFlowScreen |
| 页面状态 | 表单校验失败、登录中、登录失败、登录成功后清空栈跳转 |
密码登录是当前最明确的建档分流入口。登录成功后使用 pushAndRemoveUntil 清空鉴权页面栈,避免用户从主页返回到登录页。
密码注册页 PasswordRegisterScreen
| 项目 | 内容 |
|---|---|
| 入口 | 密码登录页“创建新账户” |
| 主要功能 | 手机号密码注册、密码强度提示、创建账户 |
| 状态源 | AuthBloc |
| 关键动作 | 注册成功后清空栈进入 OnboardingFlowScreen |
| 页面状态 | 表单校验、密码强度反馈、提交中、错误提示 |
密码注册与短信验证码注册都会在注册完成后进入建档链路,但承接页面不同:密码注册直接进入 OnboardingFlowScreen,短信验证码注册先进入 RegistrationSuccessScreen,再由成功页进入 OnboardingFlowScreen。
2. 健康档案与资料
建档流程入口 OnboardingFlowScreen
| 项目 | 内容 |
|---|---|
| 入口 | 首次登录未完成健康信息;我的页编辑健康档案 |
| 主要功能 | 7 步完成或编辑健康档案 |
| 状态源 | OnboardingBloc,状态包括 initial / inProgress / saving / submitting / completed / error |
| 步骤结构 | 欢迎、基本信息、癌症档案、健康指标、疾病史、手术史、头像上传 |
| 页面状态 | 步骤切换、校验失败、保存中、提交中、错误提示 |
建档流程同时服务首次建档和个人中心编辑。首次建档完成后进入完成页;编辑模式保存成功后返回个人中心,并带回 saved / warning 结果供资料页刷新或提示。
首次建档页 OnboardingFlowScreen(基本信息步骤)
| 项目 | 内容 |
|---|---|
| 入口 | 建档流程第 2 步 |
| 主要功能 | 填写昵称、姓名、性别、生日、身份证等基本信息 |
| 状态源 | OnboardingBloc |
| 页面状态 | 分步校验、上一步 / 下一步切换 |
该步骤代表建档流程的真实表单密度:身份证、生日、性别等字段会参与分步校验,不能把建档理解成单页资料补充。
建档完成页 OnboardingCompleteScreen
| 项目 | 内容 |
|---|---|
| 入口 | 首次建档提交成功后 |
| 主要功能 | 展示建档完成结果、提示可用能力、进入主页 |
| 状态源 | 页面本地状态 + AuthApiClient.completeHealthInfo() |
| 关键动作 | 标记健康信息完成后清栈进入 HomeScreen |
完成页会尝试调用后端标记健康信息完成。当前实现即使标记调用失败,也会进入主页;这属于交接时需要关注的产品与数据一致性边界。
个人信息页 PersonalInfoScreen
| 项目 | 内容 |
|---|---|
| 入口 | 我的页 -> 个人信息 |
| 主要功能 | 查看和修改个人资料,返回后刷新 ProfileOverviewBloc |
| 数据来源 | ProfileOverviewBloc 相关资料与表单 |
| 关键动作 | 保存返回后刷新 profile overview |
个人信息页不是首次建档流程的一部分。它承接已登录用户的资料查看与局部编辑,返回后由上层个人中心触发 profile overview 刷新。
3. 主页与首页
主页框架 HomeScreen
| 项目 | 内容 |
|---|---|
| 入口 | 登录完成后的默认主容器 |
| 主要功能 | 承载底部 4 栏:首页 / AI助手 / 健身 / 我的 |
| 数据来源 / 状态源 | ProfileOverviewBloc、AssessmentOverviewBloc、PrescriptionBloc、ExerciseBloc |
| 关键动作 | 切回首页时触发 profile、assessment、prescription 刷新;切到健身时加载当前处方 |
| 页面特点 | 首页 tab 内部还有 首页 / 日历 顶层 tab |
主页框架有两层切换:底部四栏切主业务,首页内部 tab 切 Dashboard 与 Calendar。底部切换不压入新路由栈,因此用户在四个主业务页之间切换时不会形成详情页式返回链。
日历页 CalendarScreen
| 项目 | 内容 |
|---|---|
| 入口 | HomeScreen 顶层 tab 第二个 |
| 主要功能 | 按月查看运动记录,按日查看详情 |
| 状态源 | CalendarBloc |
| 关键动作 | 翻月加载月数据,选日期更新当天明细,下拉刷新 |
| 页面状态 | CalendarLoading / CalendarLoaded / CalendarError |
日历页属于首页栏内部页面。翻月和选日期会改变日历状态,但不会离开 HomeScreen 主容器。
4. AI 咨询
Chat 主界面 ChatScreen
| 项目 | 内容 |
|---|---|
| 入口 | 底部 AI助手 tab |
| 主要功能 | 消息列表、消息输入、生成运动康复方案、历史会话抽屉 |
| 状态源 | ChatBloc、PrescriptionBloc |
| 关键动作 | 处方生成后把处方卡以消息形式插入对话流 |
| 页面状态 | ChatLoading、ChatMessagesLoaded、ChatError、AI typing、处方生成中 |
Chat 页面同时承担问答和处方生成入口。生成处方不是简单跳转动作,而是通过 PrescriptionBloc 与对话流联动,结果以处方卡形式进入当前会话。
聊天历史页 ChatHistoryScreen
| 项目 | 内容 |
|---|---|
| 入口 | 命名路由 /chat/history |
| 主要功能 | 历史消息列表、空态、错误重试 |
| 状态源 | ChatBloc |
| 页面状态 | 加载中、空数据、错误、已加载 |
聊天历史有两种阅读入口:Chat 主界面内的历史会话抽屉,以及 /chat/history 命名路由。前者服务会话切换,后者服务独立历史页展示。
5. 运动中心
运动中心 ExerciseScreen
| 项目 | 内容 |
|---|---|
| 入口 | 底部 健身 tab |
| 主要功能 | 4 个 tab:我的计划 / 有氧运动 / 抗阻训练 / 柔韧训练 |
| 状态源 | ExerciseBloc |
| 数据来源 | 当前处方 + 静态动作库 |
| 关键动作 | 开始运动、恢复未完成运动、查看运动历史、无处方时跳到 AI 助手生成方案 |
| 页面状态 | ExerciseLoaded 为主,错误通过 SnackBar 提示 |
运动中心既展示当前处方,也包含静态动作库。点击动作前会检查是否存在未完成运动记录;存在时恢复上次执行,不存在时创建新的执行流程。
运动执行页 ExerciseExecutionScreen
| 项目 | 内容 |
|---|---|
| 入口 | 运动中心选择动作后进入 |
| 主要功能 | 视频或占位、计时、卡路里、暂停/继续、完成、退出确认 |
| 状态源 | ExerciseBloc |
| 关键动作 | 创建 active sport log、实时更新卡路里、保存运动日志、跳转反馈页 |
| 页面状态 | 未开始 / 进行中 / 暂停 / 保存完成 / 出错 |
执行页是运动闭环里最强状态页面。完成后会用 pushReplacement 进入反馈页,避免用户通过返回键回到已经结束的执行态。
运动反馈页 ExerciseFeedbackScreen
| 项目 | 内容 |
|---|---|
| 入口 | 运动执行完成后 |
| 主要功能 | 填写完成情况、感受反馈和备注 |
| 状态源 | ExerciseBloc 反馈提交流程 |
| 关键动作 | 提交反馈并完成本次运动闭环 |
反馈页提交成功后会展示已记录状态,并在短暂延迟后自动返回运动中心所在的主容器。提交失败时保留在当前页,便于用户重试或修改备注。
运动历史页 ExerciseHistoryScreen
| 项目 | 内容 |
|---|---|
| 入口 | 运动中心右上角历史按钮 |
| 主要功能 | 历史列表、下拉刷新、无限滚动、详情弹窗 |
| 状态源 | ExerciseHistoryBloc |
| 页面状态 | 加载中、空态、错误、有缓存结果的过渡态 |
运动历史页支持列表滚动、下拉刷新和详情弹窗。详情弹窗关闭只退出弹窗,不离开历史页。
6. 我的与设置
我的页 ProfilePage
| 项目 | 内容 |
|---|---|
| 入口 | 底部 我的 tab |
| 主要功能 | 资料概览、个人信息、健康档案、今日状态、设置、帮助、关于、退出登录 |
| 状态源 | ProfileOverviewBloc |
| 页面状态 | initial / loading / guest / loaded / error |
我的页是资料与配置入口,不是主业务执行页。个人信息、健康档案编辑和设置都会从这里进入;帮助、关于使用弹窗;退出登录会清 token 并清空栈回到手机号输入页。
设置页 SettingsScreen
| 项目 | 内容 |
|---|---|
| 入口 | 我的页 -> 设置 |
| 主要功能 | 通知、声音、振动、语言、字体大小、隐私、版本、帮助、反馈、用户协议 |
| 数据来源 | 本地 UserSettings state + SharedPreferences + PackageInfo |
| 当前状态边界 | 设置偏好保存到本地 fitdoc_user_settings;通知权限、账号安全等系统级能力仍需按具体平台能力接入 |
设置页当前以本地偏好为主,通知、声音、振动、语言和字体等设置会随页面操作写入本地存储。涉及系统权限、远端账号策略或隐私合规的能力,需要结合平台权限与后端策略继续接入。
7. 代码保留但入口隐藏的页面
健康总览 HealthOverviewScreen
| 项目 | 内容 |
|---|---|
| 当前状态 | 页面与路由仍存在,但当前入口已隐藏 |
| 主要功能 | 健康分数、陪伴状态、资料摘要、趋势图、推荐 |
| 状态源 | HealthOverviewBloc |
周报页 WeeklyReportScreen
| 项目 | 内容 |
|---|---|
| 当前状态 | 页面与路由仍存在,但当前入口已隐藏 |
| 主要功能 | 选择时间范围、生成周报、图表预览、导出与分享 |
| 状态源 | WeeklyReportBloc |
来源锚点
apps/flutter_app/lib/screens/splash/splash_screen.dartapps/flutter_app/lib/screens/registration/apps/flutter_app/lib/screens/onboarding/apps/flutter_app/lib/screens/home/apps/flutter_app/lib/screens/chat/apps/flutter_app/lib/screens/exercise/apps/flutter_app/lib/screens/profile/apps/flutter_app/lib/screens/settings/


















