Skip to content

主流程与跳转关系

本页集中说明用户从启动到核心业务闭环的主流程,以及当前代码里的主要跳转方式。当前导航真相源仍然是 MaterialApp + routes + onGenerateRoute + Navigator,不是 GoRouter

主流程图

mermaid
flowchart LR
  Splash["启动检查\nSplashScreen"] --> Access["登录或注册\nAuth flow"]
  Access --> Profile["建档分流\nprofile gate"]
  Profile --> Home["主容器\nHomeScreen"]
  Home --> Tabs["主功能入口\nDashboard / Chat / Exercise / Profile"]

导航骨架

层级当前实现说明
App 默认入口home: SplashScreen()启动后先检查登录态
命名路由/splash /home /chat /chat/history /registration /onboarding /health-overview /weekly-reportMaterialApp.routes 中定义
兜底路由onGenerateRoute当前对 /health-overview/weekly-report/chat/history 指定转场
主业务容器HomeScreen底部 4 栏 + 首页内部双 tab
跨页跳转Navigator.push / pushReplacement / pushAndRemoveUntil + AppTransitions.*大量细节页使用自定义转场

跳转类型

类型表现典型位置交接关注点
路由替换当前页被新页替换,返回键不回到原页SplashScreen、注册成功、建档完成用于分流或流程收口,避免回到过期状态
清栈跳转清空历史栈后进入目标页密码登录成功、退出登录决定用户能否回到鉴权页或主页前状态
详情推进保留上一页,进入详情或执行页密码登录、个人信息、设置、运动执行、运动历史需要确认返回后是否刷新上层状态
容器切页不创建新路由,只改当前 tab index底部四栏、首页/日历、Dashboard 处方卡读者不能把它误读成独立页面跳转
弹窗 / 抽屉不离开当前页面,只覆盖局部交互层Chat 会话删除、帮助/关于、退出确认、Chat 历史抽屉不应在页面索引中当作独立页面

关键跳转表

FromActionTo当前实现备注
SplashScreenSplashRouteTarget.homeHomeScreenNavigator.pushReplacement(MaterialPageRoute)启动页分流到主页
SplashScreenSplashRouteTarget.loginPhoneInputScreenNavigator.pushReplacement(MaterialPageRoute)启动页分流到登录
PhoneInputScreen验证码发送成功VerificationCodeScreenNavigator.push(AppTransitions.pushDetail(...))保留返回上一步能力
PhoneInputScreen点击密码登录PasswordLoginScreenNavigator.push(AppTransitions.pushDetail(...))鉴权分支切换
VerificationCodeScreen注册成功RegistrationSuccessScreenNavigator.pushReplacement(...)进入注册成功页
RegistrationSuccessScreen点击开始使用OnboardingFlowScreenNavigator.pushAndRemoveUntil(MaterialPageRoute)短信验证码注册分支进入建档
PasswordRegisterScreen注册成功OnboardingFlowScreenNavigator.pushAndRemoveUntil(MaterialPageRoute)密码注册分支进入建档
PasswordLoginScreen登录成功且已完成建档HomeScreenpushAndRemoveUntil(AppTransitions.fade(...))清空栈进入主页
PasswordLoginScreen登录成功但未完成建档OnboardingFlowScreenpushAndRemoveUntil(AppTransitions.fade(...))首次建档入口
OnboardingFlowScreen首次建档完成OnboardingCompleteScreenpushReplacement(MaterialPageRoute)完成后再回主页
OnboardingFlowScreen(isEditMode: true)编辑档案保存成功ProfilePageNavigator.pop({'saved': true, ...})返回后刷新个人资料概览
ProfilePage编辑健康档案OnboardingFlowScreen(isEditMode: true)Navigator.push(AppTransitions.pushDetail(...))编辑模式复用建档流程
HomeScreen点击底部 AI助手ChatScreen底部导航切 tab非独立 push
HomeScreen点击底部 健身ExerciseScreen底部导航切 tab非独立 push
HomeScreen点击底部 我的ProfilePage底部导航切 tab非独立 push
HomeScreen首页顶部 日历 tabCalendarScreenTabBarView 切页仍处于首页栏内部
Dashboard处方卡 开始运动ExerciseScreen通过 navigateToTab(2)直接切到底部健身 tab
Dashboard处方卡 生成处方ChatScreen通过 navigateToTab(1)跳到 Chat 生成方案
ExerciseScreen点击某动作开始ExerciseExecutionScreenNavigator.push(AppTransitions.pushDetail(...))进入执行页
ExerciseExecutionScreen退出确认ExerciseScreenNavigator.pop回到运动中心
ExerciseExecutionScreen运动完成ExerciseFeedbackScreenNavigator.pushReplacement(MaterialPageRoute)执行页被反馈页替换
ExerciseFeedbackScreen反馈提交成功ExerciseScreenNavigator.popUntil((route) => route.isFirst)自动返回主容器
ExerciseScreen点击历史按钮ExerciseHistoryScreenNavigator.push(AppTransitions.pushDetail(...))进入历史页
ExerciseHistoryScreen关闭详情弹窗当前历史页Navigator.pop只关闭弹窗,不离开历史页
ProfilePage点击个人信息PersonalInfoScreenNavigator.push(AppTransitions.pushDetail(...))返回后刷新 profile overview
ProfilePage点击设置SettingsScreenNavigator.push(AppTransitions.pushDetail(...))设置页是独立详情页
ProfilePage点击帮助 / 关于弹窗showDialog不进入独立页面
ProfilePage退出登录PhoneInputScreenpushAndRemoveUntil(AppTransitions.fade(...))清空栈回登录

