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';
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue