Files
observer/flutter_app/lib/app.dart
T
2026-08-24 13:45:14 +08:00

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()),
);
}
}