import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_blue_plus_windows/flutter_blue_plus_windows.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forui/forui.dart'; import 'package:xiao_pet_tracker/app_router/app_router.dart'; import 'package:xiao_pet_tracker/bootstrap.dart'; import 'package:xiao_pet_tracker/l10n/l10n.dart'; class AppView extends StatefulWidget { const AppView({super.key}); @override State createState() => _AppState(); } class _AppState extends State { BluetoothAdapterState _adapterState = BluetoothAdapterState.unknown; late StreamSubscription _adapterStateStateSubscription; @override void initState() { super.initState(); _adapterStateStateSubscription = FlutterBluePlus.adapterState.listen((state) { _adapterState = state; if (mounted) { setState(() {}); } }); } @override void dispose() { _adapterStateStateSubscription.cancel(); super.dispose(); } @override Widget build(BuildContext context) { // Widget screen = _adapterState == BluetoothAdapterState.on // ? const HomePage() // : BluetoothOffScreen( // adapterState: _adapterState, // ); // only allow portrait orientations SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); return MaterialApp.router( title: 'Xiao Pet Tracker', localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], // localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, routerConfig: getIt().config(), theme: ThemeData(), darkTheme: ThemeData.dark(), builder: (context, child) => FTheme( data: MediaQuery.of(context).platformBrightness == Brightness.light ? FThemes.zinc.light : FThemes.zinc.dark, child: child!, ), ); } } // This observer listens for Bluetooth Off and dismisses the DeviceScreen class BluetoothAdapterStateObserver extends NavigatorObserver { StreamSubscription? _adapterStateSubscription; @override void didPush(Route route, Route? previousRoute) { super.didPush(route, previousRoute); if (route.settings.name == '/DeviceScreen') { // Start listening to Bluetooth state changes when a new route is pushed _adapterStateSubscription ??= FlutterBluePlus.adapterState.listen( (state) { if (state != BluetoothAdapterState.on) { // Pop the current route if Bluetooth is off navigator?.pop(); } }, ); } } @override void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); // Cancel the subscription when the route is popped _adapterStateSubscription?.cancel(); _adapterStateSubscription = null; } }