import 'dart:async'; import 'package:aitrainer_app/view/account.dart'; import 'package:aitrainer_app/view/customer_bodytype_page.dart'; import 'package:aitrainer_app/view/customer_fitness_page.dart'; import 'package:aitrainer_app/view/customer_goal_page.dart'; import 'package:aitrainer_app/view/customer_modify_page.dart'; import 'package:aitrainer_app/view/customer_new_page.dart'; import 'package:aitrainer_app/view/customer_welcome_page.dart'; import 'package:aitrainer_app/view/gdpr.dart'; import 'package:aitrainer_app/view/login.dart'; import 'package:aitrainer_app/view/exercise_new_page.dart'; import 'package:aitrainer_app/view/exercise_type_modify_page.dart'; import 'package:aitrainer_app/view/exercise_type_new_page.dart'; import 'package:aitrainer_app/view/menu_page.dart'; import 'package:aitrainer_app/view/registration.dart'; import 'package:aitrainer_app/view/settings.dart'; import 'package:aitrainer_app/viewmodel/customer_changing_view_model.dart'; import 'package:aitrainer_app/viewmodel/exercise_changing_view_model.dart'; import 'package:aitrainer_app/widgets/home.dart'; import 'package:aitrainer_app/widgets/loading.dart'; import 'package:flutter/material.dart'; import 'package:aitrainer_app/view/customer_list_page.dart'; import 'package:aitrainer_app/view/exercise_type_list_page.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:aitrainer_app/localization/app_localization.dart'; import 'package:sentry/sentry.dart'; final SentryClient _sentry = new SentryClient(dsn: 'https://5fac40cbfcfb4c15aa80c7a8638d7310@o418565.ingest.sentry.io/5322520'); /// Whether the VM is running in debug mode. /// /// This is useful to decide whether a report should be sent to sentry. Usually /// reports from dev mode are not very useful, as these happen on developers' /// workspaces rather than on users' devices in production. bool get isInDebugMode { bool inDebugMode = false; assert(inDebugMode = true); return inDebugMode; } /// Reports [error] along with its [stackTrace] to Sentry.io. Future _reportError(dynamic error, dynamic stackTrace) async { print('Caught error: $error'); // Errors thrown in development mode are unlikely to be interesting. You can // check if you are running in dev mode using an assertion and omit sending // the report. if (isInDebugMode) { print(stackTrace); print('In dev mode. Not sending report to Sentry.io.'); return; } print('Reporting to Sentry.io...'); final SentryResponse response = await _sentry.captureException( exception: error, stackTrace: stackTrace, ); if (response.isSuccessful) { print('Success! Event ID: ${response.eventId}'); } else { print('Failed to report to Sentry.io: ${response.error}'); } } Future main() async { // This captures errors reported by the Flutter framework. FlutterError.onError = (FlutterErrorDetails details) async { if (isInDebugMode) { // 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); } }; // This creates a [Zone] that contains the Flutter application and stablishes // an error handler that captures errors and reports them. // // Using a zone makes sure that as many errors as possible are captured, // including those thrown from [Timer]s, microtasks, I/O, and those forwarded // from the `FlutterError` handler. // // More about zones: // // - https://api.dartlang.org/stable/1.24.2/dart-async/Zone-class.html // - https://www.dartlang.org/articles/libraries/zones runZonedGuarded>(() async { runApp( MultiProvider( // Initialize the model in the builder. That way, Provider // can own Models's lifecycle, making sure to call `dispose` // when not needed anymore. providers: [ ChangeNotifierProvider(create: (context) => ExerciseChangingViewModel(null)), ChangeNotifierProvider(create: (context) => CustomerChangingViewModel(null)), ], child: AitrainerApp(), )); }, (error, stackTrace) async { await _reportError(error, stackTrace); }); } class AitrainerApp extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); return MaterialApp( localizationsDelegates: [ // ... app-specific localization delegate[s] here AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ const Locale('en', "US"), // English const Locale('hu', "HU"), // Hungarian // ... other locales the app supports ], localeResolutionCallback: (Locale locale, Iterable supportedLocales) { //myLocale = deviceLocale ; // here you make your app language similar to device language , // but you should check whether the localization is supported by your app Locale realSupportedLocale = Locale('en', "US"); supportedLocales.forEach((supportedLocale) { if ( locale != null && supportedLocale != null && supportedLocale.countryCode == locale.countryCode ) { realSupportedLocale = supportedLocale; } }); if ( locale != null && realSupportedLocale.countryCode != locale.countryCode ) { print ("Locale " + locale.countryCode + " not supported on this device :("); } return realSupportedLocale; }, routes: { 'home': (context) => AitrainerHome(), 'loading': (context) => LoadingScreenMain(), 'customersPage': (context) => CustomerListPage(), 'customerNewPage': (context) => CustomerNewPage(), 'customerModifyPage': (context) => CustomerModifyPage(), 'customerGoalPage': (context) => CustomerGoalPage(), 'customerFitnessPage': (context) => CustomerFitnessPage(), 'customerBodyTypePage': (context) => CustomerBodyTypePage(), 'customerWelcomePage': (context) => CustomerWelcomePage(), 'exerciseTypeListPage': (context) => ExerciseTypeListPage(), 'exerciseTypeNewPage': (context) => ExerciseTypeNewPage(), 'exerciseTypeModifyPage': (context) => ExerciseTypeModifyPage(), 'exerciseNewPage': (context) => ExerciseNewPage(), 'login': (context) => LoginPage(), 'registration': (context) => RegistrationPage(), 'gdpr': (context) => Gdpr(), 'menu_page': (context) => MenuPage(), 'account': (context) => AccountPage(), 'settings': (context) => SettingsPage(), }, initialRoute: 'loading', title: 'Aitrainer', theme: ThemeData( brightness: Brightness.light, //primarySwatch: Colors.transparent, fontFamily: 'Arial', textTheme: TextTheme( bodyText1: TextStyle(fontSize: 14.0), ) ), home: LoadingScreenMain(), ); } }