fix black screen on launch when firebase fails to initialize

This commit is contained in:
Thibault Deckers 2022-04-07 12:19:52 +09:00
parent f34dca8019
commit 56f520b08b

View file

@ -11,38 +11,62 @@ import 'package:flutter/services.dart';
import 'package:stack_trace/stack_trace.dart'; import 'package:stack_trace/stack_trace.dart';
class PlatformReportService extends ReportService { 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 @override
Future<void> init() => Firebase.initializeApp(); Future<void> init() => Firebase.initializeApp();
@override @override
Map<String, String> get state => { Map<String, String> get state {
try {
return {
'Reporter': 'Crashlytics', 'Reporter': 'Crashlytics',
'Firebase data collection enabled': '${Firebase.app().isAutomaticDataCollectionEnabled}', '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 @override
Future<void> setCollectionEnabled(bool enabled) async { Future<void> setCollectionEnabled(bool enabled) async {
debugPrint('${enabled ? 'enable' : 'disable'} Firebase & Crashlytics collection'); debugPrint('${enabled ? 'enable' : 'disable'} Firebase & Crashlytics collection');
await Firebase.app().setAutomaticDataCollectionEnabled(enabled); try {
await _instance.setCrashlyticsCollectionEnabled(enabled); 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 @override
Future<void> log(String message) => _instance.log(message); Future<void> log(String message) async => _instance?.log(message);
@override @override
Future<void> setCustomKey(String key, Object value) => _instance.setCustomKey(key, value); Future<void> setCustomKey(String key, Object value) async => _instance?.setCustomKey(key, value);
@override @override
Future<void> setCustomKeys(Map<String, Object> map) { Future<void> setCustomKeys(Map<String, Object> map) {
return Future.forEach<MapEntry<String, Object>>(map.entries, (kv) => _instance.setCustomKey(kv.key, kv.value)); return Future.forEach<MapEntry<String, Object>>(map.entries, (kv) => setCustomKey(kv.key, kv.value));
} }
@override @override
Future<void> recordError(dynamic exception, StackTrace? stack) { Future<void> recordError(dynamic exception, StackTrace? stack) async {
if (exception is PlatformException && stack != null) { if (exception is PlatformException && stack != null) {
// simply creating a trace with `Trace.current(1)` or creating a `Trace` from modified frames // 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, // does not yield a stack trace that Crashlytics can segment,
@ -56,11 +80,11 @@ class PlatformReportService extends ReportService {
) )
.join('\n')); .join('\n'));
} }
return _instance.recordError(exception, stack); return _instance?.recordError(exception, stack);
} }
@override @override
Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) { Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) async {
return _instance.recordFlutterError(flutterErrorDetails); return _instance?.recordFlutterError(flutterErrorDetails);
} }
} }