From c7c09eb6b7bd945c615b66997bf51dcbde11d993 Mon Sep 17 00:00:00 2001 From: hffmnn Date: Fri, 5 Jul 2019 13:59:31 +0200 Subject: [PATCH 01/13] update AUTHORS file --- AUTHORS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 31a8f62280e0..7edbd0f95cde 100644 --- a/AUTHORS +++ b/AUTHORS @@ -40,4 +40,7 @@ Jonathan Younger Jose Sanchez Debkanchan Samadder Audrius Karosevicius -Lukasz Piliszczuk \ No newline at end of file +Lukasz Piliszczuk + +SoundReply Solutions GmbH + \ No newline at end of file From 7cfec234df067451a040fd090863d2444321425f Mon Sep 17 00:00:00 2001 From: hffmnn Date: Fri, 5 Jul 2019 13:59:41 +0200 Subject: [PATCH 02/13] bump pubspec version and update CHANGELOG --- packages/firebase_crashlytics/CHANGELOG.md | 38 ++++++++++++---------- packages/firebase_crashlytics/pubspec.yaml | 2 +- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md index fb9c747d0023..45e94adcba5b 100644 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ b/packages/firebase_crashlytics/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.4+13 + +- Support `runZoned`s `onError` arguments to be send to Crashlytics. + ## 0.0.4+12 * Update google-services Android gradle plugin to 4.3.0 in documentation and examples. @@ -18,57 +22,57 @@ ## 0.0.4+8 -* Automatically use version from pubspec.yaml when reporting usage to Firebase. +- Automatically use version from pubspec.yaml when reporting usage to Firebase. ## 0.0.4+7 -* Fixed an issue where `Crashlytics#setUserIdentifier` incorrectly called `setUserEmail` on iOS. +- Fixed an issue where `Crashlytics#setUserIdentifier` incorrectly called `setUserEmail` on iOS. ## 0.0.4+6 -* On Android, use actual the Dart exception name instead of "Dart error." +- On Android, use actual the Dart exception name instead of "Dart error." ## 0.0.4+5 -* Fix parsing stacktrace. +- Fix parsing stacktrace. ## 0.0.4+4 -* Add missing template type parameter to `invokeMethod` calls. -* Bump minimum Flutter version to 1.5.0. +- Add missing template type parameter to `invokeMethod` calls. +- Bump minimum Flutter version to 1.5.0. ## 0.0.4+3 -* Migrate our handling of `FlutterErrorDetails` to work on both Flutter stable +- Migrate our handling of `FlutterErrorDetails` to work on both Flutter stable and master. ## 0.0.4+2 -* Keep debug log formatting. +- Keep debug log formatting. ## 0.0.4+1 -* Added an integration test. +- Added an integration test. ## 0.0.4 -* Initialize Fabric automatically, preventing crashes that could occur when setting user data. +- Initialize Fabric automatically, preventing crashes that could occur when setting user data. ## 0.0.3 -* Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves. +- Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves. ## 0.0.2+1 -* Update variable name `enableInDevMode` in README. +- Update variable name `enableInDevMode` in README. ## 0.0.2 -* Updated the iOS podspec to a static framework to support compatibility with Swift plugins. -* Updated the Android gradle dependencies to prevent build errors. +- Updated the iOS podspec to a static framework to support compatibility with Swift plugins. +- Updated the Android gradle dependencies to prevent build errors. ## 0.0.1 -* Initial release of Firebase Crashlytics plugin. -This version reports uncaught errors as non-fatal exceptions in the -Firebase console. +- Initial release of Firebase Crashlytics plugin. + This version reports uncaught errors as non-fatal exceptions in the + Firebase console. diff --git a/packages/firebase_crashlytics/pubspec.yaml b/packages/firebase_crashlytics/pubspec.yaml index 04b106c57540..a3c6f4cdaec2 100644 --- a/packages/firebase_crashlytics/pubspec.yaml +++ b/packages/firebase_crashlytics/pubspec.yaml @@ -1,7 +1,7 @@ name: firebase_crashlytics description: Flutter plugin for Firebase Crashlytics. It reports uncaught errors to the Firebase console. -version: 0.0.4+12 +version: 0.0.4+13 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics From 7f84fa40619c63579df06007b5556bbe3b6cf679 Mon Sep 17 00:00:00 2001 From: hffmnn Date: Fri, 5 Jul 2019 14:00:27 +0200 Subject: [PATCH 03/13] add new method onRuntimeException --- .../lib/src/firebase_crashlytics.dart | 28 +++++++++++++++++++ .../test/firebase_crashlytics_test.dart | 12 ++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index aa5a67ef99e7..93096bca1875 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -55,6 +55,34 @@ class Crashlytics { } } + Future onRuntimeException(dynamic exception, dynamic stack) async { + print('Runtime Exception caught by Crashlytics plugin:'); + + bool inDebugMode = false; + if (!enableInDevMode) { + assert(inDebugMode = true); + } + + if (inDebugMode && !enableInDevMode) { + print(Trace.format(stack)); + } else { + // Report error + final List stackTraceLines = + Trace.format(stack).trimRight().split('\n'); + final List> stackTraceElements = + getStackTraceElements(stackTraceLines); + final dynamic result = await channel + .invokeMethod('Crashlytics#onError', { + 'exception': "${exception.toString()}", + 'context': 'onRuntimeException', + 'stackTraceElements': stackTraceElements, + 'logs': _logs.toList(), + 'keys': _prepareKeys(), + }); + print(result); + } + } + void crash() { throw StateError('Error thrown by Crashlytics plugin'); } diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart index 22319891bcf1..a549a2b2ad55 100644 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart @@ -66,6 +66,18 @@ void main() { expect(log[0].arguments['keys'][3]['type'], 'string'); }); + test('onRuntimeException', () async { + crashlytics.enableInDevMode = true; + crashlytics.log('foo'); + await crashlytics.onRuntimeException('foo exception', StackTrace.current); + expect(log[0].method, 'Crashlytics#onError'); + expect(log[0].arguments['exception'], 'foo exception'); + expect(log[0].arguments['context'], 'onRuntimeException'); + expect(log[0].arguments['logs'], isNotEmpty); + expect(log[0].arguments['logs'], contains('foo')); + expect(log[0].arguments['keys'], isEmpty); + }); + test('isDebuggable', () async { expect(await crashlytics.isDebuggable(), true); expect( From 3fcfb791893afedde8c0b7c759c78cc860f849be Mon Sep 17 00:00:00 2001 From: hffmnn Date: Fri, 5 Jul 2019 14:00:37 +0200 Subject: [PATCH 04/13] update the example --- .../example/lib/main.dart | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/firebase_crashlytics/example/lib/main.dart b/packages/firebase_crashlytics/example/lib/main.dart index ba10fb26391b..d8a7a88c3400 100644 --- a/packages/firebase_crashlytics/example/lib/main.dart +++ b/packages/firebase_crashlytics/example/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -13,7 +15,12 @@ void main() { FlutterError.onError = (FlutterErrorDetails details) { Crashlytics.instance.onError(details); }; - runApp(MyApp()); + + runZoned>(() async { + runApp(MyApp()); + }, onError: (dynamic error, dynamic stack) async { + await Crashlytics.instance.onRuntimeException(error, stack); + }); } class MyApp extends StatefulWidget { @@ -61,6 +68,17 @@ class _MyAppState extends State { // Crashlytics. throw StateError('Uncaught error thrown by app.'); }), + FlatButton( + child: const Text('Async out of bounds'), + onPressed: () { + // Example of an exception that does not get catched + // by `Flutter.onError` but the `onError` handler of + // `runZoned`. + Future.delayed(Duration(seconds: 2), () { + final List list = []; + print(list[100]); + }); + }), ], ), ), From b54212c4164241444bf4ae79424b219ce2f65bcd Mon Sep 17 00:00:00 2001 From: hffmnn Date: Fri, 5 Jul 2019 14:03:31 +0200 Subject: [PATCH 05/13] fix CHANGELOG --- packages/firebase_crashlytics/CHANGELOG.md | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md index 45e94adcba5b..d32a29f898d0 100644 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ b/packages/firebase_crashlytics/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.0.4+13 -- Support `runZoned`s `onError` arguments to be send to Crashlytics. +* Support `runZoned`s `onError` arguments to be send to Crashlytics. ## 0.0.4+12 @@ -22,57 +22,57 @@ ## 0.0.4+8 -- Automatically use version from pubspec.yaml when reporting usage to Firebase. +* Automatically use version from pubspec.yaml when reporting usage to Firebase. ## 0.0.4+7 -- Fixed an issue where `Crashlytics#setUserIdentifier` incorrectly called `setUserEmail` on iOS. +* Fixed an issue where `Crashlytics#setUserIdentifier` incorrectly called `setUserEmail` on iOS. ## 0.0.4+6 -- On Android, use actual the Dart exception name instead of "Dart error." +* On Android, use actual the Dart exception name instead of "Dart error." ## 0.0.4+5 -- Fix parsing stacktrace. +* Fix parsing stacktrace. ## 0.0.4+4 -- Add missing template type parameter to `invokeMethod` calls. -- Bump minimum Flutter version to 1.5.0. +* Add missing template type parameter to `invokeMethod` calls. +* Bump minimum Flutter version to 1.5.0. ## 0.0.4+3 -- Migrate our handling of `FlutterErrorDetails` to work on both Flutter stable +* Migrate our handling of `FlutterErrorDetails` to work on both Flutter stable and master. ## 0.0.4+2 -- Keep debug log formatting. +* Keep debug log formatting. ## 0.0.4+1 -- Added an integration test. +* Added an integration test. ## 0.0.4 -- Initialize Fabric automatically, preventing crashes that could occur when setting user data. +* Initialize Fabric automatically, preventing crashes that could occur when setting user data. ## 0.0.3 -- Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves. +* Rely on firebase_core to add the Android dependency on Firebase instead of hardcoding the version ourselves. ## 0.0.2+1 -- Update variable name `enableInDevMode` in README. +* Update variable name `enableInDevMode` in README. ## 0.0.2 -- Updated the iOS podspec to a static framework to support compatibility with Swift plugins. -- Updated the Android gradle dependencies to prevent build errors. +* Updated the iOS podspec to a static framework to support compatibility with Swift plugins. +* Updated the Android gradle dependencies to prevent build errors. ## 0.0.1 -- Initial release of Firebase Crashlytics plugin. - This version reports uncaught errors as non-fatal exceptions in the - Firebase console. +* Initial release of Firebase Crashlytics plugin. +This version reports uncaught errors as non-fatal exceptions in the +Firebase console. From 87b51ce6db79151dfe26632d8793c426e3a786f2 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 8 Jul 2019 06:26:59 -0700 Subject: [PATCH 06/13] Update AUTHORS --- AUTHORS | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 7edbd0f95cde..855e3a4569f2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -41,6 +41,4 @@ Jose Sanchez Debkanchan Samadder Audrius Karosevicius Lukasz Piliszczuk - -SoundReply Solutions GmbH - \ No newline at end of file +SoundReply Solutions GmbH \ No newline at end of file From ede86764173c4088e7c5eff44e84e6e9ac27d55a Mon Sep 17 00:00:00 2001 From: hffmnn Date: Tue, 9 Jul 2019 12:00:35 +0200 Subject: [PATCH 07/13] make tests green again --- .../test/firebase_crashlytics_test.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart index a549a2b2ad55..4a1a3247820e 100644 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart @@ -75,7 +75,18 @@ void main() { expect(log[0].arguments['context'], 'onRuntimeException'); expect(log[0].arguments['logs'], isNotEmpty); expect(log[0].arguments['logs'], contains('foo')); - expect(log[0].arguments['keys'], isEmpty); + expect(log[0].arguments['keys'][0]['key'], 'testBool'); + expect(log[0].arguments['keys'][0]['value'], isTrue); + expect(log[0].arguments['keys'][0]['type'], 'boolean'); + expect(log[0].arguments['keys'][1]['key'], 'testInt'); + expect(log[0].arguments['keys'][1]['value'], 42); + expect(log[0].arguments['keys'][1]['type'], 'int'); + expect(log[0].arguments['keys'][2]['key'], 'testDouble'); + expect(log[0].arguments['keys'][2]['value'], 42.0); + expect(log[0].arguments['keys'][2]['type'], 'double'); + expect(log[0].arguments['keys'][3]['key'], 'testString'); + expect(log[0].arguments['keys'][3]['value'], 'bar'); + expect(log[0].arguments['keys'][3]['type'], 'string'); }); test('isDebuggable', () async { From 9e25d82fe146c5741a8b22e82057fe3c349a32f6 Mon Sep 17 00:00:00 2001 From: hffmnn Date: Tue, 9 Jul 2019 12:00:43 +0200 Subject: [PATCH 08/13] remove context --- packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart | 1 - .../firebase_crashlytics/test/firebase_crashlytics_test.dart | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index 93096bca1875..8fe043e93a7d 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -74,7 +74,6 @@ class Crashlytics { final dynamic result = await channel .invokeMethod('Crashlytics#onError', { 'exception': "${exception.toString()}", - 'context': 'onRuntimeException', 'stackTraceElements': stackTraceElements, 'logs': _logs.toList(), 'keys': _prepareKeys(), diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart index 4a1a3247820e..375119e2889a 100644 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart @@ -72,7 +72,7 @@ void main() { await crashlytics.onRuntimeException('foo exception', StackTrace.current); expect(log[0].method, 'Crashlytics#onError'); expect(log[0].arguments['exception'], 'foo exception'); - expect(log[0].arguments['context'], 'onRuntimeException'); + expect(log[0].arguments['context'], null); expect(log[0].arguments['logs'], isNotEmpty); expect(log[0].arguments['logs'], contains('foo')); expect(log[0].arguments['keys'][0]['key'], 'testBool'); From 0d3b3f7f4a01433fca6ddf83f95b700f1a6778e8 Mon Sep 17 00:00:00 2001 From: hffmnn Date: Wed, 24 Jul 2019 16:41:00 +0200 Subject: [PATCH 09/13] update to new API --- .../lib/src/firebase_crashlytics.dart | 10 ++++++---- .../test/firebase_crashlytics_test.dart | 11 ++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index 8fe043e93a7d..60a82059cb2e 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -25,8 +25,8 @@ class Crashlytics { MethodChannel('plugins.flutter.io/firebase_crashlytics'); /// Submits non-fatal crash report to Firebase Crashlytics. - Future onError(FlutterErrorDetails details) async { - print('Error caught by Crashlytics plugin:'); + Future recordFlutterError(FlutterErrorDetails details) async { + print('Error caught by Crashlytics plugin :'); bool inDebugMode = false; if (!enableInDevMode) { @@ -55,8 +55,9 @@ class Crashlytics { } } - Future onRuntimeException(dynamic exception, dynamic stack) async { - print('Runtime Exception caught by Crashlytics plugin:'); + Future recordError(dynamic exception, StackTrace stack, + {dynamic context}) async { + print('Error caught by Crashlytics plugin :'); bool inDebugMode = false; if (!enableInDevMode) { @@ -74,6 +75,7 @@ class Crashlytics { final dynamic result = await channel .invokeMethod('Crashlytics#onError', { 'exception': "${exception.toString()}", + 'context': '$context', 'stackTraceElements': stackTraceElements, 'logs': _logs.toList(), 'keys': _prepareKeys(), diff --git a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart index 375119e2889a..5fef5850814d 100644 --- a/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart +++ b/packages/firebase_crashlytics/test/firebase_crashlytics_test.dart @@ -33,7 +33,7 @@ void main() { log.clear(); }); - test('onError', () async { + test('recordFlutterError', () async { final FlutterErrorDetails details = FlutterErrorDetails( exception: 'foo exception', stack: StackTrace.current, @@ -46,7 +46,7 @@ void main() { crashlytics.setInt('testInt', 42); crashlytics.setDouble('testDouble', 42.0); crashlytics.setString('testString', 'bar'); - await crashlytics.onError(details); + await crashlytics.recordFlutterError(details); expect(log[0].method, 'Crashlytics#onError'); expect(log[0].arguments['exception'], 'foo exception'); expect(log[0].arguments['context'], 'foo context'); @@ -66,13 +66,14 @@ void main() { expect(log[0].arguments['keys'][3]['type'], 'string'); }); - test('onRuntimeException', () async { + test('recordError', () async { crashlytics.enableInDevMode = true; crashlytics.log('foo'); - await crashlytics.onRuntimeException('foo exception', StackTrace.current); + await crashlytics.recordError('foo exception', StackTrace.current, + context: "context"); expect(log[0].method, 'Crashlytics#onError'); expect(log[0].arguments['exception'], 'foo exception'); - expect(log[0].arguments['context'], null); + expect(log[0].arguments['context'], "context"); expect(log[0].arguments['logs'], isNotEmpty); expect(log[0].arguments['logs'], contains('foo')); expect(log[0].arguments['keys'][0]['key'], 'testBool'); From 845d000225499ed7e6591f67784e455419beb67d Mon Sep 17 00:00:00 2001 From: hffmnn Date: Wed, 24 Jul 2019 16:53:48 +0200 Subject: [PATCH 10/13] funnel all public methods through one internal method --- .../lib/src/firebase_crashlytics.dart | 81 ++++++++----------- 1 file changed, 32 insertions(+), 49 deletions(-) diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index 60a82059cb2e..b176f9ce06d8 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -24,64 +24,21 @@ class Crashlytics { static const MethodChannel channel = MethodChannel('plugins.flutter.io/firebase_crashlytics'); - /// Submits non-fatal crash report to Firebase Crashlytics. + /// Submits non-fatal flutter crash report based on `FlutterErrorDetails` + /// to Firebase Crashlytics. Future recordFlutterError(FlutterErrorDetails details) async { print('Error caught by Crashlytics plugin :'); - bool inDebugMode = false; - if (!enableInDevMode) { - assert(inDebugMode = true); - } - - if (inDebugMode && !enableInDevMode) { - print(Trace.format(details.stack)); - } else { - // Report error - final List stackTraceLines = - Trace.format(details.stack).trimRight().split('\n'); - final List> stackTraceElements = - getStackTraceElements(stackTraceLines); - await channel - .invokeMethod('Crashlytics#onError', { - 'exception': details.exceptionAsString(), - // FlutterErrorDetails.context has been migrated from a String to a - // DiagnosticsNode. Coerce it to a String here in a way that will work - // on both Strings and the new DiagnosticsNode values. See https://groups.google.com/forum/#!topic/flutter-announce/hp1RNIgej38 - 'context': '${details.context}', - 'stackTraceElements': stackTraceElements, - 'logs': _logs.toList(), - 'keys': _prepareKeys(), - }); - } + _recordError(details.exceptionAsString(), details.stack, + context: details.context); } + /// Submits non-fatal crash report to Firebase Crashlytics. Future recordError(dynamic exception, StackTrace stack, {dynamic context}) async { print('Error caught by Crashlytics plugin :'); - bool inDebugMode = false; - if (!enableInDevMode) { - assert(inDebugMode = true); - } - - if (inDebugMode && !enableInDevMode) { - print(Trace.format(stack)); - } else { - // Report error - final List stackTraceLines = - Trace.format(stack).trimRight().split('\n'); - final List> stackTraceElements = - getStackTraceElements(stackTraceLines); - final dynamic result = await channel - .invokeMethod('Crashlytics#onError', { - 'exception': "${exception.toString()}", - 'context': '$context', - 'stackTraceElements': stackTraceElements, - 'logs': _logs.toList(), - 'keys': _prepareKeys(), - }); - print(result); - } + _recordError(exception, stack, context: context); } void crash() { @@ -225,4 +182,30 @@ class Crashlytics { } return elements; } + + Future _recordError(dynamic exception, StackTrace stack, + {dynamic context}) async { + bool inDebugMode = false; + if (!enableInDevMode) { + assert(inDebugMode = true); + } + + if (inDebugMode && !enableInDevMode) { + print(Trace.format(stack)); + } else { + // Report error + final List stackTraceLines = + Trace.format(stack).trimRight().split('\n'); + final List> stackTraceElements = + getStackTraceElements(stackTraceLines); + await channel + .invokeMethod('Crashlytics#onError', { + 'exception': "${exception.toString()}", + 'context': '$context', + 'stackTraceElements': stackTraceElements, + 'logs': _logs.toList(), + 'keys': _prepareKeys(), + }); + } + } } From beda9fd3e9619d6b554d290650dcd2f9d4ba713b Mon Sep 17 00:00:00 2001 From: hffmnn Date: Wed, 24 Jul 2019 17:30:20 +0200 Subject: [PATCH 11/13] fix example --- packages/firebase_crashlytics/example/lib/main.dart | 4 ++-- .../firebase_crashlytics/example/test_driver/crashlytics.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/firebase_crashlytics/example/lib/main.dart b/packages/firebase_crashlytics/example/lib/main.dart index d8a7a88c3400..90e14372a426 100644 --- a/packages/firebase_crashlytics/example/lib/main.dart +++ b/packages/firebase_crashlytics/example/lib/main.dart @@ -13,13 +13,13 @@ void main() { // Pass all uncaught errors to Crashlytics. FlutterError.onError = (FlutterErrorDetails details) { - Crashlytics.instance.onError(details); + Crashlytics.instance.recordFlutterError(details); }; runZoned>(() async { runApp(MyApp()); }, onError: (dynamic error, dynamic stack) async { - await Crashlytics.instance.onRuntimeException(error, stack); + await Crashlytics.instance.recordError(error, stack); }); } diff --git a/packages/firebase_crashlytics/example/test_driver/crashlytics.dart b/packages/firebase_crashlytics/example/test_driver/crashlytics.dart index c1a6c1d3df9e..40bb08717189 100644 --- a/packages/firebase_crashlytics/example/test_driver/crashlytics.dart +++ b/packages/firebase_crashlytics/example/test_driver/crashlytics.dart @@ -14,7 +14,7 @@ void main() { enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); tearDownAll(() => allTestsCompleter.complete(null)); - test('onError', () async { + test('recordFlutterError', () async { // This is currently only testing that we can log errors without crashing. final Crashlytics crashlytics = Crashlytics.instance; await crashlytics.setUserName('testing'); @@ -24,7 +24,7 @@ void main() { crashlytics.setDouble('testDouble', 42.0); crashlytics.setString('testString', 'bar'); Crashlytics.instance.log('testing'); - await crashlytics.onError( + await crashlytics.recordFlutterError( FlutterErrorDetails( exception: 'testing', stack: StackTrace.fromString(''), From 20480ba6ead5f87c1cf3fdac6d391ed5c4894730 Mon Sep 17 00:00:00 2001 From: Christian Hoffmann <352753+hffmnn@users.noreply.github.com> Date: Thu, 25 Jul 2019 10:38:06 +0200 Subject: [PATCH 12/13] apply suggested changes Co-Authored-By: Collin Jackson --- packages/firebase_crashlytics/CHANGELOG.md | 5 +++-- packages/firebase_crashlytics/example/lib/main.dart | 12 ++++-------- .../lib/src/firebase_crashlytics.dart | 8 +++++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/firebase_crashlytics/CHANGELOG.md b/packages/firebase_crashlytics/CHANGELOG.md index d32a29f898d0..17da29918f4e 100644 --- a/packages/firebase_crashlytics/CHANGELOG.md +++ b/packages/firebase_crashlytics/CHANGELOG.md @@ -1,6 +1,7 @@ -## 0.0.4+13 +## 0.1.0 -* Support `runZoned`s `onError` arguments to be send to Crashlytics. +* **Breaking Change** Renamed `onError` to `reportFlutterError`. +* Added `recordError` method for errors caught using `runZoned`'s `onError`. ## 0.0.4+12 diff --git a/packages/firebase_crashlytics/example/lib/main.dart b/packages/firebase_crashlytics/example/lib/main.dart index 90e14372a426..81684ceaa272 100644 --- a/packages/firebase_crashlytics/example/lib/main.dart +++ b/packages/firebase_crashlytics/example/lib/main.dart @@ -12,15 +12,11 @@ void main() { Crashlytics.instance.enableInDevMode = true; // Pass all uncaught errors to Crashlytics. - FlutterError.onError = (FlutterErrorDetails details) { - Crashlytics.instance.recordFlutterError(details); - }; + FlutterError.onError = Crashlytics.instance.recordFlutterError; runZoned>(() async { runApp(MyApp()); - }, onError: (dynamic error, dynamic stack) async { - await Crashlytics.instance.recordError(error, stack); - }); + }, onError: Crashlytics.instance.recordError); } class MyApp extends StatefulWidget { @@ -71,8 +67,8 @@ class _MyAppState extends State { FlatButton( child: const Text('Async out of bounds'), onPressed: () { - // Example of an exception that does not get catched - // by `Flutter.onError` but the `onError` handler of + // Example of an exception that does not get caught + // by `FlutterError.onError` but is caught by the `onError` handler of // `runZoned`. Future.delayed(Duration(seconds: 2), () { final List list = []; diff --git a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart index b176f9ce06d8..1409c50f8bfa 100644 --- a/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart +++ b/packages/firebase_crashlytics/lib/src/firebase_crashlytics.dart @@ -24,16 +24,18 @@ class Crashlytics { static const MethodChannel channel = MethodChannel('plugins.flutter.io/firebase_crashlytics'); - /// Submits non-fatal flutter crash report based on `FlutterErrorDetails` + /// Submits report of a non-fatal error caught by the Flutter framework. /// to Firebase Crashlytics. Future recordFlutterError(FlutterErrorDetails details) async { - print('Error caught by Crashlytics plugin :'); + print('Flutter error caught by Crashlytics plugin:'); _recordError(details.exceptionAsString(), details.stack, context: details.context); } - /// Submits non-fatal crash report to Firebase Crashlytics. + /// Submits a report of a non-fatal error. + /// + /// For errors generated by the Flutter framework, use [recordFlutterError] instead. Future recordError(dynamic exception, StackTrace stack, {dynamic context}) async { print('Error caught by Crashlytics plugin :'); From 2f97c7dcddad3cabc7ed465ec4f7c4e06d2d2aa1 Mon Sep 17 00:00:00 2001 From: hffmnn Date: Thu, 25 Jul 2019 10:58:42 +0200 Subject: [PATCH 13/13] update version in pubspec to 0.1.0 --- packages/firebase_crashlytics/pubspec.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/firebase_crashlytics/pubspec.yaml b/packages/firebase_crashlytics/pubspec.yaml index a3c6f4cdaec2..d2d3d854c2a1 100644 --- a/packages/firebase_crashlytics/pubspec.yaml +++ b/packages/firebase_crashlytics/pubspec.yaml @@ -1,7 +1,8 @@ name: firebase_crashlytics -description: Flutter plugin for Firebase Crashlytics. It reports uncaught errors to the +description: + Flutter plugin for Firebase Crashlytics. It reports uncaught errors to the Firebase console. -version: 0.0.4+13 +version: 0.1.0 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_crashlytics