import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../core/app_keys.dart'; import '../features/auth/application/session_controller.dart'; import '../features/auth/presentation/login_page.dart'; import '../features/auth/presentation/register_page.dart'; import '../features/notice/presentation/notice_center_page.dart'; import '../features/order/presentation/order_detail_page.dart'; import 'tabs_page.dart'; /// 会话语义变化时驱动 go_router 重新执行 `redirect`。 class _SessionRefresh extends ChangeNotifier { void bump() => notifyListeners(); } /// 路由表,对应源 `pages.json` 的 5 个页面。 /// /// 除登录/注册外,其余页面统一使用主题里的 `CupertinoPageTransitionsBuilder` /// (新页面从右侧滑入),与源 `PageTransition.vue` 的表现一致。 final routerProvider = Provider((ref) { final refresh = _SessionRefresh(); ref.listen(sessionProvider, (_, _) => refresh.bump()); ref.onDispose(refresh.dispose); return GoRouter( navigatorKey: AppKeys.rootNavigator, initialLocation: '/login', refreshListenable: refresh, redirect: (context, state) { final loggedIn = ref.read(sessionProvider).isLoggedIn; final atAuth = state.matchedLocation == '/login' || state.matchedLocation == '/register'; if (!loggedIn) return atAuth ? null : '/login'; if (atAuth) return '/tabs'; return null; }, routes: [ GoRoute(path: '/login', builder: (context, state) => const LoginPage()), GoRoute( path: '/register', builder: (context, state) => const RegisterPage(), ), GoRoute(path: '/tabs', builder: (context, state) => const TabsPage()), // 消息中心:顶栏铃铛入口 GoRoute( path: '/notice', builder: (context, state) => const NoticeCenterPage(), ), // 订单详情:source 为 repair|install|maintenance|survey GoRoute( path: '/order/:source/:id', builder: (context, state) => OrderDetailPage( source: state.pathParameters['source']!, id: int.parse(state.pathParameters['id']!), ), ), ], ); });