import 'dart:async'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:redux/redux.dart'; import 'firesApp.dart'; import 'globals.dart' as globals; import 'models/appState.dart'; import 'models/firesApi.dart'; import 'redux/fetchDataMiddleware.dart'; import 'redux/reducers.dart'; import 'sentryReport.dart'; import 'utils/secret_loader.dart'; Future loadPackageInfo() async { final PackageInfo packageInfo = await PackageInfo.fromPlatform(); return packageInfo; } Future> loadSecrets() async { return SecretLoader( secretPath: globals.isDevelopment ? 'assets/private-settings-dev.json' : 'assets/private-settings.json') .load(); } Future mainCommon(List> otherMiddleware) async { WidgetsFlutterBinding.ensureInitialized(); // Initialize Firebase before any Firebase-dependent code runs await Firebase.initializeApp(); final GetIt getIt = GetIt.instance; getIt.registerSingleton(FiresApi()); loadPackageInfo().then((PackageInfo packageInfo) { globals.appVersion = packageInfo.version; loadSecrets().then((Map secrets) { final Store store = Store(appStateReducer, initialState: AppState( gmapKey: secrets['gmapKey'] as String, firesApiKey: secrets['firesApiKey'] as String, serverUrl: secrets['firesApiUrl'] as String, firesApiUrl: "${secrets['firesApiUrl'] as String}api/v1/"), middleware: List>.from(otherMiddleware) ..add(fetchDataMiddleware)); getIt.registerSingleton>(store); getIt.registerSingleton(store.state.firesApiUrl, instanceName: 'firesApiUrl'); getIt.registerSingleton(store.state.firesApiKey, instanceName: 'firesApiKey'); getIt.registerSingleton(store.state.serverUrl, instanceName: 'serverUrl'); getIt.registerSingleton(store.state.gmapKey, instanceName: 'gmapKey'); // https://flutter.io/cookbook/maintenance/error-reporting/ runZonedGuarded>(() async { runApp(FiresApp(store)); }, (Object error, StackTrace? stackTrace) { // Whenever an error occurs, call the `_reportError` function. This will send // Dart errors to our dev console or Sentry depending on the environment. reportError(error, stackTrace ?? StackTrace.current); }); // Listen to store changes, and re-render when the state is updated store.onChange.listen((AppState state) { // print('Store onChange'); }); FlutterError.onError = (FlutterErrorDetails details) { if (!useSentry) { // In development mode simply print to console. FlutterError.dumpErrorToConsole(details); } else { // In production mode report to the application zone to report to // Sentry. Zone.current.handleUncaughtError( details.exception, details.stack ?? StackTrace.current); } }; }); }); }