67 lines
2.4 KiB
Dart
67 lines
2.4 KiB
Dart
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/change_password_page.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<GoRouter>((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: '/change-password',
|
|
builder: (context, state) => const ChangePasswordPage(),
|
|
),
|
|
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']!),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
});
|