83 lines
2.4 KiB
Dart
83 lines
2.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'auth/auth_screen.dart';
|
|
import 'auth/session_store.dart';
|
|
import 'camera/camera_screen.dart';
|
|
import 'container.dart';
|
|
import 'home/home_screen.dart';
|
|
import 'legal/terms_screen.dart';
|
|
import 'payment/paywall_screen.dart';
|
|
|
|
class ObserverApp extends StatelessWidget {
|
|
final AppContainer container;
|
|
|
|
const ObserverApp({super.key, required this.container});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MultiProvider(
|
|
providers: [
|
|
Provider.value(value: container),
|
|
Provider.value(value: container.sessionStore),
|
|
ChangeNotifierProvider.value(value: container.authViewModel),
|
|
ChangeNotifierProvider.value(value: container.homeViewModel),
|
|
ChangeNotifierProvider.value(value: container.paywallViewModel),
|
|
],
|
|
child: MaterialApp(
|
|
title: '视野',
|
|
theme: ThemeData(
|
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.green),
|
|
),
|
|
initialRoute: '/gate',
|
|
routes: {
|
|
'/gate': (_) => const StartupGate(),
|
|
'/terms': (_) => const TermsScreen(),
|
|
'/login': (_) => const AuthScreen(),
|
|
'/home': (_) => const HomeScreen(),
|
|
'/paywall': (_) => const PaywallScreen(),
|
|
'/camera': (_) => const CameraScreen(),
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 启动门卫:无登录 token → 登录页;已登录 → 主界面(到期状态由主界面展示)
|
|
class StartupGate extends StatefulWidget {
|
|
const StartupGate({super.key});
|
|
|
|
@override
|
|
State<StartupGate> createState() => _StartupGateState();
|
|
}
|
|
|
|
class _StartupGateState extends State<StartupGate> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_check();
|
|
}
|
|
|
|
Future<void> _check() async {
|
|
// 首次启动强制协议;同意后不再展示(拒绝则退出应用)
|
|
final accepted = await TermsScreen.readAccepted();
|
|
if (!mounted) return;
|
|
if (accepted != '1') {
|
|
Navigator.of(context).pushReplacementNamed('/terms');
|
|
return;
|
|
}
|
|
final session = context.read<SessionStore>();
|
|
final token = await session.readToken();
|
|
if (!mounted) return;
|
|
Navigator.of(context)
|
|
.pushReplacementNamed(token == null ? '/login' : '/home');
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return const Scaffold(
|
|
body: Center(child: CircularProgressIndicator()),
|
|
);
|
|
}
|
|
}
|