新增 SwiftUI 桥接层与单元测试,更新 Tab 图标资源命名和多倍图,同步调整 UI Test 的 Tab/扫码定位逻辑。 Co-authored-by: Cursor <cursoragent@cursor.com>
3.0 KiB
3.0 KiB
Main 模块业务逻辑
模块职责
Main 模块负责登录后的主界面 Tab 容器,以及当前尚未迁移页面的占位入口。
主界面由 MainTabsView 承载:
- 使用系统
TabView展示登录后的底部导航。 - 底部按顺序展示首页、订单、扫码、数据、我的五个入口。
- 扫码入口只负责打开扫码页,不属于
AppTab,也不持有独立业务导航栈。 - 每个 Tab 内部都包裹独立的
NavigationStack,并通过TabNavigationStackHost复用同一套导航构建逻辑。 - 每个 Tab 的导航路径由
AppRouter单独保存。 - 订单 Tab 角标由
MainTabBadgeViewModel提供,数量为 0 或获取失败时不显示。
Tab 结构
当前 Tab 来自 AppTab:
home:首页orders:订单statistics:数据profile:我的
HomeRootView 已接入真实的 HomeView,OrdersRootView 已接入真实的 OrdersView,StatisticsRootView 已接入真实的 StatisticsView,ProfileRootView 已接入真实的 ProfileView。
导航流程
MainTabsView从 Environment 读取AppRouter。TabView使用内部MainTabSelection作为选择值,普通 Tab 映射到AppTab,扫码映射到.scanner。- 普通 Tab 切换时调用
AppRouter.select(_:)更新当前业务 Tab。 - 每个普通 Tab 通过
TabNavigationStackHost创建自己的NavigationStack(path:)。 - 路径绑定来自
appRouter.binding(for:)。 - Tab 内页面需要进入尚未迁移的子页面时,通过当前 Tab 注入的
RouterPathpush 一个AppRoute.placeholder。 navigationDestination根据AppRoute展示详情页。- 子页面展示时读取
AppRoute.hidesTabBarWhenPushed,默认隐藏底部 TabBar。
扫码入口
扫码入口是系统 TabView 中的中间入口,只显示 qrcode.viewfinder 图标,并通过无障碍标签标记为“扫码核销”。
点击扫码入口时,MainTabsView 拦截 .scanner 选择并展示订单模块已有的 OrderScannerPage,不会修改 AppRouter.selectedTab。因此用户关闭扫码页后,仍停留在打开扫码前的 Tab。
扫码成功后调用 AppRouter.routeToOrderVerification(scannedCode:),订单页再通过 consumePendingOrderScanCode() 一次性消费结果。扫码失败时关闭扫码页并展示错误提示。
后续迁移规则
迁移新页面时:
- 优先替换对应 Tab 的 RootView。
- 保持每个 Tab 自己的
NavigationStack。 - 跨 Tab 跳转通过
AppRouter.select切换 Tab。 - 需要从首页或全局入口进入订单核销时,优先使用
AppRouter.selectOrders(entry:)或AppRouter.routeToOrderVerification(scannedCode:)。 - Tab 内跳转通过当前 Tab 的
RouterPath.navigate或扩展后的AppRoute处理。 - 普通业务子页面默认隐藏 TabBar;只有确有产品需求时,才在
AppRoute策略中单独放开。 - 不要把扫码入口加入
AppTab;它不是业务 Tab,只是主界面的全局动作入口。 - 真实业务页面接入后,应同步补充该模块文档和单元测试。