diff --git a/plugins/aves_report_crashlytics/lib/aves_report_platform.dart b/plugins/aves_report_crashlytics/lib/aves_report_platform.dart index b091a2f31..58e429b3b 100644 --- a/plugins/aves_report_crashlytics/lib/aves_report_platform.dart +++ b/plugins/aves_report_crashlytics/lib/aves_report_platform.dart @@ -11,38 +11,62 @@ import 'package:flutter/services.dart'; import 'package:stack_trace/stack_trace.dart'; class PlatformReportService extends ReportService { - FirebaseCrashlytics get _instance => FirebaseCrashlytics.instance; + FirebaseCrashlytics? get _instance { + try { + return FirebaseCrashlytics.instance; + } catch (error, stack) { + // as of firebase_core v1.10.5 / firebase_crashlytics v2.4.3, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to get Firebase Crashlytics instance with error=$error\n$stack'); + } + return null; + } @override Future init() => Firebase.initializeApp(); @override - Map get state => { + Map get state { + try { + return { 'Reporter': 'Crashlytics', 'Firebase data collection enabled': '${Firebase.app().isAutomaticDataCollectionEnabled}', - 'Crashlytics collection enabled': '${_instance.isCrashlyticsCollectionEnabled}', + 'Crashlytics collection enabled': '${_instance?.isCrashlyticsCollectionEnabled}', }; + } catch (error, stack) { + // as of firebase_core v1.10.5 / firebase_crashlytics v2.4.3, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to access Firebase properties with error=$error\n$stack'); + } + return {}; + } @override Future setCollectionEnabled(bool enabled) async { debugPrint('${enabled ? 'enable' : 'disable'} Firebase & Crashlytics collection'); - await Firebase.app().setAutomaticDataCollectionEnabled(enabled); - await _instance.setCrashlyticsCollectionEnabled(enabled); + try { + await Firebase.app().setAutomaticDataCollectionEnabled(enabled); + await _instance?.setCrashlyticsCollectionEnabled(enabled); + } catch (error, stack) { + // as of firebase_core v1.10.5 / firebase_crashlytics v2.4.3, `Firebase.app` sometimes fail with: + // `No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()` + debugPrint('failed to access Firebase properties with error=$error\n$stack'); + } } @override - Future log(String message) => _instance.log(message); + Future log(String message) async => _instance?.log(message); @override - Future setCustomKey(String key, Object value) => _instance.setCustomKey(key, value); + Future setCustomKey(String key, Object value) async => _instance?.setCustomKey(key, value); @override Future setCustomKeys(Map map) { - return Future.forEach>(map.entries, (kv) => _instance.setCustomKey(kv.key, kv.value)); + return Future.forEach>(map.entries, (kv) => setCustomKey(kv.key, kv.value)); } @override - Future recordError(dynamic exception, StackTrace? stack) { + Future recordError(dynamic exception, StackTrace? stack) async { if (exception is PlatformException && stack != null) { // simply creating a trace with `Trace.current(1)` or creating a `Trace` from modified frames // does not yield a stack trace that Crashlytics can segment, @@ -56,11 +80,11 @@ class PlatformReportService extends ReportService { ) .join('\n')); } - return _instance.recordError(exception, stack); + return _instance?.recordError(exception, stack); } @override - Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) { - return _instance.recordFlutterError(flutterErrorDetails); + Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) async { + return _instance?.recordFlutterError(flutterErrorDetails); } }