// ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:window_manager/window_manager.dart' hide WindowCaption; import 'widgets/widgets.dart' show WindowCaption; import 'providers/providers.dart'; import 'extensions/extensions.dart'; import 'screens/screens.dart'; import 'consts.dart'; class App extends ConsumerStatefulWidget { const App({super.key}); @override ConsumerState createState() => _AppState(); } class _AppState extends ConsumerState with WindowListener { @override void initState() { super.initState(); windowManager.addListener(this); _init(); } @override void dispose() { windowManager.removeListener(this); super.dispose(); } void _init() async { // Add this line to override the default close handler await windowManager.setPreventClose(true); setState(() {}); } @override void onWindowResized() { windowManager.getSize().then((value) { ref.read(settingsProvider.notifier).update(size: value); }); windowManager.getPosition().then((value) { ref.read(settingsProvider.notifier).update(offset: value); }); } @override void onWindowMoved() { windowManager.getPosition().then((value) { ref.read(settingsProvider.notifier).update(offset: value); }); } @override void onWindowClose() async { bool isPreventClose = await windowManager.isPreventClose(); if (isPreventClose) { if (ref.watch( settingsProvider.select((value) => value.promptBeforeClosing)) && ref.watch(hasUnsavedChangesProvider)) { showDialog( context: context, builder: (_) => AlertDialog( title: const Text('Save Changes'), content: const Text('Want to save changes before you close API Dash?'), actions: [ OutlinedButton( child: const Text('No'), onPressed: () async { Navigator.of(context).pop(); await windowManager.destroy(); }, ), FilledButton( child: const Text('Save'), onPressed: () async { await ref .read(collectionStateNotifierProvider.notifier) .saveData(); Navigator.of(context).pop(); await windowManager.destroy(); }, ), ], ), ); } else { await windowManager.destroy(); } } } @override Widget build(BuildContext context) { return context.isMediumWindow ? const MobileDashboard() : const Dashboard(); } } class DashApp extends ConsumerWidget { const DashApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final isDarkMode = ref.watch(settingsProvider.select((value) => value.isDark)); return Portal( child: MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( fontFamily: kFontFamily, fontFamilyFallback: kFontFamilyFallback, colorSchemeSeed: kColorSchemeSeed, useMaterial3: true, brightness: Brightness.light, visualDensity: VisualDensity.adaptivePlatformDensity, ), darkTheme: ThemeData( fontFamily: kFontFamily, fontFamilyFallback: kFontFamilyFallback, colorSchemeSeed: kColorSchemeSeed, useMaterial3: true, brightness: Brightness.dark, visualDensity: VisualDensity.adaptivePlatformDensity, ), themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light, home: Stack( children: [ !kIsLinux && !kIsMobile ? const App() : context.isMediumWindow ? const MobileDashboard() : const Dashboard(), if (kIsWindows) SizedBox( height: 29, child: WindowCaption( backgroundColor: Colors.transparent, brightness: isDarkMode ? Brightness.dark : Brightness.light, ), ), ], ), ), ); } }