When I open the app everything works fine but when i close it and reopen it from the home screen it crashes on TestFlight.
Here's the crash log of the thread its crashing on:
1Thread 0 name:2Thread 0 Crashed:30 libswiftCore.dylib 0x00000001847363fc _assertionFailure(_:_:file:line:flags:) + 264 (AssertCommon.swift:144)41 PurchasesHybridCommon 0x00000001019af1a4 closure #1 in variable initialization expression of static FatalErrorUtil.defaultFatalErrorClosure + 64 (FatalErrorUtil.swift:15)52 PurchasesHybridCommon 0x00000001019a73a0 fatalError(_:file:line:) + 60 (FatalErrorUtil.swift:27)63 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.sharedInstance.getter + 84 (CommonFunctionality.swift:21)74 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.customerInfo(fetchPolicy:completion:) + 84 (<compiler-generated>:405)85 PurchasesHybridCommon 0x00000001019a73a0 specialized static CommonFunctionality.customerInfo(completion:) + 372 (CommonFunctionality.swift:398)96 PurchasesHybridCommon 0x00000001019a3964 @objc static CommonFunctionality.restorePurchases(completion:) + 76107 purchases_flutter 0x0000000102cf5f2c -[PurchasesFlutterPlugin getCustomerInfoWithResult:] + 48 (PurchasesFlutterPlugin.m:347)118 purchases_flutter 0x0000000102cf493c -[PurchasesFlutterPlugin handleMethodCall:result:] + 2048 (PurchasesFlutterPlugin.m:100)129 Flutter 0x000000010342196c 0x102e40000 + 61668921310 Flutter 0x0000000102e83c00 0x102e40000 + 2775041411 libdispatch.dylib 0x00000001933106a8 _dispatch_call_block_and_release + 32 (init.c:1530)1512 libdispatch.dylib 0x0000000193312300 _dispatch_client_callout + 20 (object.m:561)1613 libdispatch.dylib 0x0000000193320998 _dispatch_main_queue_drain + 984 (queue.c:7813)1714 libdispatch.dylib 0x00000001933205b0 _dispatch_main_queue_callback_4CF + 44 (queue.c:7973)1815 CoreFoundation 0x000000018b34cf9c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CFRunLoop.c:1780)1916 CoreFoundation 0x000000018b349ca8 __CFRunLoopRun + 1996 (CFRunLoop.c:3149)2017 CoreFoundation 0x000000018b3493f8 CFRunLoopRunSpecific + 608 (CFRunLoop.c:3420)2118 GraphicsServices 0x00000001ce8d74f8 GSEventRunModal + 164 (GSEvent.c:2196)2219 UIKitCore 0x000000018d76f8a0 -[UIApplication _run] + 888 (UIApplication.m:3685)2320 UIKitCore 0x000000018d76eedc UIApplicationMain + 340 (UIApplication.m:5270)2421 Runner 0x000000010030877c main + 64 (AppDelegate.swift:7)2522 dyld 0x00000001ae09edcc start + 2240 (dyldMain.cpp:1269)26
this is my main.dart code:
1import 'dart:io';23import 'package:awesome_notifications/awesome_notifications.dart';4import 'package:firebase_crashlytics/firebase_crashlytics.dart';5import 'package:flutter/material.dart';6import 'package:flutter_localizations/flutter_localizations.dart';7import 'package:presentpal/api/constants.dart';8import 'package:presentpal/api/firebase_api.dart';9import 'package:presentpal/api/purchases_api.dart';10import 'package:presentpal/pages/gift_chose.dart';11import 'package:presentpal/pages/home.dart';12import 'package:presentpal/provider/locale_provider.dart';13import 'package:presentpal/services/analytics_service.dart';14import 'package:shared_preferences/shared_preferences.dart';15import 'provider/theme_provider.dart';16import 'package:flutter_gen/gen_l10n/app_localizations.dart';17import 'services/preferences_service.dart';18import 'pages/change_notifier.dart' as presentpal;19import 'package:provider/provider.dart';20import 'package:firebase_core/firebase_core.dart';21import 'package:google_mobile_ads/google_mobile_ads.dart';22import 'pages/onboarding.dart';23import 'package:flutter_dotenv/flutter_dotenv.dart';24import 'store_config.dart';25import 'package:purchases_flutter/purchases_flutter.dart';26import 'package:presentpal/services/set_notifications.dart';27import 'package:timezone/data/latest.dart' as tz;2829final navigatorKey = GlobalKey<NavigatorState>();303132Future<void> configureLocalTimeZone() async {33 tz.initializeTimeZones();34}3536Future<void> main() async {37 WidgetsFlutterBinding.ensureInitialized();38 presentpal.AppState appState = presentpal.AppState();39 try {40 MobileAds.instance.initialize();4142 //get user data43 await Firebase.initializeApp();4445 FlutterError.onError = (errorDetails) {46 FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);47 };4849 await FirebaseApi().initNotifications();5051 await setNotifications.initializeNotifications();5253 await configureLocalTimeZone();5455 String? initialLocale = await getLocale();56 if (initialLocale != null && initialLocale.isNotEmpty) {57 appState.setLocale(initialLocale);58 }59 try {60 await dotenv.load(fileName: ".env");61 } catch (e) {62 print(e.toString());63 }64 if (Platform.isIOS) {65 StoreConfig(66 store: Store.appStore,67 apiKey: appleApiKey,68 );69 } else if (Platform.isAndroid) {70 StoreConfig(71 store: Store.playStore,72 apiKey: googleApiKey,73 );74 }75 await PurchaseApi.init();76 } catch (e) {77 print(e.toString());78 AnalyticsService analyticsService = AnalyticsService();79 analyticsService.logEvent('error: ${e.toString()}');80 }8182 runApp(83 MultiProvider(84 providers: [85 ChangeNotifierProvider(create: (_) => LocaleModel()),86 ],87 child: MyApp(appState: appState),88 ),89 );90}9192class MyApp extends StatefulWidget {93 final presentpal.AppState appState;9495 const MyApp({super.key, required this.appState});9697 @override98 State<MyApp> createState() => _MyAppState();99}100101class _MyAppState extends State<MyApp> {102 bool hasSeenOnboarding = false;103104 @override105 void initState() {106 super.initState();107 _populateFields();108 checkOnboardingStatus();109 AwesomeNotifications().isNotificationAllowed().then((isAllowed) {110 if (!isAllowed) {111 AwesomeNotifications().requestPermissionToSendNotifications();112 }113 });114 }115116 Future<void> checkOnboardingStatus() async {117 final SharedPreferences prefs = await SharedPreferences.getInstance();118 final bool seenOnboarding = prefs.getBool('hasSeenOnboarding') ?? false;119 setState(() {120 hasSeenOnboarding = seenOnboarding;121 });122 }123124 final _preferenceServices = PreferencesService();125126 String selectedLanguage = 'en';127128 void _populateFields() async {129 final settings = await _preferenceServices.getSettings();130 String? storedLanguage = settings.languageCode;131 if (storedLanguage.isNotEmpty) {132 setState(() {133 selectedLanguage = storedLanguage;134 });135 widget.appState.setLocale(selectedLanguage);136 } else {137 String languageCode;138 try {139 //get locale from settings140 Locale userLocale = WidgetsBinding.instance.window.locale;141 languageCode = userLocale.languageCode;142 if ([143 'en',144 'ar',145 'bn',146 'de',147 'es',148 'fr',149 'hi',150 'it',151 'ko',152 'pt',153 'ru',154 'zh',155 'zh_HK'156 ].contains(languageCode)) {157 setState(() {158 selectedLanguage = languageCode;159 });160 widget.appState.setLocale(selectedLanguage);161 }162 } catch (e) {163 languageCode = 'en';164 }165 }166 }167168 @override169 Widget build(BuildContext context) {170 return ChangeNotifierProvider(171 create: (context) => LocaleProvider(),172 builder: (context, child) {173 final provider = Provider.of<LocaleProvider>(context);174 return MaterialApp(175 debugShowCheckedModeBanner: false,176 title: 'PresentPal',177 themeMode: ThemeMode.system,178 theme: MyThemes.lightTheme,179 navigatorObservers: [AnalyticsService().getAnalyticsObserver()],180 navigatorKey: navigatorKey,181 locale: provider.locale,182 supportedLocales: const [183 Locale('en'), // English184 Locale('ar'), //Arabic185 Locale('bn'), //Bengali186 Locale('de'), //German187 Locale('es'), //Spanish188 Locale('fr'), //French189 Locale('hi'), //Hindi190 Locale('it'), //Italian191 Locale('ko'), //Korean192 Locale('pt'), //Portuguese193 Locale('ru'), //Russian194 Locale('zh'), //Chinese195 Locale('zh_HK') //Chinese (Hong Kong)196 ],197 localizationsDelegates: const [198 AppLocalizations.delegate,199 GlobalMaterialLocalizations.delegate,200 GlobalWidgetsLocalizations.delegate,201 GlobalCupertinoLocalizations.delegate,202 ],203 darkTheme: MyThemes.darkTheme,204 routes: {205 '/home': (context) => const HomePage(),206 '/onboarding': (context) => const OnboardingScreen(),207 '/giftChoose': (context) => const GiftChoose(),208 },209 home:210 hasSeenOnboarding ? const HomePage() : const OnboardingScreen(),211 );212 }213 );214 }215}216217Future<void> setLocale(String languageCode) async {218 final SharedPreferences preferences = await SharedPreferences.getInstance();219 preferences.setString('languageCode', languageCode);220}221222Future<String?> getLocale() async {223 WidgetsFlutterBinding.ensureInitialized();224 final SharedPreferences preferences = await SharedPreferences.getInstance();225 return preferences.getString('languageCode');226}227228class LocaleModel extends ChangeNotifier {229 Locale? _locale;230231 Locale? get locale => _locale;232233 void set(Locale locale) {234 _locale = locale;235 notifyListeners();236 }237}