fix black screen on launch when firebase fails to initialize
This commit is contained in:
parent
f34dca8019
commit
56f520b08b
1 changed files with 36 additions and 12 deletions
|
@ -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<void> init() => Firebase.initializeApp();
|
||||
|
||||
@override
|
||||
Map<String, String> get state => {
|
||||
Map<String, String> 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<void> setCollectionEnabled(bool enabled) async {
|
||||
debugPrint('${enabled ? 'enable' : 'disable'} Firebase & Crashlytics collection');
|
||||
try {
|
||||
await Firebase.app().setAutomaticDataCollectionEnabled(enabled);
|
||||
await _instance.setCrashlyticsCollectionEnabled(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<void> log(String message) => _instance.log(message);
|
||||
Future<void> log(String message) async => _instance?.log(message);
|
||||
|
||||
@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
|
||||
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
|
||||
Future<void> recordError(dynamic exception, StackTrace? stack) {
|
||||
Future<void> 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<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) {
|
||||
return _instance.recordFlutterError(flutterErrorDetails);
|
||||
Future<void> recordFlutterError(FlutterErrorDetails flutterErrorDetails) async {
|
||||
return _instance?.recordFlutterError(flutterErrorDetails);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue