102 lines
3.1 KiB
Dart
102 lines
3.1 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.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/home/view/home_page.dart';
|
|
import 'package:xiao_pet_tracker/l10n/l10n.dart';
|
|
import 'package:xiao_pet_tracker/screens/bluetooth_off_screen.dart';
|
|
|
|
class AppView extends StatefulWidget {
|
|
const AppView({super.key});
|
|
|
|
@override
|
|
State<AppView> createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends State<AppView> {
|
|
BluetoothAdapterState _adapterState = BluetoothAdapterState.unknown;
|
|
|
|
late StreamSubscription<BluetoothAdapterState> _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,
|
|
);
|
|
|
|
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<AppRouter>().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<BluetoothAdapterState>? _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;
|
|
}
|
|
}
|