import 'dart:async'; import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/ui/common/utils/page_routes.dart'; class AppLogic { /// Indicates to the rest of the app that bootstrap has not completed. /// The router will use this to prevent redirects while bootstrapping. bool isBootstrapComplete = false; bool get isDesktopOrTablet => PlatformInfo.isDesktopOrWeb || deviceSize.shortestSide > 480; /// Support portrait and landscape on desktop, web and tablets. Stick to portrait for phones. /// A return value of null indicated both orientations are supported. Axis? get supportedOrientations => isDesktopOrTablet ? null : Axis.vertical; Size get deviceSize { final w = WidgetsBinding.instance.platformDispatcher.views.first; return w.physicalSize / w.devicePixelRatio; } /// Initialize the app and all main actors. /// Loads settings, sets up services etc. Future bootstrap() async { debugPrint('bootstrap app, deviceSize: $deviceSize, isTablet: $isDesktopOrTablet'); // Set min-sizes for desktop apps if (PlatformInfo.isDesktop) { await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize); } // Load any bitmaps the views might need await AppBitmaps.init(); // Set the initial supported orientations setDeviceOrientation(supportedOrientations); // Set preferred refresh rate to the max possible (the OS may ignore this) if (PlatformInfo.isAndroid) { await FlutterDisplayMode.setHighRefreshRate(); } // Settings await settingsLogic.load(); // Localizations await localeLogic.load(); // Wonders Data wondersLogic.init(); // Events timelineLogic.init(); // Collectibles await collectiblesLogic.load(); // Flag bootStrap as complete isBootstrapComplete = true; // Load initial view (replace empty initial view which is covered by a native splash screen) bool showIntro = settingsLogic.hasCompletedOnboarding.value == false; if (showIntro) { appRouter.go(ScreenPaths.intro); } else { appRouter.go(ScreenPaths.home); } } void setDeviceOrientation(Axis? axis) { final orientations = []; if (axis == null || axis == Axis.vertical) { orientations.addAll([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } if (axis == null || axis == Axis.horizontal) { orientations.addAll([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); } SystemChrome.setPreferredOrientations(orientations); } Future showFullscreenDialogRoute(BuildContext context, Widget child) async { return await Navigator.of(context).push( PageRoutes.dialog(child, $styles.times.pageTransition), ); } }