import 'package:provider/provider.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; import 'auth/custom_auth/auth_util.dart'; import 'auth/custom_auth/custom_auth_user_provider.dart'; import 'flutterlib/flutter_theme.dart'; import 'flutterlib/flutter_util.dart'; import 'flutterlib/internationalization.dart'; import 'flutterlib/nav/nav.dart'; import 'index.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); usePathUrlStrategy(); await FlutterTheme.initialize(); await authManager.initialize(); await FFLocalizations.initialize(); final appState = FFAppState(); // Initialize FFAppState await appState.initializePersistedState(); runApp(ChangeNotifierProvider( create: (context) => appState, child: MyApp(), )); } class MyApp extends StatefulWidget { // This widget is the root of your application. @override State createState() => _MyAppState(); static _MyAppState of(BuildContext context) => context.findAncestorStateOfType<_MyAppState>()!; } class _MyAppState extends State { Locale? _locale = FFLocalizations.getStoredLocale(); ThemeMode _themeMode = FlutterTheme.themeMode; late Stream userStream; late AppStateNotifier _appStateNotifier; late GoRouter _router; @override void initState() { super.initState(); _appStateNotifier = AppStateNotifier.instance; _router = createRouter(_appStateNotifier); userStream = numstationAuthUserStream() ..listen((user) => _appStateNotifier.update(user)); Future.delayed( Duration(milliseconds: 1000), () => _appStateNotifier.stopShowingSplashImage(), ); } void setLocale(String language) { setState(() => _locale = createLocale(language)); FFLocalizations.storeLocale(language); } void setThemeMode(ThemeMode mode) => setState(() { _themeMode = mode; FlutterTheme.saveThemeMode(mode); }); @override Widget build(BuildContext context) { return MaterialApp.router( title: 'Numstation', localizationsDelegates: [ FFLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], locale: _locale, supportedLocales: const [ Locale('en'), Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), ], theme: ThemeData( brightness: Brightness.light, scrollbarTheme: ScrollbarThemeData(), ), darkTheme: ThemeData( brightness: Brightness.dark, scrollbarTheme: ScrollbarThemeData(), ), themeMode: _themeMode, routerConfig: _router, ); } }