Files
flutterApp/lib/core/router/app_router.dart

76 lines
2.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:go_router/go_router.dart';
import 'package:maibu_satabot_v2/core/router/route_paths.dart';
import 'package:maibu_satabot_v2/features/ai/presentation/routes/ai_routes.dart';
import 'package:maibu_satabot_v2/features/auth/presentation/pages/login_page.dart';
import 'package:maibu_satabot_v2/features/auth/presentation/routes/auth_routes.dart';
import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart';
import 'package:maibu_satabot_v2/features/home/presentation/routes/home_routes.dart';
import 'package:maibu_satabot_v2/features/my/presentation/routes/my_routes.dart';
import '../../features/auth/presentation/bloc/auth_cubit.dart';
import '../../features/auth/presentation/bloc/auth_state.dart';
import '../../features/machine_details/presentation/pages/machine_details_page.dart';
import '../../features/main_container/presentation/main_wrapper.dart';
import 'go_router_refresh_stream.dart';
GoRouter createRouter(AuthCubit authCubit) {
return GoRouter(
initialLocation: RoutePaths.login,
refreshListenable: GoRouterRefreshStream(authCubit.stream),
redirect: (context, state) {
final loggedIn = authCubit.state is AuthAuthenticated;
final loggingIn = state.matchedLocation == RoutePaths.login;
if (!loggedIn && !loggingIn) {
return RoutePaths.login;
}
if (loggedIn && loggingIn) {
return RoutePaths.home;
}
return null;
},
routes: [
// 注册 machineDetails 路由
GoRoute(
path: RoutePaths.machineDetails,
name: 'machineDetails', // 建议加 name,方便跳转
builder: (context, state) {
// 从 extra 中取出设备数据(核心)
final DeviceEntity? device = state.extra as DeviceEntity?;
// 跳转到详情页组件,并传入设备数据
return MachineDetailsPage(device: device);
},
),
// 注册登录注册 路由
GoRoute(
path: RoutePaths.login,
builder: (context, state) => const LoginPage(),
),
// 1. 外部路由(无底部导航栏)
...AuthRoutes.routes,
...HomeRoutes.routes,
...AiRoutes.routes,
...MyRoutes.routes,
// 2. 内部路由(带底部导航栏的容器)
StatefulShellRoute.indexedStack(
builder: (context, state, navigationShell) {
// 返回我们定义的 MainWrapper
return MainWrapper(navigationShell: navigationShell);
},
branches: [
// 拿一级页面
HomeRoutes.branch,
AiRoutes.branch,
MyRoutes.branch,
],
),
],
);
}