分阶段理解

1. 启动与鉴权

这一阶段决定用户进入系统后的第一条路径。

  • SplashScreen 先判断登录态。
  • 未登录用户进入 PhoneInputScreen,可继续走短信验证码分支,也可切到 PasswordLoginScreen
  • 短信验证码注册成功后进入 RegistrationSuccessScreen,点击“开始使用”进入 OnboardingFlowScreen
  • 密码登录成功后按 healthInfoCompleted 分流:已建档进入 HomeScreen,未建档进入 OnboardingFlowScreen
  • 密码注册成功后直接进入 OnboardingFlowScreen
手机号输入页
鉴权入口示意

2. 建档

建档阶段决定健康资料如何进入主业务容器。

  • 密码注册或未建档密码登录会进入首次建档流程。
  • 已登录用户从个人中心编辑健康档案时复用同一套 OnboardingFlowScreen,但使用 isEditMode=true
  • 首次建档完成后进入 OnboardingCompleteScreen,再清栈进入 HomeScreen
  • 编辑模式保存成功后 pop 回个人中心,并刷新 ProfileOverviewBloc
健康档案入口页
建档流程入口示意

3. 主页与主业务容器

主业务容器同时处理底部主导航和首页内部切换。

  • 底部四栏是 首页 / AI助手 / 健身 / 我的,通过 _selectedIndex 切换,不创建新路由栈。
  • 首页栏内部再由 TabBar + TabBarView 切换 首页 / 日历
  • 切回首页时会刷新 profile、assessment、prescription;切到健身时会加载当前处方。
  • DashboardPage 的处方卡通过 navigateToTab(1/2) 切到 Chat 或 Exercise。
主页框架
主页框架与双层导航示意

4. AI 咨询与处方

AI 咨询阶段把问答、处方生成和运动入口连接在同一条业务链上。

  • Chat 主界面位于底部 AI助手 tab,不是独立详情页。
  • 历史会话既可以通过 Chat 内部抽屉访问,也保留 /chat/history 命名路由;抽屉服务会话切换,历史页服务独立列表阅读。
  • 会话删除使用 showDialog 确认,不离开 Chat 当前页面。
  • 处方生成结果会进入对话流,并作为后续运动中心执行的来源之一。
  • Dashboard 中无处方时,处方卡把用户切到 Chat 生成方案;已有处方时,处方卡把用户切到 Exercise 执行。

5. 运动执行闭环

运动阶段把计划转成一次可记录的执行闭环。

  • 运动中心有 我的计划 / 有氧运动 / 抗阻训练 / 柔韧训练 四个 tab。
  • 点击动作后,页面会先检查是否存在进行中的运动记录;存在时恢复执行,不存在时新建执行。
  • 执行页完成后用 pushReplacement 进入反馈页,避免用户回退到已完成的执行态。
  • 反馈提交成功后自动回到主容器;运动历史页用于查看列表和详情弹窗。
运动中心页
执行闭环起点示意

6. 我的与设置

个人中心聚合资料、设置和账号退出动作。

  • ProfilePage 是个人资料、健康档案、今日状态、设置与退出登录的聚合入口。
  • PersonalInfoScreenSettingsScreen 都从这里以详情页方式推进。
  • 健康档案编辑从这里进入 OnboardingFlowScreen(isEditMode: true),保存后回到个人中心刷新资料。
  • 帮助与关于使用弹窗呈现,不是独立页面;设置页中的关于信息同样以对话框承载。
  • 退出登录先弹出确认框,确认后清理本地 token 和相关 BLoC 状态,并清空栈回到 PhoneInputScreen

7. 当前不属于主链入口的页面

  • HealthOverviewScreen
  • WeeklyReportScreen

这两个页面在代码中仍保留路由与实现,但当前入口已隐藏,因此不作为现阶段主链页面理解。

来源锚点

  • Flutter entry:apps/flutter_app/lib/main.dart
  • Splash:apps/flutter_app/lib/screens/splash/splash_screen.dart
  • Auth:apps/flutter_app/lib/screens/registration/phone_input_screen.dart
  • Password login:apps/flutter_app/lib/screens/auth/password_login_screen.dart
  • Home:apps/flutter_app/lib/screens/home/home_screen.dart
  • Exercise:apps/flutter_app/lib/screens/exercise/exercise_screen.dart