- outfit_provider:方案列表/生成任务轮询(pending→planning→scoring→rendering→done)/详情/选定主方案/收藏 - outfit_page:日期范围 + 地点生成表单,生成中显示任务进度,方案列表卡片 - plan_viewer_page:PageView 手指滑动切换方案,穿衣清单(衣橱/新品标记)、发型发色、设为主方案/收藏 - plan_effect_page:效果图 3 视角(正面/侧面/背面)查看 - avatar_viewer:three_dart + flutter_gl 3D 渲染实现(自动旋转),GLB 资产未接入时占位展示,kEnable3D 开关 - avatar_viewer_page:化身查看页 + 重新构建 - 新增 /plan-viewer /plan-effect /avatar-viewer 路由
98 lines
2.8 KiB
Dart
98 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
|
|
import 'features/auth/login_page.dart';
|
|
import 'features/commercial/commercial_page.dart';
|
|
import 'features/home/home_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_viewer_page.dart';
|
|
import 'features/profile/body_tune_page.dart';
|
|
import 'features/profile/photo_guide_page.dart';
|
|
import 'features/profile/profile_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);
|
|
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(
|
|
initialLocation: '/login',
|
|
routes: [
|
|
GoRoute(
|
|
path: '/login',
|
|
builder: (ctx, state) => const LoginPage(),
|
|
),
|
|
GoRoute(
|
|
path: '/home',
|
|
builder: (ctx, state) => const HomePage(),
|
|
),
|
|
GoRoute(
|
|
path: '/profile',
|
|
builder: (ctx, state) => const ProfilePage(),
|
|
),
|
|
GoRoute(
|
|
path: '/photo-guide',
|
|
builder: (ctx, state) => const PhotoGuidePage(),
|
|
),
|
|
GoRoute(
|
|
path: '/body-tune',
|
|
builder: (ctx, state) => const BodyTunePage(),
|
|
),
|
|
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: '/commercial',
|
|
builder: (ctx, state) => const CommercialPage(),
|
|
),
|
|
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(),
|
|
),
|
|
],
|
|
);
|
|
});
|