Files
slogan/app/lib/main.dart
T
2026-08-04 17:04:18 +08:00

114 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'core/auth/auth_provider.dart';
import 'shared/app_toast.dart';
import 'features/auth/login_page.dart';
import 'features/cps/cps_product_list_page.dart';
import 'features/cps/cps_provider.dart';
import 'features/home/home_page.dart';
import 'features/member/pay_page.dart';
import 'features/outfit/outfit_page.dart';
import 'features/outfit/outfit_provider.dart';
import 'features/outfit/plan_effect_page.dart';
import 'features/outfit/plan_viewer_page.dart';
import 'features/profile/avatar_build_flow_page.dart';
import 'features/profile/avatar_viewer_page.dart';
import 'features/wardrobe/wardrobe_page.dart';
import 'features/wardrobe/wardrobe_upload_page.dart';
void main() {
runApp(const ProviderScope(child: SloganApp()));
}
class SloganApp extends ConsumerWidget {
const SloganApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final router = ref.watch(routerProvider);
final auth = ref.watch(authProvider);
// 路由守卫:token 失效/登出 → 回登录页;token 有效且在登录页 → 进主框架
final path =
router.routerDelegate.currentConfiguration.uri.path;
final authed = auth.value?.authenticated ?? false;
if (!auth.isLoading) {
if (!authed && path != '/login') {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (context.mounted) router.go('/login');
});
} else if (authed && path == '/login') {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (context.mounted) router.go('/home');
});
}
}
return MaterialApp.router(
title: '我的形象穿搭',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF5C6BC0)),
useMaterial3: true,
appBarTheme: const AppBarTheme(centerTitle: true),
),
routerConfig: router,
);
}
}
/// 路由表:启动无 token 进登录页;有 token 进主框架
final routerProvider = Provider<GoRouter>((ref) {
return GoRouter(
navigatorKey: appNavigatorKey,
initialLocation: '/login',
routes: [
GoRoute(
path: '/login',
builder: (ctx, state) => const LoginPage(),
),
GoRoute(
path: '/home',
builder: (ctx, state) => const HomePage(),
),
GoRoute(
path: '/avatar-build',
builder: (ctx, state) => const AvatarBuildFlowPage(),
),
GoRoute(
path: '/wardrobe',
builder: (ctx, state) => const WardrobePage(),
),
GoRoute(
path: '/wardrobe-upload',
builder: (ctx, state) => const WardrobeUploadPage(),
),
GoRoute(
path: '/outfit',
builder: (ctx, state) => const OutfitPage(),
),
GoRoute(
path: '/pay',
builder: (context, state) => PayPage(args: state.extra! as PayArgs),
),
GoRoute(
path: '/plan-viewer',
builder: (ctx, state) => const PlanViewerPage(),
),
GoRoute(
path: '/plan-effect',
builder: (ctx, state) =>
PlanEffectPage(images: state.extra as List<PlanEffectImageInfo>),
),
GoRoute(
path: '/avatar-viewer',
builder: (ctx, state) => const AvatarViewerPage(),
),
GoRoute(
path: '/cps-product-list',
builder: (ctx, state) =>
CpsProductListPage(args: state.extra! as CpsListArgs),
),
],
);
});