From 9075b4752ea65680e99f009c95ff45ca7c75241d Mon Sep 17 00:00:00 2001
From: Jakub Homlala <1329033+jhomlala@users.noreply.github.com>
Date: Thu, 9 Nov 2023 21:19:11 +0100
Subject: [PATCH] Feat/0.8.0 (#261)
* feat: updated android SDK versions, updated dependencies
* feat: added very_good_analysis, fixed lints
* fix: fixed screenshots not being created
* fix: updated changelog, pubspec and readme
* feat: updated screenshot manager
* fix: fixed missing lints
* refactor: general refactor
* fix: updated CI config for Github Actions
* fix: format
---
.github/workflows/ci.yml | 26 +-
CHANGELOG.md | 7 +
README.md | 2 +-
analysis_options.yaml | 26 +-
android/build.gradle | 4 +-
example/android/app/build.gradle | 9 +-
.../android/app/src/main/AndroidManifest.xml | 9 +
example/android/build.gradle | 2 +-
example/lib/basic_example.dart | 44 +-
.../lib/change_custom_parameters_example.dart | 66 +--
example/lib/crashlytics_example.dart | 6 +-
example/lib/cupertino_example.dart | 43 +-
example/lib/custom_logger_example.dart | 56 ++-
example/lib/custom_navigator_key_example.dart | 38 +-
example/lib/custom_report_mode_example.dart | 89 ++--
example/lib/discord_handler_example.dart | 48 ++-
example/lib/email_manual_handler_example.dart | 60 +--
example/lib/error_widget_example.dart | 42 +-
example/lib/excluded_parameters_example.dart | 56 +--
...icit_error_report_handler_map_example.dart | 57 +--
...xplicit_error_report_mode_map_example.dart | 59 +--
example/lib/file_example.dart | 72 ++--
example/lib/filter_example.dart | 52 ++-
.../http_handler_update_headers_example.dart | 41 +-
example/lib/local_notification_example.dart | 93 +++--
example/lib/localization_example.dart | 108 +++--
example/lib/main.dart | 40 +-
example/lib/occurences_timeout_example.dart | 57 +--
example/lib/report_modes_example.dart | 34 +-
example/lib/screenshot_example.dart | 59 +--
example/lib/sentry_example.dart | 37 +-
example/lib/slack_handler_example.dart | 53 ++-
example/lib/snackbar_handler_example.dart | 58 +--
example/lib/update_config_example.dart | 51 ++-
example/pubspec.yaml | 11 +-
example/test/widget_test.dart | 30 --
lib/catcher.dart | 22 +-
lib/catcher_web_plugin.dart | 3 +-
lib/core/catcher.dart | 338 +++++++--------
lib/core/catcher_screenshot.dart | 4 +-
lib/core/catcher_screenshot_manager.dart | 82 ++--
lib/handlers/base_email_handler.dart | 83 ++--
lib/handlers/console_handler.dart | 40 +-
lib/handlers/discord_handler.dart | 63 +--
lib/handlers/email_auto_handler.dart | 12 +-
lib/handlers/email_manual_handler.dart | 10 +-
lib/handlers/file_handler.dart | 57 ++-
lib/handlers/http_handler.dart | 34 +-
lib/handlers/sentry_handler.dart | 40 +-
lib/handlers/slack_handler.dart | 50 +--
lib/handlers/snackbar_handler.dart | 8 +-
lib/handlers/toast_handler.dart | 22 +-
lib/mode/dialog_report_mode.dart | 3 +-
lib/mode/page_report_mode.dart | 27 +-
lib/model/catcher_options.dart | 12 +-
lib/model/localization_options.dart | 394 ++++++++++--------
lib/model/report.dart | 18 +-
lib/model/report_handler.dart | 5 +-
lib/utils/catcher_error_widget.dart | 27 +-
lib/utils/catcher_logger.dart | 5 +-
pubspec.yaml | 29 +-
61 files changed, 1619 insertions(+), 1314 deletions(-)
delete mode 100644 example/test/widget_test.dart
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 612a585f..f37cb1b9 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,26 +7,30 @@ on:
jobs:
check-format:
- name: Check format using flutter format
- runs-on: ubuntu-latest
- container: cirrusci/flutter:stable
+ name: Check format using dart format.
+ runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v3
- - name: Check format
- run: flutter format -n --set-exit-if-changed .
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+ - name: Flutter Action
+ uses: subosito/flutter-action@v2
+ - name: Check format
+ run: dart format . --set-exit-if-changed
lint:
name: Lint
runs-on: ubuntu-latest
- container: cirrusci/flutter:stable
steps:
- name: Checkout code
- uses: actions/checkout@v3
+ uses: actions/checkout@v2
+ - name: Flutter Action
+ uses: subosito/flutter-action@v2
+ - name: Install Package Dependencies
+ run: flutter packages get
- name: Get dependencies for example
run: flutter pub get
working-directory: example
- name: Lint using flutter analyze
- run: flutter analyze
+ run: flutter analyze .
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e121735a..784cc5b7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.8.0
+* [BREAKING_CHANGE] Updated min android version to 22 and target/compile version to 34.
+* Updated dependencies version.
+* Replaced lint with very_good_analysis package.
+* Fixed screenshot manger not creating screenshots.
+* Update pub.dev metadata.
+
## 0.7.0
* [BREAKING_CHANGE] Update to Flutter 3 by Nico Mexis (https://github.com/ThexXTURBOXx).
* [BREAKING_CHANGE] Update device_info_plus and added android_id plugin by Nico Mexis (https://github.com/ThexXTURBOXx).
diff --git a/README.md b/README.md
index f8252006..78aaefa1 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Catcher supports Android, iOS, Web, Linux, Windows and MacOS platforms.
Add this line to your **pubspec.yaml**:
```yaml
dependencies:
- catcher: ^0.7.0
+ catcher: ^0.8.0
```
Then run this command:
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 0dfe50c2..6b181fb5 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,22 +1,16 @@
-#include: package:lint/analysis_options_package.yaml
-
-analyzer:
- strong-mode:
- implicit-dynamic: false
+include: package:very_good_analysis/analysis_options.yaml
linter:
rules:
- close_sinks: true
+ public_member_api_docs: false
+ flutter_style_todos: false
+ avoid_final_parameters: false
sort_constructors_first: false
- avoid_classes_with_only_static_members: false
- avoid_void_async: false
- avoid_positional_boolean_parameters: false
avoid_function_literals_in_foreach_calls: false
- prefer_constructors_over_static_methods: false
- sort_unnamed_constructors_first: false
- sized_box_for_whitespace: false
- invalid_dependency: false
- sort_pub_dependencies: false
- import_of_legacy_library_into_null_safe: false
+ avoid_positional_boolean_parameters: false
+ use_if_null_to_convert_nulls_to_bools: false
use_build_context_synchronously: false
- use_setters_to_change_properties: false
\ No newline at end of file
+ prefer_constructors_over_static_methods: false
+ use_setters_to_change_properties: false
+ avoid_print: false
+ sort_pub_dependencies: false
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 18fb2509..dbe17237 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -25,13 +25,13 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
- compileSdkVersion 33
+ compileSdkVersion 34
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
- minSdkVersion 16
+ minSdkVersion 22
}
}
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index db00efd0..eb9ac745 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -26,25 +26,22 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion 33
+ compileSdkVersion 34
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.jhomlala.catcher_example"
- minSdkVersion 16
- targetSdkVersion 33
+ minSdkVersion 22
+ targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
index e615d99d..ad4983e7 100644
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -30,4 +30,13 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
+
+
+
+
+
diff --git a/example/android/build.gradle b/example/android/build.gradle
index 20411f5f..977a71b1 100644
--- a/example/android/build.gradle
+++ b/example/android/build.gradle
@@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
delete rootProject.buildDir
}
diff --git a/example/lib/basic_example.dart b/example/lib/basic_example.dart
index d5b4a157..eb90786f 100644
--- a/example/lib/basic_example.dart
+++ b/example/lib/basic_example.dart
@@ -2,24 +2,29 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
+ final debugOptions = CatcherOptions(DialogReportMode(), [
ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@e mail.com']),
]);
Catcher(
- runAppFunction: () {
- runApp(MyApp());
- },
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ runAppFunction: () {
+ runApp(const MyApp());
+ },
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -33,26 +38,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/change_custom_parameters_example.dart b/example/lib/change_custom_parameters_example.dart
index 48c33a6a..d25e2ac2 100644
--- a/example/lib/change_custom_parameters_example.dart
+++ b/example/lib/change_custom_parameters_example.dart
@@ -4,28 +4,33 @@ import 'package:flutter/material.dart';
late Catcher catcher;
void main() {
- Map customParameters = new Map();
- customParameters["First"] = "First parameter";
- CatcherOptions debugOptions = CatcherOptions(
- PageReportMode(),
- [
- ConsoleHandler(enableCustomParameters: true),
- ],
- customParameters: customParameters);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final customParameters = {};
+ customParameters['First'] = 'First parameter';
+ final debugOptions = CatcherOptions(
+ PageReportMode(),
+ [
+ ConsoleHandler(enableCustomParameters: true),
+ ],
+ customParameters: customParameters,
+ );
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
catcher = Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -39,33 +44,40 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: Column(children: [
- ElevatedButton(
- child: Text("Change custom parameters"),
- onPressed: _changeCustomParameters),
- ElevatedButton(
- child: Text("Generate error"), onPressed: () => generateError())
- ]));
+ return Column(
+ children: [
+ ElevatedButton(
+ onPressed: _changeCustomParameters,
+ child: const Text('Change custom parameters'),
+ ),
+ ElevatedButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ ),
+ ],
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
void _changeCustomParameters() {
- CatcherOptions options = catcher.getCurrentConfig()!;
- options.customParameters["Second"] = "Second parameter";
+ final options = catcher.getCurrentConfig()!;
+ options.customParameters['Second'] = 'Second parameter';
}
}
diff --git a/example/lib/crashlytics_example.dart b/example/lib/crashlytics_example.dart
index e7e340a1..85a72e73 100644
--- a/example/lib/crashlytics_example.dart
+++ b/example/lib/crashlytics_example.dart
@@ -44,9 +44,11 @@ class CrashlyticsHandler extends ReportHandler {
crashlytics.log(_getLogMessage(report));
if (report.errorDetails != null) {
// ignore: cast_nullable_to_non_nullable
- await crashlytics.recordFlutterError(report.errorDetails as FlutterErrorDetails);
+ await crashlytics.recordFlutterError(report.errorDetails as
+ FlutterErrorDetails);
} else {
- await crashlytics.recordError(report.error, report.stackTrace as StackTrace);
+ await crashlytics.recordError(report.error, report.stackTrace as
+ StackTrace);
}
_printLog("Crashlytics report sent");
return true;
diff --git a/example/lib/cupertino_example.dart b/example/lib/cupertino_example.dart
index 68e680ae..c9e71c02 100644
--- a/example/lib/cupertino_example.dart
+++ b/example/lib/cupertino_example.dart
@@ -3,26 +3,33 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
+ final debugOptions = CatcherOptions(DialogReportMode(), [
//EmailManualHandler(["recipient@email.com"]),
- HttpHandler(HttpRequestType.post,
- Uri.parse("https://jsonplaceholder.typicode.com/posts"),
- printLogs: true),
- ConsoleHandler()
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://jsonplaceholder.typicode.com/posts'),
+ printLogs: true,
+ ),
+ ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ rootWidget: const MyApp(),
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -35,9 +42,9 @@ class _MyAppState extends State {
Widget build(BuildContext context) {
return CupertinoApp(
navigatorKey: Catcher.navigatorKey,
- home: CupertinoPageScaffold(
+ home: const CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
- middle: const Text('Cupertino example'),
+ middle: Text('Cupertino example'),
),
child: SafeArea(
child: ChildWidget(),
@@ -48,18 +55,20 @@ class _MyAppState extends State {
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
+ return ColoredBox(
color: Colors.orange,
child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
+ onPressed: generateError,
+ child: const Text('Generate error'),
),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/custom_logger_example.dart b/example/lib/custom_logger_example.dart
index d4f8d25a..051b985e 100644
--- a/example/lib/custom_logger_example.dart
+++ b/example/lib/custom_logger_example.dart
@@ -2,28 +2,33 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(
+ final debugOptions = CatcherOptions(
DialogReportMode(),
[
ConsoleHandler(),
],
logger: CustomCatcherLogger(),
);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- runAppFunction: () {
- runApp(MyApp());
- },
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ runAppFunction: () {
+ runApp(const MyApp());
+ },
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -37,44 +42,49 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
class CustomCatcherLogger extends CatcherLogger {
+ @override
void info(String message) {
- print("Custom Catcher Logger | Info | $message");
+ print('Custom Catcher Logger | Info | $message');
}
+ @override
void fine(String message) {
- print("Custom Catcher Logger | Fine | $message");
+ print('Custom Catcher Logger | Fine | $message');
}
+ @override
void warning(String message) {
- print("Custom Catcher Logger | Warning | $message");
+ print('Custom Catcher Logger | Warning | $message');
}
+ @override
void severe(String message) {
- print("Custom Catcher Logger | Servere | $message");
+ print('Custom Catcher Logger | Servere | $message');
}
}
diff --git a/example/lib/custom_navigator_key_example.dart b/example/lib/custom_navigator_key_example.dart
index 3cdd81b6..99e87790 100644
--- a/example/lib/custom_navigator_key_example.dart
+++ b/example/lib/custom_navigator_key_example.dart
@@ -2,15 +2,15 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
- EmailManualHandler(["recipient@email.com"]),
- ConsoleHandler()
+ final debugOptions = CatcherOptions(DialogReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
+ ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
- GlobalKey navigatorKey = new GlobalKey();
+ final navigatorKey = GlobalKey();
Catcher(
rootWidget: MyApp(navigatorKey),
debugConfig: debugOptions,
@@ -22,10 +22,12 @@ void main() {
class MyApp extends StatefulWidget {
final GlobalKey navigatorKey;
- const MyApp(this.navigatorKey);
+ const MyApp(this.navigatorKey, {Key? key}) : super(key: key);
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -39,23 +41,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: widget.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/custom_report_mode_example.dart b/example/lib/custom_report_mode_example.dart
index 595a9805..5d36ab30 100644
--- a/example/lib/custom_report_mode_example.dart
+++ b/example/lib/custom_report_mode_example.dart
@@ -3,24 +3,28 @@ import 'package:catcher/model/platform_type.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(CustomPageReportMode(), [
- EmailManualHandler(["recipient@email.com"]),
- ConsoleHandler()
+ final debugOptions = CatcherOptions(CustomPageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
+ ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -34,26 +38,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
@@ -66,9 +71,12 @@ class CustomPageReportMode extends ReportMode {
}
}
- void _navigateToPageWidget(Report report, BuildContext context) async {
+ Future _navigateToPageWidget(
+ Report report,
+ BuildContext context,
+ ) async {
await Future.delayed(Duration.zero);
- Navigator.push(
+ await Navigator.push(
context,
MaterialPageRoute(builder: (context) => CustomPage(this, report)),
);
@@ -88,30 +96,31 @@ class CustomPage extends StatelessWidget {
final ReportMode reportMode;
final Report report;
- CustomPage(this.reportMode, this.report);
+ const CustomPage(this.reportMode, this.report, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
- appBar: AppBar(
- title: Text("Test"),
- ),
- body: Container(
- child: Row(children: [
- ElevatedButton(
- child: Text("Send report"),
- onPressed: () {
- reportMode.onActionConfirmed(report);
- },
- ),
- ElevatedButton(
- child: Text("Cancel report"),
- onPressed: () {
- reportMode.onActionRejected(report);
- Navigator.pop(context);
- },
- )
- ]),
- ));
+ appBar: AppBar(
+ title: const Text('Test'),
+ ),
+ body: Row(
+ children: [
+ ElevatedButton(
+ child: const Text('Send report'),
+ onPressed: () {
+ reportMode.onActionConfirmed(report);
+ },
+ ),
+ ElevatedButton(
+ child: const Text('Cancel report'),
+ onPressed: () {
+ reportMode.onActionRejected(report);
+ Navigator.pop(context);
+ },
+ ),
+ ],
+ ),
+ );
}
}
diff --git a/example/lib/discord_handler_example.dart b/example/lib/discord_handler_example.dart
index 4bb452f3..b9da1d0f 100644
--- a/example/lib/discord_handler_example.dart
+++ b/example/lib/discord_handler_example.dart
@@ -2,28 +2,34 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(SilentReportMode(), [
- DiscordHandler("",
- enableDeviceParameters: true,
- enableApplicationParameters: true,
- enableCustomParameters: true,
- enableStackTrace: true,
- printLogs: true),
+ final debugOptions = CatcherOptions(SilentReportMode(), [
+ DiscordHandler(
+ '',
+ enableDeviceParameters: true,
+ enableApplicationParameters: true,
+ enableCustomParameters: true,
+ enableStackTrace: true,
+ printLogs: true,
+ ),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -37,23 +43,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/email_manual_handler_example.dart b/example/lib/email_manual_handler_example.dart
index f13c4e0b..03d5f929 100644
--- a/example/lib/email_manual_handler_example.dart
+++ b/example/lib/email_manual_handler_example.dart
@@ -2,30 +2,35 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
- EmailManualHandler(["email1@email.com", "email2@email.com"],
- enableDeviceParameters: true,
- enableStackTrace: true,
- enableCustomParameters: true,
- enableApplicationParameters: true,
- sendHtml: true,
- emailTitle: "Sample Title",
- emailHeader: "Sample Header",
- printLogs: true)
- ], customParameters: {
- "Test": "Test12345",
- "Test2": "Test54321"
- });
+ final debugOptions = CatcherOptions(
+ DialogReportMode(),
+ [
+ EmailManualHandler(
+ ['email1@email.com', 'email2@email.com'],
+ emailTitle: 'Sample Title',
+ emailHeader: 'Sample Header',
+ printLogs: true,
+ ),
+ ],
+ customParameters: {
+ 'Test': 'Test12345',
+ 'Test2': 'Test54321',
+ },
+ );
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -39,26 +44,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
- throw "Test exception";
+ Future generateError() async {
+ throw Exception('Test exception');
}
}
diff --git a/example/lib/error_widget_example.dart b/example/lib/error_widget_example.dart
index 57ced73b..4e53a1d6 100644
--- a/example/lib/error_widget_example.dart
+++ b/example/lib/error_widget_example.dart
@@ -2,23 +2,27 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(SilentReportMode(), [
+ final debugOptions = CatcherOptions(SilentReportMode(), [
ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -33,10 +37,9 @@ class _MyAppState extends State {
navigatorKey: Catcher.navigatorKey,
builder: (BuildContext context, Widget? widget) {
Catcher.addDefaultErrorWidget(
- showStacktrace: true,
- title: "Custom title",
- description: "Custom description",
- maxWidthForSmallMode: 150);
+ title: 'Custom title',
+ description: 'Custom description',
+ );
return widget!;
},
home: Scaffold(
@@ -55,23 +58,26 @@ class _MyAppState extends State {
///Trigger "small" mode
Widget _buildSmallErrorWidget() {
- return GridView.count(crossAxisCount: 3, children: [
- ChildWidget(),
- ChildWidget(),
- ChildWidget(),
- ]);
+ return GridView.count(
+ crossAxisCount: 3,
+ children: const [
+ ChildWidget(),
+ ChildWidget(),
+ ChildWidget(),
+ ],
+ );
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(child: Text("Test"), onPressed: generateError),
- );
+ return TextButton(onPressed: generateError, child: const Text('Test'));
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/excluded_parameters_example.dart b/example/lib/excluded_parameters_example.dart
index c3843cfe..32dfee77 100644
--- a/example/lib/excluded_parameters_example.dart
+++ b/example/lib/excluded_parameters_example.dart
@@ -2,35 +2,42 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(
+ final debugOptions = CatcherOptions(
DialogReportMode(),
[
//EmailManualHandler(["recipient@email.com"]),
ToastHandler(),
- HttpHandler(HttpRequestType.post,
- Uri.parse("https://jsonplaceholder.typicode.com/posts"),
- printLogs: true),
- ConsoleHandler()
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://jsonplaceholder.typicode.com/posts'),
+ printLogs: true,
+ ),
+ ConsoleHandler(),
],
//Exclude these parameters from report. These params are device info params.
- excludedParameters: ["androidId", "model"],
+ excludedParameters: ['androidId', 'model'],
);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- runAppFunction: () {
- runApp(MyApp());
- },
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ runAppFunction: () {
+ runApp(const MyApp());
+ },
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -44,26 +51,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/explicit_error_report_handler_map_example.dart b/example/lib/explicit_error_report_handler_map_example.dart
index c387a909..d6aa3ab4 100644
--- a/example/lib/explicit_error_report_handler_map_example.dart
+++ b/example/lib/explicit_error_report_handler_map_example.dart
@@ -2,29 +2,37 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- var explicitMap = {"FormatException": ConsoleHandler()};
- CatcherOptions debugOptions = CatcherOptions(
- DialogReportMode(),
- [
- ConsoleHandler(),
- HttpHandler(HttpRequestType.post, Uri.parse("https://httpstat.us/200"),
- printLogs: true)
- ],
- explicitExceptionHandlersMap: explicitMap);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final explicitMap = {'FormatException': ConsoleHandler()};
+ final debugOptions = CatcherOptions(
+ DialogReportMode(),
+ [
+ ConsoleHandler(),
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://httpstat.us/200'),
+ printLogs: true,
+ ),
+ ],
+ explicitExceptionHandlersMap: explicitMap,
+ );
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -38,26 +46,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
- throw new FormatException("Example Error");
+ Future generateError() async {
+ throw const FormatException('Example Error');
}
}
diff --git a/example/lib/explicit_error_report_mode_map_example.dart b/example/lib/explicit_error_report_mode_map_example.dart
index 9507da87..3a93dfd9 100644
--- a/example/lib/explicit_error_report_mode_map_example.dart
+++ b/example/lib/explicit_error_report_mode_map_example.dart
@@ -2,30 +2,37 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- var explicitReportModesMap = {"FormatException": PageReportMode()};
- CatcherOptions debugOptions = CatcherOptions(
+ final explicitReportModesMap = {'FormatException': PageReportMode()};
+ final debugOptions = CatcherOptions(
DialogReportMode(),
[
ConsoleHandler(),
- HttpHandler(HttpRequestType.post, Uri.parse("https://httpstat.us/200"),
- printLogs: true)
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://httpstat.us/200'),
+ printLogs: true,
+ ),
],
explicitExceptionReportModesMap: explicitReportModesMap,
);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -39,35 +46,39 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: Column(children: [
+ return Column(
+ children: [
TextButton(
- child: Text("Generate first error"),
- onPressed: () => generateFirstError()),
+ onPressed: generateFirstError,
+ child: const Text('Generate first error'),
+ ),
TextButton(
- child: Text("Generate second error"),
- onPressed: () => generateSecondError(),
- )
- ]),
+ onPressed: generateSecondError,
+ child: const Text('Generate second error'),
+ ),
+ ],
);
}
- void generateFirstError() async {
- throw new FormatException("Example Error");
+ Future generateFirstError() async {
+ throw const FormatException('Example Error');
}
- void generateSecondError() async {
- throw new ArgumentError("Normal error");
+ Future generateSecondError() async {
+ throw ArgumentError('Normal error');
}
}
diff --git a/example/lib/file_example.dart b/example/lib/file_example.dart
index 3354e224..88223268 100644
--- a/example/lib/file_example.dart
+++ b/example/lib/file_example.dart
@@ -6,7 +6,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
void main() async {
- var catcher = Catcher(rootWidget: MyApp(), ensureInitialized: true);
+ final catcher = Catcher(rootWidget: const MyApp(), ensureInitialized: true);
Directory? externalDir;
if (Platform.isAndroid || Platform.isIOS) {
externalDir = await getExternalStorageDirectory();
@@ -14,23 +14,30 @@ void main() async {
if (Platform.isMacOS) {
externalDir = await getApplicationDocumentsDirectory();
}
- String path = "";
+ var path = '';
if (externalDir != null) {
- path = externalDir.path.toString() + "/log.txt";
+ path = '${externalDir.path}/log.txt';
}
- print("PATH: " + path);
- CatcherOptions debugOptions = CatcherOptions(
- DialogReportMode(), [FileHandler(File(path), printLogs: true)]);
- CatcherOptions releaseOptions =
+ final debugOptions = CatcherOptions(
+ DialogReportMode(),
+ [FileHandler(File(path), printLogs: true)],
+ );
+ final releaseOptions =
CatcherOptions(DialogReportMode(), [FileHandler(File(path))]);
catcher.updateConfig(
- debugConfig: debugOptions, releaseConfig: releaseOptions);
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -44,42 +51,43 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: Column(
- children: [
- TextButton(
- child: Text("Check permission"),
- onPressed: checkPermissions,
- ),
- TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- )
- ],
- ),
+ return Column(
+ children: [
+ TextButton(
+ onPressed: checkPermissions,
+ child: const Text('Check permission'),
+ ),
+ TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ ),
+ ],
);
}
- void checkPermissions() async {
- var status = await Permission.storage.status;
- print("Status: $status");
+ Future checkPermissions() async {
+ final status = await Permission.storage.status;
+ print('Status: $status');
if (!status.isGranted) {
- print("Requested");
+ print('Requested');
}
}
- void generateError() async {
- throw "Test exception";
+ Future generateError() async {
+ throw Exception('Test exception');
}
}
diff --git a/example/lib/filter_example.dart b/example/lib/filter_example.dart
index c9e51f60..8a137323 100644
--- a/example/lib/filter_example.dart
+++ b/example/lib/filter_example.dart
@@ -2,23 +2,27 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
- ConsoleHandler(),
- ToastHandler(),
- ], filterFunction: (Report report) {
- if (report.error is ArgumentError) {
- return false;
- } else {
- return true;
- }
- });
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final debugOptions = CatcherOptions(
+ DialogReportMode(),
+ [
+ ConsoleHandler(),
+ ToastHandler(),
+ ],
+ filterFunction: (Report report) {
+ if (report.error is ArgumentError) {
+ return false;
+ } else {
+ return true;
+ }
+ },
+ );
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
runAppFunction: () {
- runApp(MyApp());
+ runApp(const MyApp());
},
debugConfig: debugOptions,
releaseConfig: releaseOptions,
@@ -26,8 +30,12 @@ void main() {
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -47,12 +55,12 @@ class _MyAppState extends State {
body: Column(
children: [
TextButton(
- child: Text("Generate normal error"),
- onPressed: () => generateNormalError(),
+ onPressed: generateNormalError,
+ child: const Text('Generate normal error'),
),
TextButton(
- child: Text("Generate filtered error"),
- onPressed: () => generateFilteredError(),
+ onPressed: generateFilteredError,
+ child: const Text('Generate filtered error'),
),
],
),
@@ -60,11 +68,11 @@ class _MyAppState extends State {
);
}
- void generateNormalError() async {
- throw StateError("Example error");
+ Future generateNormalError() async {
+ throw StateError('Example error');
}
- void generateFilteredError() async {
- throw ArgumentError("Example error");
+ Future generateFilteredError() async {
+ throw ArgumentError('Example error');
}
}
diff --git a/example/lib/http_handler_update_headers_example.dart b/example/lib/http_handler_update_headers_example.dart
index e53ce124..e0c7e4f0 100644
--- a/example/lib/http_handler_update_headers_example.dart
+++ b/example/lib/http_handler_update_headers_example.dart
@@ -3,25 +3,24 @@ import 'package:flutter/material.dart';
void main() {
///Http handler instance
- var httpHandler = HttpHandler(
+ final httpHandler = HttpHandler(
HttpRequestType.post,
- Uri.parse("https://jsonplaceholder.typicode.com/posts"),
+ Uri.parse('https://jsonplaceholder.typicode.com/posts'),
printLogs: true,
- enableCustomParameters: false,
enableStackTrace: false,
enableApplicationParameters: false,
enableDeviceParameters: false,
);
///Init catcher
- CatcherOptions debugOptions =
+ final debugOptions =
CatcherOptions(DialogReportMode(), [httpHandler, ConsoleHandler()]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
@@ -29,12 +28,16 @@ void main() {
///At some point of time, you're updating headers:
httpHandler.headers.clear();
- httpHandler.headers["my_header"] = "Test";
+ httpHandler.headers['my_header'] = 'Test';
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -48,23 +51,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/local_notification_example.dart b/example/lib/local_notification_example.dart
index eb90a24e..ba816ce9 100644
--- a/example/lib/local_notification_example.dart
+++ b/example/lib/local_notification_example.dart
@@ -4,24 +4,28 @@ import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(NotificationReportMode(), [
- EmailManualHandler(["recipient@email.com"]),
- ConsoleHandler()
+ final debugOptions = CatcherOptions(NotificationReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
+ ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -38,21 +42,24 @@ class _MyAppState extends State {
appBar: AppBar(
title: const Text('Plugin example app'),
),
- body: ChildWidget(),
+ body: const ChildWidget(),
),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
@@ -66,14 +73,15 @@ class NotificationReportMode extends ReportMode {
final String channelDescription;
final String icon;
- NotificationReportMode(
- {this.channelId = "Catcher",
- this.channelName = "Catcher",
- this.channelDescription = "Catcher default channel",
- this.icon = "@mipmap/ic_launcher"});
+ NotificationReportMode({
+ this.channelId = 'Catcher',
+ this.channelName = 'Catcher',
+ this.channelDescription = 'Catcher default channel',
+ this.icon = '@mipmap/ic_launcher',
+ });
@override
- setReportModeAction(ReportModeAction reportModeAction) {
+ void setReportModeAction(ReportModeAction reportModeAction) {
_initializeNotificationsPlugin();
return super.setReportModeAction(reportModeAction);
}
@@ -83,15 +91,18 @@ class NotificationReportMode extends ReportMode {
/// mode, only notification report mode from second catcher options will be
/// initialized correctly. That's why init is delayed.
void _initializeNotificationsPlugin() {
- _flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
- var initializationSettingsAndroid = new AndroidInitializationSettings(icon);
- var initializationSettingsIOS = new IOSInitializationSettings();
- var initializationSettings = new InitializationSettings(
+ _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
+ final initializationSettingsAndroid = AndroidInitializationSettings(icon);
+ const initializationSettingsIOS = DarwinInitializationSettings();
+ final initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
);
- _flutterLocalNotificationsPlugin.initialize(initializationSettings,
- onSelectNotification: onSelectedNotification);
+
+ _flutterLocalNotificationsPlugin.initialize(
+ initializationSettings,
+ onDidReceiveNotificationResponse: onSelectedNotification,
+ );
}
@override
@@ -100,28 +111,30 @@ class NotificationReportMode extends ReportMode {
_sendNotification();
}
- Future onSelectedNotification(String? payload) {
+ Future onSelectedNotification(NotificationResponse response) {
onActionConfirmed(_lastReport);
return Future.value(0);
}
- void _sendNotification() async {
- var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
- channelId, channelName,
- channelDescription: channelDescription,
- importance: Importance.defaultImportance,
- priority: Priority.defaultPriority);
- var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
- var platformChannelSpecifics = new NotificationDetails(
- android: androidPlatformChannelSpecifics,
- iOS: iOSPlatformChannelSpecifics);
+ Future _sendNotification() async {
+ final androidPlatformChannelSpecifics = AndroidNotificationDetails(
+ channelId,
+ channelName,
+ channelDescription: channelDescription,
+ );
+ const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
+ final platformChannelSpecifics = NotificationDetails(
+ android: androidPlatformChannelSpecifics,
+ iOS: iOSPlatformChannelSpecifics,
+ );
await _flutterLocalNotificationsPlugin.show(
- 0,
- localizationOptions.notificationReportModeTitle,
- localizationOptions.notificationReportModeContent,
- platformChannelSpecifics,
- payload: "");
+ 0,
+ localizationOptions.notificationReportModeTitle,
+ localizationOptions.notificationReportModeContent,
+ platformChannelSpecifics,
+ payload: '',
+ );
}
@override
diff --git a/example/lib/localization_example.dart b/example/lib/localization_example.dart
index cd41e24c..0e4951ba 100644
--- a/example/lib/localization_example.dart
+++ b/example/lib/localization_example.dart
@@ -3,46 +3,64 @@ import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
- ConsoleHandler(),
- HttpHandler(HttpRequestType.post, Uri.parse("https://httpstat.us/200"),
- printLogs: true)
- ], localizationOptions: [
- LocalizationOptions(
- "en",
- dialogReportModeTitle: "Custom message",
- dialogReportModeDescription: "Custom message",
- dialogReportModeAccept: "YES",
- dialogReportModeCancel: "NO",
- ),
- LocalizationOptions("pl",
- notificationReportModeTitle: "Wystąpił błąd aplikacji",
+ final debugOptions = CatcherOptions(
+ DialogReportMode(),
+ [
+ ConsoleHandler(),
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://httpstat.us/200'),
+ printLogs: true,
+ ),
+ ],
+ localizationOptions: [
+ LocalizationOptions(
+ 'en',
+ dialogReportModeTitle: 'Custom message',
+ dialogReportModeDescription: 'Custom message',
+ dialogReportModeAccept: 'YES',
+ dialogReportModeCancel: 'NO',
+ ),
+ LocalizationOptions(
+ 'pl',
+ notificationReportModeTitle: 'Wystąpił błąd aplikacji',
notificationReportModeContent:
- "Naciśnij tutaj aby wysłać raport do zespołu wpsarcia",
- dialogReportModeTitle: "Błąd aplikacji",
+ 'Naciśnij tutaj aby wysłać report do zespołu wpsarcia',
+ dialogReportModeTitle: 'Błąd appliance',
dialogReportModeDescription:
- "Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby wysłać raport lub odrzuć aby odrzucić raport.",
- dialogReportModeAccept: "Akceptuj",
- dialogReportModeCancel: "Odrzuć",
- pageReportModeTitle: "Błąd aplikacji",
+ 'Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest '
+ 'gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj '
+ 'aby wysłać raport lub odrzuć aby odrzucić raport.',
+ dialogReportModeAccept: 'Akceptuj',
+ dialogReportModeCancel: 'Odrzuć',
+ pageReportModeTitle: 'Błąd aplikacji',
pageReportModeDescription:
- "Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby wysłać raport lub odrzuć aby odrzucić raport.",
- pageReportModeAccept: "Akceptuj",
- pageReportModeCancel: "Odrzuć")
- ]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ 'Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest '
+ 'gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby'
+ ' wysłać raport lub odrzuć aby odrzucić raport.',
+ pageReportModeAccept: 'Akceptuj',
+ pageReportModeCancel: 'Odrzuć',
+ ),
+ ],
+ );
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ rootWidget: const MyApp(),
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -55,32 +73,36 @@ class _MyAppState extends State {
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
- localizationsDelegates: [
+ localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
- supportedLocales: [
- const Locale('en', 'US'),
- const Locale('pl', 'PL'),
+ supportedLocales: const [
+ Locale('en', 'US'),
+ Locale('pl', 'PL'),
],
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
- throw "Test exception";
+ Future generateError() async {
+ throw Exception('Test exception');
}
}
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 50743f36..04cf1d89 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -4,29 +4,31 @@ import 'package:sentry/sentry.dart';
void main() {
///Configure your debug options (settings used in development mode)
- CatcherOptions debugOptions = CatcherOptions(
+ final debugOptions = CatcherOptions(
///Show information about caught error in dialog
DialogReportMode(),
[
///Send logs to HTTP server
- HttpHandler(HttpRequestType.post,
- Uri.parse("https://jsonplaceholder.typicode.com/posts"),
- printLogs: true),
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://jsonplaceholder.typicode.com/posts'),
+ printLogs: true,
+ ),
///Print logs in console
- ConsoleHandler()
+ ConsoleHandler(),
],
);
///Configure your production options (settings used in release mode)
- CatcherOptions releaseOptions = CatcherOptions(
+ final releaseOptions = CatcherOptions(
///Show new page with information about caught error
PageReportMode(),
[
///Send logs to Sentry
SentryHandler(
SentryClient(
- SentryOptions(dsn: ""),
+ SentryOptions(dsn: ''),
),
),
@@ -39,7 +41,7 @@ void main() {
///error to your configured services!
Catcher(
runAppFunction: () {
- runApp(MyApp());
+ runApp(const MyApp());
},
debugConfig: debugOptions,
releaseConfig: releaseOptions,
@@ -47,8 +49,12 @@ void main() {
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -65,27 +71,27 @@ class _MyAppState extends State {
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
appBar: AppBar(
- title: const Text("Catcher example"),
+ title: const Text('Catcher example'),
),
- body: ChildWidget(),
+ body: const ChildWidget(),
),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
///Simply just trigger some error.
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/occurences_timeout_example.dart b/example/lib/occurences_timeout_example.dart
index 7471f793..57ab837a 100644
--- a/example/lib/occurences_timeout_example.dart
+++ b/example/lib/occurences_timeout_example.dart
@@ -2,28 +2,34 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(
- SilentReportMode(),
- [
- ConsoleHandler(),
- ToastHandler(),
- ],
- reportOccurrenceTimeout: 30000);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final debugOptions = CatcherOptions(
+ SilentReportMode(),
+ [
+ ConsoleHandler(),
+ ToastHandler(),
+ ],
+ reportOccurrenceTimeout: 30000,
+ );
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- runAppFunction: () {
- runApp(MyApp());
- },
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ runAppFunction: () {
+ runApp(const MyApp());
+ },
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -37,26 +43,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/report_modes_example.dart b/example/lib/report_modes_example.dart
index 6bcab1ce..5a33a89b 100644
--- a/example/lib/report_modes_example.dart
+++ b/example/lib/report_modes_example.dart
@@ -16,16 +16,20 @@ void main() {
cancelText: "Back");*/
//page:
- ReportMode reportMode = PageReportMode(showStackTrace: false);
+ final ReportMode reportMode = PageReportMode(showStackTrace: false);
- CatcherOptions debugOptions = CatcherOptions(reportMode, [ConsoleHandler()]);
+ final debugOptions = CatcherOptions(reportMode, [ConsoleHandler()]);
- Catcher(rootWidget: MyApp(), debugConfig: debugOptions);
+ Catcher(rootWidget: const MyApp(), debugConfig: debugOptions);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -39,23 +43,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
- throw "Test exception";
+ Future generateError() async {
+ Catcher.sendTestException();
}
}
diff --git a/example/lib/screenshot_example.dart b/example/lib/screenshot_example.dart
index 56c83f22..7a0e958c 100644
--- a/example/lib/screenshot_example.dart
+++ b/example/lib/screenshot_example.dart
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
void main() async {
- var catcher = Catcher(rootWidget: MyApp(), ensureInitialized: true);
+ final catcher = Catcher(rootWidget: const MyApp(), ensureInitialized: true);
Directory? externalDir;
if (Platform.isAndroid) {
externalDir = await getExternalStorageDirectory();
@@ -13,27 +13,24 @@ void main() async {
if (Platform.isIOS || Platform.isMacOS) {
externalDir = await getApplicationDocumentsDirectory();
}
- String path = "";
+ var path = '';
if (externalDir != null) {
- path = externalDir.path.toString();
+ path = externalDir.path;
}
- CatcherOptions debugOptions = CatcherOptions(
+ final debugOptions = CatcherOptions(
DialogReportMode(),
[
- EmailManualHandler(["email1@email.com", "email2@email.com"],
- enableDeviceParameters: true,
- enableStackTrace: true,
- enableCustomParameters: true,
- enableApplicationParameters: true,
- sendHtml: true,
- emailTitle: "Sample Title",
- emailHeader: "Sample Header",
- printLogs: true)
+ EmailManualHandler(
+ ['email1@email.com', 'email2@email.com'],
+ emailTitle: 'Sample Title',
+ emailHeader: 'Sample Header',
+ printLogs: true,
+ ),
],
customParameters: {
- "Test": "Test12345",
- "Test2": "Test54321"
+ 'Test': 'Test12345',
+ 'Test2': 'Test54321',
},
screenshotsPath: path,
);
@@ -42,8 +39,12 @@ void main() async {
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -56,13 +57,13 @@ class _MyAppState extends State {
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
- home: CatcherScreenshot(
- catcher: Catcher.getInstance(),
- child: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget(),
+ home: Scaffold(
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: CatcherScreenshot(
+ catcher: Catcher.getInstance(),
+ child: const ChildWidget(),
),
),
);
@@ -70,17 +71,17 @@ class _MyAppState extends State {
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/sentry_example.dart b/example/lib/sentry_example.dart
index b514948c..b2b813df 100644
--- a/example/lib/sentry_example.dart
+++ b/example/lib/sentry_example.dart
@@ -3,26 +3,29 @@ import 'package:flutter/material.dart';
import 'package:sentry/sentry.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
+ final debugOptions = CatcherOptions(DialogReportMode(), [
SentryHandler(
SentryClient(SentryOptions(dsn: 'YOUR DSN HERE')),
- printLogs: true,
- )
+ ),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -36,23 +39,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/slack_handler_example.dart b/example/lib/slack_handler_example.dart
index e0c8e334..14ebc12b 100644
--- a/example/lib/slack_handler_example.dart
+++ b/example/lib/slack_handler_example.dart
@@ -2,31 +2,38 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(SilentReportMode(), [
- SlackHandler("", "#catcher",
- username: "CatcherTest",
- iconEmoji: ":thinking_face:",
- enableDeviceParameters: true,
- enableApplicationParameters: true,
- enableCustomParameters: true,
- enableStackTrace: true,
- printLogs: true),
+ final debugOptions = CatcherOptions(SilentReportMode(), [
+ SlackHandler(
+ '',
+ '#catcher',
+ username: 'CatcherTest',
+ iconEmoji: ':thinking_face:',
+ enableDeviceParameters: true,
+ enableApplicationParameters: true,
+ enableCustomParameters: true,
+ enableStackTrace: true,
+ printLogs: true,
+ ),
//ConsoleHandler()
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -40,23 +47,27 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"), onPressed: () => generateError()));
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
+ );
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/snackbar_handler_example.dart b/example/lib/snackbar_handler_example.dart
index 41f389a0..d1e2d9cc 100644
--- a/example/lib/snackbar_handler_example.dart
+++ b/example/lib/snackbar_handler_example.dart
@@ -2,33 +2,34 @@ import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
+ final debugOptions = CatcherOptions(DialogReportMode(), [
SnackbarHandler(
- Duration(seconds: 5),
+ const Duration(seconds: 5),
backgroundColor: Colors.green,
elevation: 2,
- margin: EdgeInsets.all(16),
- padding: EdgeInsets.all(16),
+ margin: const EdgeInsets.all(16),
+ padding: const EdgeInsets.all(16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
behavior: SnackBarBehavior.floating,
action: SnackBarAction(
- label: "Button",
- onPressed: () {
- print("Click!");
- }),
- textStyle: TextStyle(
+ label: 'Button',
+ onPressed: () {
+ print('Click!');
+ },
+ ),
+ textStyle: const TextStyle(
color: Colors.white,
fontSize: 16,
),
),
]);
- CatcherOptions releaseOptions = CatcherOptions(DialogReportMode(), [
+ final releaseOptions = CatcherOptions(DialogReportMode(), [
SnackbarHandler(
- Duration(seconds: 5),
+ const Duration(seconds: 5),
backgroundColor: Colors.green,
elevation: 2,
- padding: EdgeInsets.all(16),
- textStyle: TextStyle(
+ padding: const EdgeInsets.all(16),
+ textStyle: const TextStyle(
color: Colors.white,
fontSize: 16,
),
@@ -36,16 +37,21 @@ void main() {
]);
Catcher(
- runAppFunction: () {
- runApp(MyApp());
- },
- debugConfig: debugOptions,
- releaseConfig: releaseOptions);
+ runAppFunction: () {
+ runApp(const MyApp());
+ },
+ debugConfig: debugOptions,
+ releaseConfig: releaseOptions,
+ );
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -62,24 +68,24 @@ class _MyAppState extends State {
appBar: AppBar(
title: const Text('Snackbar handler example'),
),
- body: ChildWidget(),
+ body: const ChildWidget(),
),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
- ),
+ return TextButton(
+ onPressed: generateError,
+ child: const Text('Generate error'),
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
}
diff --git a/example/lib/update_config_example.dart b/example/lib/update_config_example.dart
index e847ced5..0e65097a 100644
--- a/example/lib/update_config_example.dart
+++ b/example/lib/update_config_example.dart
@@ -4,27 +4,33 @@ import 'package:flutter/material.dart';
late Catcher catcher;
void main() {
- CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
+ final debugOptions = CatcherOptions(DialogReportMode(), [
//EmailManualHandler(["recipient@email.com"]),
- HttpHandler(HttpRequestType.post,
- Uri.parse("https://jsonplaceholder.typicode.com/posts"),
- printLogs: true),
- ConsoleHandler()
+ HttpHandler(
+ HttpRequestType.post,
+ Uri.parse('https://jsonplaceholder.typicode.com/posts'),
+ printLogs: true,
+ ),
+ ConsoleHandler(),
]);
- CatcherOptions releaseOptions = CatcherOptions(PageReportMode(), [
- EmailManualHandler(["recipient@email.com"])
+ final releaseOptions = CatcherOptions(PageReportMode(), [
+ EmailManualHandler(['recipient@email.com']),
]);
catcher = Catcher(
- rootWidget: MyApp(),
+ rootWidget: const MyApp(),
debugConfig: debugOptions,
releaseConfig: releaseOptions,
);
}
class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
@override
- _MyAppState createState() => _MyAppState();
+ State createState() {
+ return _MyAppState();
+ }
}
class _MyAppState extends State {
@@ -38,32 +44,35 @@ class _MyAppState extends State {
return MaterialApp(
navigatorKey: Catcher.navigatorKey,
home: Scaffold(
- appBar: AppBar(
- title: const Text('Plugin example app'),
- ),
- body: ChildWidget()),
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: const ChildWidget(),
+ ),
);
}
}
class ChildWidget extends StatelessWidget {
+ const ChildWidget({Key? key}) : super(key: key);
+
@override
Widget build(BuildContext context) {
- return Container(
- child: Row(children: [
+ return Row(
+ children: [
TextButton(
- child: Text("Change config"),
- onPressed: () => changeConfig(),
+ onPressed: changeConfig,
+ child: const Text('Change config'),
),
TextButton(
- child: Text("Generate error"),
- onPressed: () => generateError(),
+ onPressed: generateError,
+ child: const Text('Generate error'),
),
- ]),
+ ],
);
}
- void generateError() async {
+ Future generateError() async {
Catcher.sendTestException();
}
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index acc185af..2d8ffbf5 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -27,9 +27,12 @@ dependencies:
sdk: flutter
path_provider: ^2.0.1
path_provider_macos: ^2.0.0
- dio: ^4.0.0
- permission_handler: ^8.1.4+2
- flutter_local_notifications: ^9.0.0
+ dio: ^5.3.3
+ permission_handler: ^11.0.1
+ flutter_local_notifications: ^16.1.0
+ sentry: ^7.12.0
+ catcher:
+ path: ../
# The following adds the Cupertino Icons font to your application.
@@ -39,8 +42,6 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
- catcher:
- path: ../
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart
deleted file mode 100644
index 07fcac50..00000000
--- a/example/test/widget_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// This is a basic Flutter widget test.
-//
-// To perform an interaction with a widget in your test, use the WidgetTester
-// utility that Flutter provides. For example, you can send tap and scroll
-// gestures. You can also use WidgetTester to find child widgets in the widget
-// tree, read text, and verify that the values of widget properties are correct.
-
-import 'package:flutter/material.dart';
-import 'package:flutter_test/flutter_test.dart';
-
-import 'package:catcher_example/main.dart';
-
-void main() {
- testWidgets('Counter increments smoke test', (WidgetTester tester) async {
- // Build our app and trigger a frame.
- await tester.pumpWidget(MyApp());
-
- // Verify that our counter starts at 0.
- expect(find.text('0'), findsOneWidget);
- expect(find.text('1'), findsNothing);
-
- // Tap the '+' icon and trigger a frame.
- await tester.tap(find.byIcon(Icons.add));
- await tester.pump();
-
- // Verify that our counter has incremented.
- expect(find.text('0'), findsNothing);
- expect(find.text('1'), findsOneWidget);
- });
-}
diff --git a/lib/catcher.dart b/lib/catcher.dart
index 7c98cdbe..342096aa 100644
--- a/lib/catcher.dart
+++ b/lib/catcher.dart
@@ -1,17 +1,15 @@
-library catcher;
-
export 'package:catcher/core/catcher.dart';
export 'package:catcher/core/catcher_screenshot.dart';
-export "package:catcher/handlers/console_handler.dart";
-export "package:catcher/handlers/discord_handler.dart";
-export "package:catcher/handlers/email_auto_handler.dart";
-export "package:catcher/handlers/email_manual_handler.dart";
-export "package:catcher/handlers/file_handler.dart";
-export "package:catcher/handlers/http_handler.dart";
-export "package:catcher/handlers/sentry_handler.dart";
-export "package:catcher/handlers/slack_handler.dart";
-export "package:catcher/handlers/snackbar_handler.dart";
-export "package:catcher/handlers/toast_handler.dart";
+export 'package:catcher/handlers/console_handler.dart';
+export 'package:catcher/handlers/discord_handler.dart';
+export 'package:catcher/handlers/email_auto_handler.dart';
+export 'package:catcher/handlers/email_manual_handler.dart';
+export 'package:catcher/handlers/file_handler.dart';
+export 'package:catcher/handlers/http_handler.dart';
+export 'package:catcher/handlers/sentry_handler.dart';
+export 'package:catcher/handlers/slack_handler.dart';
+export 'package:catcher/handlers/snackbar_handler.dart';
+export 'package:catcher/handlers/toast_handler.dart';
export 'package:catcher/mode/dialog_report_mode.dart';
export 'package:catcher/mode/page_report_mode.dart';
export 'package:catcher/mode/report_mode_action_confirmed.dart';
diff --git a/lib/catcher_web_plugin.dart b/lib/catcher_web_plugin.dart
index 12f8dc9d..aacd1fba 100644
--- a/lib/catcher_web_plugin.dart
+++ b/lib/catcher_web_plugin.dart
@@ -1,11 +1,12 @@
import 'dart:async';
+
import 'package:flutter/services.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
/// A web implementation of the Catcher plugin.
class CatcherWebPlugin {
static void registerWith(Registrar registrar) {
- final MethodChannel channel = MethodChannel(
+ final channel = MethodChannel(
'catcher',
const StandardMethodCodec(),
registrar,
diff --git a/lib/core/catcher.dart b/lib/core/catcher.dart
index ffe260ea..dfd18da1 100644
--- a/lib/core/catcher.dart
+++ b/lib/core/catcher.dart
@@ -41,7 +41,8 @@ class Catcher with ReportModeAction {
/// Should catcher logs be enabled
final bool enableLogger;
- /// Should catcher run WidgetsFlutterBinding.ensureInitialized() during initialization.
+ /// Should catcher run WidgetsFlutterBinding.ensureInitialized() during
+ /// initialization.
final bool ensureInitialized;
late CatcherOptions _currentConfig;
@@ -50,7 +51,7 @@ class Catcher with ReportModeAction {
final Map _deviceParameters = {};
final Map _applicationParameters = {};
final List _cachedReports = [];
- final Map _reportsOcurrenceMap = {};
+ final Map _reportsOccurrenceMap = {};
LocalizationOptions? _localizationOptions;
/// Instance of navigator key
@@ -70,7 +71,7 @@ class Catcher with ReportModeAction {
GlobalKey? navigatorKey,
}) : assert(
rootWidget != null || runAppFunction != null,
- "You need to provide rootWidget or runAppFunction",
+ 'You need to provide rootWidget or runAppFunction',
) {
_configure(navigatorKey);
}
@@ -89,11 +90,11 @@ class Catcher with ReportModeAction {
if (_currentConfig.handlers.isEmpty) {
_logger.warning(
- "Handlers list is empty. Configure at least one handler to "
- "process error reports.",
+ 'Handlers list is empty. Configure at least one handler to '
+ 'process error reports.',
);
} else {
- _logger.fine("Catcher configured successfully.");
+ _logger.fine('Catcher configured successfully.');
}
}
@@ -183,9 +184,13 @@ class Catcher with ReportModeAction {
});
}
- Future _setupErrorHooks() async {
+ Future _setupErrorHooks() async {
FlutterError.onError = (FlutterErrorDetails details) async {
- _reportError(details.exception, details.stack, errorDetails: details);
+ await _reportError(
+ details.exception,
+ details.stack,
+ errorDetails: details,
+ );
};
///Web doesn't have Isolate error listener support
@@ -193,7 +198,7 @@ class Catcher with ReportModeAction {
Isolate.current.addErrorListener(
RawReceivePort((dynamic pair) async {
final isolateError = pair as List;
- _reportError(
+ await _reportError(
isolateError.first.toString(),
isolateError.last.toString(),
);
@@ -210,19 +215,20 @@ class Catcher with ReportModeAction {
runAppFunction!();
});
} else {
- throw ArgumentError("Provide rootWidget or runAppFunction to Catcher.");
+ throw ArgumentError('Provide rootWidget or runAppFunction to Catcher.');
}
}
void _runZonedGuarded(void Function() callback) {
- runZonedGuarded>(() async {
- if (ensureInitialized) {
- WidgetsFlutterBinding.ensureInitialized();
- }
- callback();
- }, (dynamic error, StackTrace stackTrace) {
- _reportError(error, stackTrace);
- });
+ runZonedGuarded>(
+ () async {
+ if (ensureInitialized) {
+ WidgetsFlutterBinding.ensureInitialized();
+ }
+ callback();
+ },
+ _reportError,
+ );
}
void _configureLogger() {
@@ -241,7 +247,7 @@ class Catcher with ReportModeAction {
}
void _loadDeviceInfo() {
- final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
+ final deviceInfo = DeviceInfoPlugin();
if (ApplicationProfileManager.isWeb()) {
deviceInfo.webBrowserInfo.then((webBrowserInfo) {
_loadWebParameters(webBrowserInfo);
@@ -279,149 +285,147 @@ class Catcher with ReportModeAction {
///Remove excluded parameters from device parameters.
void _removeExcludedParameters() {
- _currentConfig.excludedParameters.forEach((parameter) {
- _deviceParameters.remove(parameter);
- });
+ _currentConfig.excludedParameters.forEach(_deviceParameters.remove);
}
void _loadLinuxParameters(LinuxDeviceInfo linuxDeviceInfo) {
try {
- _deviceParameters["name"] = linuxDeviceInfo.name;
- _deviceParameters["version"] = linuxDeviceInfo.version;
- _deviceParameters["id"] = linuxDeviceInfo.id;
- _deviceParameters["idLike"] = linuxDeviceInfo.idLike;
- _deviceParameters["versionCodename"] = linuxDeviceInfo.versionCodename;
- _deviceParameters["versionId"] = linuxDeviceInfo.versionId;
- _deviceParameters["prettyName"] = linuxDeviceInfo.prettyName;
- _deviceParameters["buildId"] = linuxDeviceInfo.buildId;
- _deviceParameters["variant"] = linuxDeviceInfo.variant;
- _deviceParameters["variantId"] = linuxDeviceInfo.variantId;
- _deviceParameters["machineId"] = linuxDeviceInfo.machineId;
+ _deviceParameters['name'] = linuxDeviceInfo.name;
+ _deviceParameters['version'] = linuxDeviceInfo.version;
+ _deviceParameters['id'] = linuxDeviceInfo.id;
+ _deviceParameters['idLike'] = linuxDeviceInfo.idLike;
+ _deviceParameters['versionCodename'] = linuxDeviceInfo.versionCodename;
+ _deviceParameters['versionId'] = linuxDeviceInfo.versionId;
+ _deviceParameters['prettyName'] = linuxDeviceInfo.prettyName;
+ _deviceParameters['buildId'] = linuxDeviceInfo.buildId;
+ _deviceParameters['variant'] = linuxDeviceInfo.variant;
+ _deviceParameters['variantId'] = linuxDeviceInfo.variantId;
+ _deviceParameters['machineId'] = linuxDeviceInfo.machineId;
} catch (exception) {
- _logger.warning("Load Linux parameters failed: $exception");
+ _logger.warning('Load Linux parameters failed: $exception');
}
}
void _loadMacOSParameters(MacOsDeviceInfo macOsDeviceInfo) {
try {
- _deviceParameters["computerName"] = macOsDeviceInfo.computerName;
- _deviceParameters["hostName"] = macOsDeviceInfo.hostName;
- _deviceParameters["arch"] = macOsDeviceInfo.arch;
- _deviceParameters["model"] = macOsDeviceInfo.model;
- _deviceParameters["kernelVersion"] = macOsDeviceInfo.kernelVersion;
- _deviceParameters["osRelease"] = macOsDeviceInfo.osRelease;
- _deviceParameters["activeCPUs"] = macOsDeviceInfo.activeCPUs;
- _deviceParameters["memorySize"] = macOsDeviceInfo.memorySize;
- _deviceParameters["cpuFrequency"] = macOsDeviceInfo.cpuFrequency;
+ _deviceParameters['computerName'] = macOsDeviceInfo.computerName;
+ _deviceParameters['hostName'] = macOsDeviceInfo.hostName;
+ _deviceParameters['arch'] = macOsDeviceInfo.arch;
+ _deviceParameters['model'] = macOsDeviceInfo.model;
+ _deviceParameters['kernelVersion'] = macOsDeviceInfo.kernelVersion;
+ _deviceParameters['osRelease'] = macOsDeviceInfo.osRelease;
+ _deviceParameters['activeCPUs'] = macOsDeviceInfo.activeCPUs;
+ _deviceParameters['memorySize'] = macOsDeviceInfo.memorySize;
+ _deviceParameters['cpuFrequency'] = macOsDeviceInfo.cpuFrequency;
} catch (exception) {
- _logger.warning("Load MacOS parameters failed: $exception");
+ _logger.warning('Load MacOS parameters failed: $exception');
}
}
void _loadWindowsParameters(WindowsDeviceInfo windowsDeviceInfo) {
try {
- _deviceParameters["computerName"] = windowsDeviceInfo.computerName;
- _deviceParameters["numberOfCores"] = windowsDeviceInfo.numberOfCores;
- _deviceParameters["systemMemoryInMegabytes"] =
+ _deviceParameters['computerName'] = windowsDeviceInfo.computerName;
+ _deviceParameters['numberOfCores'] = windowsDeviceInfo.numberOfCores;
+ _deviceParameters['systemMemoryInMegabytes'] =
windowsDeviceInfo.systemMemoryInMegabytes;
} catch (exception) {
- _logger.warning("Load Windows parameters failed: $exception");
+ _logger.warning('Load Windows parameters failed: $exception');
}
}
- void _loadWebParameters(WebBrowserInfo webBrowserInfo) async {
+ Future _loadWebParameters(WebBrowserInfo webBrowserInfo) async {
try {
- _deviceParameters["language"] = webBrowserInfo.language;
- _deviceParameters["appCodeName"] = webBrowserInfo.appCodeName;
- _deviceParameters["appName"] = webBrowserInfo.appName;
- _deviceParameters["appVersion"] = webBrowserInfo.appVersion;
- _deviceParameters["browserName"] = webBrowserInfo.browserName.toString();
- _deviceParameters["deviceMemory"] = webBrowserInfo.deviceMemory;
- _deviceParameters["hardwareConcurrency"] =
+ _deviceParameters['language'] = webBrowserInfo.language;
+ _deviceParameters['appCodeName'] = webBrowserInfo.appCodeName;
+ _deviceParameters['appName'] = webBrowserInfo.appName;
+ _deviceParameters['appVersion'] = webBrowserInfo.appVersion;
+ _deviceParameters['browserName'] = webBrowserInfo.browserName.toString();
+ _deviceParameters['deviceMemory'] = webBrowserInfo.deviceMemory;
+ _deviceParameters['hardwareConcurrency'] =
webBrowserInfo.hardwareConcurrency;
- _deviceParameters["languages"] = webBrowserInfo.languages;
- _deviceParameters["maxTouchPoints"] = webBrowserInfo.maxTouchPoints;
- _deviceParameters["platform"] = webBrowserInfo.platform;
- _deviceParameters["product"] = webBrowserInfo.product;
- _deviceParameters["productSub"] = webBrowserInfo.productSub;
- _deviceParameters["userAgent"] = webBrowserInfo.userAgent;
- _deviceParameters["vendor"] = webBrowserInfo.vendor;
- _deviceParameters["vendorSub"] = webBrowserInfo.vendorSub;
+ _deviceParameters['languages'] = webBrowserInfo.languages;
+ _deviceParameters['maxTouchPoints'] = webBrowserInfo.maxTouchPoints;
+ _deviceParameters['platform'] = webBrowserInfo.platform;
+ _deviceParameters['product'] = webBrowserInfo.product;
+ _deviceParameters['productSub'] = webBrowserInfo.productSub;
+ _deviceParameters['userAgent'] = webBrowserInfo.userAgent;
+ _deviceParameters['vendor'] = webBrowserInfo.vendor;
+ _deviceParameters['vendorSub'] = webBrowserInfo.vendorSub;
} catch (exception) {
- _logger.warning("Load Web parameters failed: $exception");
+ _logger.warning('Load Web parameters failed: $exception');
}
}
void _loadAndroidParameters(AndroidDeviceInfo androidDeviceInfo) {
try {
- _deviceParameters["id"] = androidDeviceInfo.id;
- // TODO(*): _deviceParameters["androidId"] = androidDeviceInfo.androidId;
- _deviceParameters["board"] = androidDeviceInfo.board;
- _deviceParameters["bootloader"] = androidDeviceInfo.bootloader;
- _deviceParameters["brand"] = androidDeviceInfo.brand;
- _deviceParameters["device"] = androidDeviceInfo.device;
- _deviceParameters["display"] = androidDeviceInfo.display;
- _deviceParameters["fingerprint"] = androidDeviceInfo.fingerprint;
- _deviceParameters["hardware"] = androidDeviceInfo.hardware;
- _deviceParameters["host"] = androidDeviceInfo.host;
- _deviceParameters["isPhysicalDevice"] =
+ _deviceParameters['id'] = androidDeviceInfo.id;
+ // TODO(*): _deviceParameters['androidId'] = androidDeviceInfo.androidId;
+ _deviceParameters['board'] = androidDeviceInfo.board;
+ _deviceParameters['bootloader'] = androidDeviceInfo.bootloader;
+ _deviceParameters['brand'] = androidDeviceInfo.brand;
+ _deviceParameters['device'] = androidDeviceInfo.device;
+ _deviceParameters['display'] = androidDeviceInfo.display;
+ _deviceParameters['fingerprint'] = androidDeviceInfo.fingerprint;
+ _deviceParameters['hardware'] = androidDeviceInfo.hardware;
+ _deviceParameters['host'] = androidDeviceInfo.host;
+ _deviceParameters['isPhysicalDevice'] =
androidDeviceInfo.isPhysicalDevice;
- _deviceParameters["manufacturer"] = androidDeviceInfo.manufacturer;
- _deviceParameters["model"] = androidDeviceInfo.model;
- _deviceParameters["product"] = androidDeviceInfo.product;
- _deviceParameters["tags"] = androidDeviceInfo.tags;
- _deviceParameters["type"] = androidDeviceInfo.type;
- _deviceParameters["versionBaseOs"] = androidDeviceInfo.version.baseOS;
- _deviceParameters["versionCodename"] = androidDeviceInfo.version.codename;
- _deviceParameters["versionIncremental"] =
+ _deviceParameters['manufacturer'] = androidDeviceInfo.manufacturer;
+ _deviceParameters['model'] = androidDeviceInfo.model;
+ _deviceParameters['product'] = androidDeviceInfo.product;
+ _deviceParameters['tags'] = androidDeviceInfo.tags;
+ _deviceParameters['type'] = androidDeviceInfo.type;
+ _deviceParameters['versionBaseOs'] = androidDeviceInfo.version.baseOS;
+ _deviceParameters['versionCodename'] = androidDeviceInfo.version.codename;
+ _deviceParameters['versionIncremental'] =
androidDeviceInfo.version.incremental;
- _deviceParameters["versionPreviewSdk"] =
+ _deviceParameters['versionPreviewSdk'] =
androidDeviceInfo.version.previewSdkInt;
- _deviceParameters["versionRelease"] = androidDeviceInfo.version.release;
- _deviceParameters["versionSdk"] = androidDeviceInfo.version.sdkInt;
- _deviceParameters["versionSecurityPatch"] =
+ _deviceParameters['versionRelease'] = androidDeviceInfo.version.release;
+ _deviceParameters['versionSdk'] = androidDeviceInfo.version.sdkInt;
+ _deviceParameters['versionSecurityPatch'] =
androidDeviceInfo.version.securityPatch;
} catch (exception) {
- _logger.warning("Load Android parameters failed: $exception");
+ _logger.warning('Load Android parameters failed: $exception');
}
}
void _loadIosParameters(IosDeviceInfo iosInfo) {
try {
- _deviceParameters["model"] = iosInfo.model;
- _deviceParameters["isPhysicalDevice"] = iosInfo.isPhysicalDevice;
- _deviceParameters["name"] = iosInfo.name;
- _deviceParameters["identifierForVendor"] = iosInfo.identifierForVendor;
- _deviceParameters["localizedModel"] = iosInfo.localizedModel;
- _deviceParameters["systemName"] = iosInfo.systemName;
- _deviceParameters["utsnameVersion"] = iosInfo.utsname.version;
- _deviceParameters["utsnameRelease"] = iosInfo.utsname.release;
- _deviceParameters["utsnameMachine"] = iosInfo.utsname.machine;
- _deviceParameters["utsnameNodename"] = iosInfo.utsname.nodename;
- _deviceParameters["utsnameSysname"] = iosInfo.utsname.sysname;
+ _deviceParameters['model'] = iosInfo.model;
+ _deviceParameters['isPhysicalDevice'] = iosInfo.isPhysicalDevice;
+ _deviceParameters['name'] = iosInfo.name;
+ _deviceParameters['identifierForVendor'] = iosInfo.identifierForVendor;
+ _deviceParameters['localizedModel'] = iosInfo.localizedModel;
+ _deviceParameters['systemName'] = iosInfo.systemName;
+ _deviceParameters['utsnameVersion'] = iosInfo.utsname.version;
+ _deviceParameters['utsnameRelease'] = iosInfo.utsname.release;
+ _deviceParameters['utsnameMachine'] = iosInfo.utsname.machine;
+ _deviceParameters['utsnameNodename'] = iosInfo.utsname.nodename;
+ _deviceParameters['utsnameSysname'] = iosInfo.utsname.sysname;
} catch (exception) {
- _logger.warning("Load iOS parameters failed: $exception");
+ _logger.warning('Load iOS parameters failed: $exception');
}
}
void _loadApplicationInfo() {
- _applicationParameters["environment"] =
+ _applicationParameters['environment'] =
describeEnum(ApplicationProfileManager.getApplicationProfile());
PackageInfo.fromPlatform().then((packageInfo) {
- _applicationParameters["version"] = packageInfo.version;
- _applicationParameters["appName"] = packageInfo.appName;
- _applicationParameters["buildNumber"] = packageInfo.buildNumber;
- _applicationParameters["packageName"] = packageInfo.packageName;
+ _applicationParameters['version'] = packageInfo.version;
+ _applicationParameters['appName'] = packageInfo.appName;
+ _applicationParameters['buildNumber'] = packageInfo.buildNumber;
+ _applicationParameters['packageName'] = packageInfo.packageName;
});
}
///We need to setup localizations lazily because context needed to setup these
///localizations can be used after app was build for the first time.
void _setupLocalization() {
- Locale locale = const Locale("en", "US");
+ var locale = const Locale('en', 'US');
if (_isContextValid()) {
- final BuildContext? context = _getContext();
+ final context = _getContext();
if (context != null) {
locale = Localizations.localeOf(context);
}
@@ -445,31 +449,31 @@ class Catcher with ReportModeAction {
String language,
) {
switch (language.toLowerCase()) {
- case "en":
+ case 'en':
return LocalizationOptions.buildDefaultEnglishOptions();
- case "zh":
+ case 'zh':
return LocalizationOptions.buildDefaultChineseOptions();
- case "hi":
+ case 'hi':
return LocalizationOptions.buildDefaultHindiOptions();
- case "es":
+ case 'es':
return LocalizationOptions.buildDefaultSpanishOptions();
- case "ms":
+ case 'ms':
return LocalizationOptions.buildDefaultMalayOptions();
- case "ru":
+ case 'ru':
return LocalizationOptions.buildDefaultRussianOptions();
- case "pt":
+ case 'pt':
return LocalizationOptions.buildDefaultPortugueseOptions();
- case "fr":
+ case 'fr':
return LocalizationOptions.buildDefaultFrenchOptions();
- case "pl":
+ case 'pl':
return LocalizationOptions.buildDefaultPolishOptions();
- case "it":
+ case 'it':
return LocalizationOptions.buildDefaultItalianOptions();
- case "ko":
+ case 'ko':
return LocalizationOptions.buildDefaultKoreanOptions();
- case "nl":
+ case 'nl':
return LocalizationOptions.buildDefaultDutchOptions();
- case "de":
+ case 'de':
return LocalizationOptions.buildDefaultGermanOptions();
default:
return LocalizationOptions.buildDefaultEnglishOptions();
@@ -479,7 +483,7 @@ class Catcher with ReportModeAction {
///Setup screenshot manager's screenshots path.
void _setupScreenshotManager() {
screenshotManager = CatcherScreenshotManager(_logger);
- final String screenshotsPath = _currentConfig.screenshotsPath;
+ final screenshotsPath = _currentConfig.screenshotsPath;
if (!ApplicationProfileManager.isWeb() && screenshotsPath.isEmpty) {
_logger.warning("Screenshots path is empty. Screenshots won't work.");
}
@@ -491,37 +495,37 @@ class Catcher with ReportModeAction {
static void reportCheckedError(dynamic error, dynamic stackTrace) {
dynamic errorValue = error;
dynamic stackTraceValue = stackTrace;
- errorValue ??= "undefined error";
+ errorValue ??= 'undefined error';
stackTraceValue ??= StackTrace.current;
_instance._reportError(error, stackTrace);
}
- void _reportError(
+ Future _reportError(
dynamic error,
dynamic stackTrace, {
FlutterErrorDetails? errorDetails,
}) async {
- if (errorDetails?.silent == true &&
- _currentConfig.handleSilentError == false) {
+ if (errorDetails?.silent ??
+ false == true && _currentConfig.handleSilentError == false) {
_logger.info(
- "Report error skipped for error: $error. HandleSilentError is false.",
+ 'Report error skipped for error: $error. HandleSilentError is false.',
);
return;
}
if (_localizationOptions == null) {
- _logger.info("Setup localization lazily!");
+ _logger.info('Setup localization lazily!');
_setupLocalization();
}
- _cleanPastReportsOccurences();
+ _cleanPastReportsOccurrences();
File? screenshot;
if (!ApplicationProfileManager.isWeb()) {
screenshot = await screenshotManager.captureAndSave();
}
- final Report report = Report(
+ final report = Report(
error,
stackTrace,
DateTime.now(),
@@ -533,9 +537,10 @@ class Catcher with ReportModeAction {
screenshot,
);
- if (_isReportInReportsOccurencesMap(report)) {
+ if (_isReportInReportsOccurrencesMap(report)) {
_logger.fine(
- "Error: '$error' has been skipped to due to duplication occurence within ${_currentConfig.reportOccurrenceTimeout} ms.",
+ "Error: '$error' has been skipped to due to duplication occurrence "
+ 'within ${_currentConfig.reportOccurrenceTimeout} ms.',
);
return;
}
@@ -543,21 +548,22 @@ class Catcher with ReportModeAction {
if (_currentConfig.filterFunction != null &&
_currentConfig.filterFunction!(report) == false) {
_logger.fine(
- "Error: '$error' has been filtered from Catcher logs. Report will be skipped.",
+ "Error: '$error' has been filtered from Catcher logs. Report will be "
+ 'skipped.',
);
return;
}
_cachedReports.add(report);
- ReportMode? reportMode =
- _getReportModeFromExplicitExceptionReportModeMap(error);
+ var reportMode = _getReportModeFromExplicitExceptionReportModeMap(error);
if (reportMode != null) {
- _logger.info("Using explicit report mode for error");
+ _logger.info('Using explicit report mode for error');
} else {
reportMode = _currentConfig.reportMode;
}
if (!isReportModeSupportedInPlatform(report, reportMode)) {
_logger.warning(
- "$reportMode in not supported for ${describeEnum(report.platformType)} platform",
+ '$reportMode in not supported for ${describeEnum(report.platformType)}'
+ 'platform',
);
return;
}
@@ -569,7 +575,8 @@ class Catcher with ReportModeAction {
reportMode.requestAction(report, _getContext());
} else {
_logger.warning(
- "Couldn't use report mode because you didn't provide navigator key. Add navigator key to use this report mode.",
+ "Couldn't use report mode because you didn't provide navigator key."
+ ' Add navigator key to use this report mode.',
);
}
} else {
@@ -587,7 +594,7 @@ class Catcher with ReportModeAction {
}
ReportMode? _getReportModeFromExplicitExceptionReportModeMap(dynamic error) {
- final errorName = error != null ? error.toString().toLowerCase() : "";
+ final errorName = error != null ? error.toString().toLowerCase() : '';
ReportMode? reportMode;
_currentConfig.explicitExceptionReportModesMap.forEach((key, value) {
if (errorName.contains(key.toLowerCase())) {
@@ -601,7 +608,7 @@ class Catcher with ReportModeAction {
ReportHandler? _getReportHandlerFromExplicitExceptionHandlerMap(
dynamic error,
) {
- final errorName = error != null ? error.toString().toLowerCase() : "";
+ final errorName = error != null ? error.toString().toLowerCase() : '';
ReportHandler? reportHandler;
_currentConfig.explicitExceptionHandlersMap.forEach((key, value) {
if (errorName.contains(key.toLowerCase())) {
@@ -614,15 +621,15 @@ class Catcher with ReportModeAction {
@override
void onActionConfirmed(Report report) {
- final ReportHandler? reportHandler =
+ final reportHandler =
_getReportHandlerFromExplicitExceptionHandlerMap(report.error);
if (reportHandler != null) {
- _logger.info("Using explicit report handler");
+ _logger.info('Using explicit report handler');
_handleReport(report, reportHandler);
return;
}
- for (final ReportHandler handler in _currentConfig.handlers) {
+ for (final handler in _currentConfig.handlers) {
_handleReport(report, handler);
}
}
@@ -630,14 +637,16 @@ class Catcher with ReportModeAction {
void _handleReport(Report report, ReportHandler reportHandler) {
if (!isReportHandlerSupportedInPlatform(report, reportHandler)) {
_logger.warning(
- "$reportHandler in not supported for ${describeEnum(report.platformType)} platform",
+ '$reportHandler in not supported for '
+ '${describeEnum(report.platformType)} platform',
);
return;
}
if (reportHandler.isContextRequired() && !_isContextValid()) {
_logger.warning(
- "Couldn't use report handler because you didn't provide navigator key. Add navigator key to use this report mode.",
+ "Couldn't use report handler because you didn't provide navigator key."
+ ' Add navigator key to use this report mode',
);
return;
}
@@ -646,12 +655,13 @@ class Catcher with ReportModeAction {
.handle(report, _getContext())
.catchError((dynamic handlerError) {
_logger.warning(
- "Error occurred in ${reportHandler.toString()}: ${handlerError.toString()}",
+ 'Error occurred in $reportHandler: $handlerError',
);
+ return true;
}).then((result) {
- _logger.info("${report.runtimeType} result: $result");
+ _logger.info('${report.runtimeType} result: $result');
if (!result) {
- _logger.warning("${reportHandler.toString()} failed to report error");
+ _logger.warning('$reportHandler failed to report error');
} else {
_cachedReports.remove(report);
}
@@ -659,7 +669,7 @@ class Catcher with ReportModeAction {
Duration(milliseconds: _currentConfig.handlerTimeout),
onTimeout: () {
_logger.warning(
- "${reportHandler.toString()} failed to report error because of timeout",
+ '$reportHandler failed to report error because of timeout',
);
},
);
@@ -703,16 +713,16 @@ class Catcher with ReportModeAction {
/// Send text exception. Used to test Catcher configuration.
static void sendTestException() {
- throw const FormatException("Test exception generated by Catcher");
+ throw const FormatException('Test exception generated by Catcher');
}
/// Add default error widget which replaces red screen of death (RSOD).
static void addDefaultErrorWidget({
bool showStacktrace = true,
- String title = "An application error has occurred",
+ String title = 'An application error has occurred',
String description =
- "There was unexpected situation in application. Application has been "
- "able to recover from error state.",
+ 'There was unexpected situation in application. Application has been '
+ 'able to recover from error state.',
double maxWidthForSmallMode = 150,
}) {
ErrorWidget.builder = (FlutterErrorDetails details) {
@@ -750,21 +760,21 @@ class Catcher with ReportModeAction {
return PlatformType.unknown;
}
- ///Clean report ocucrences from the past.
- void _cleanPastReportsOccurences() {
- final int occurenceTimeout = _currentConfig.reportOccurrenceTimeout;
- final DateTime nowDateTime = DateTime.now();
- _reportsOcurrenceMap.removeWhere((key, value) {
- final DateTime occurenceWithTimeout =
- key.add(Duration(milliseconds: occurenceTimeout));
- return nowDateTime.isAfter(occurenceWithTimeout);
+ ///Clean report occurrencess from the past.
+ void _cleanPastReportsOccurrences() {
+ final occurrenceTimeout = _currentConfig.reportOccurrenceTimeout;
+ final nowDateTime = DateTime.now();
+ _reportsOccurrenceMap.removeWhere((key, value) {
+ final occurrenceWithTimeout =
+ key.add(Duration(milliseconds: occurrenceTimeout));
+ return nowDateTime.isAfter(occurrenceWithTimeout);
});
}
///Check whether reports occurence map contains given report.
- bool _isReportInReportsOccurencesMap(Report report) {
+ bool _isReportInReportsOccurrencesMap(Report report) {
if (report.error != null) {
- return _reportsOcurrenceMap.containsValue(report.error.toString());
+ return _reportsOccurrenceMap.containsValue(report.error.toString());
} else {
return false;
}
@@ -774,7 +784,7 @@ class Catcher with ReportModeAction {
///error is not null and report occurence timeout is greater than 0.
void _addReportInReportsOccurencesMap(Report report) {
if (report.error != null && _currentConfig.reportOccurrenceTimeout > 0) {
- _reportsOcurrenceMap[DateTime.now()] = report.error.toString();
+ _reportsOccurrenceMap[DateTime.now()] = report.error.toString();
}
}
diff --git a/lib/core/catcher_screenshot.dart b/lib/core/catcher_screenshot.dart
index 91877538..fcb54489 100644
--- a/lib/core/catcher_screenshot.dart
+++ b/lib/core/catcher_screenshot.dart
@@ -7,10 +7,10 @@ class CatcherScreenshot extends StatefulWidget {
final Catcher catcher;
const CatcherScreenshot({
- Key? key,
required this.child,
required this.catcher,
- }) : super(key: key);
+ super.key,
+ });
@override
State createState() {
diff --git a/lib/core/catcher_screenshot_manager.dart b/lib/core/catcher_screenshot_manager.dart
index dad857c2..4539f3f8 100644
--- a/lib/core/catcher_screenshot_manager.dart
+++ b/lib/core/catcher_screenshot_manager.dart
@@ -1,5 +1,3 @@
-library screenshot;
-
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
@@ -31,10 +29,10 @@ class CatcherScreenshotManager {
Duration delay = const Duration(milliseconds: 20),
}) async {
try {
- if (_path?.isEmpty == true) {
+ if (_path?.isEmpty ?? false == true) {
return null;
}
- final Uint8List? content = await _capture(
+ final content = await _capture(
pixelRatio: pixelRatio,
delay: delay,
);
@@ -43,60 +41,74 @@ class CatcherScreenshotManager {
return saveFile(content);
}
} catch (exception) {
- _logger.warning("Failed to create screenshot file: $exception");
+ _logger.warning('Failed to create screenshot file: $exception');
}
return null;
}
Future saveFile(Uint8List fileContent) async {
- final name = "catcher_${DateTime.now().microsecondsSinceEpoch}.png";
- final File file = await File("$_path/$name").create(recursive: true);
+ final name = 'catcher_${DateTime.now().microsecondsSinceEpoch}.png';
+ final file = await File('$_path/$name').create(recursive: true);
file.writeAsBytesSync(fileContent);
return file;
}
Future _capture({
double? pixelRatio,
- Duration? delay = const Duration(milliseconds: 20),
+ Duration delay = const Duration(milliseconds: 20),
}) {
- return Future.delayed(delay ?? const Duration(milliseconds: 20), () async {
- final ui.Image image = await _captureAsUiImage(
- delay: Duration.zero,
- pixelRatio: pixelRatio,
- );
- final ByteData? byteData =
- await image.toByteData(format: ui.ImageByteFormat.png);
- final Uint8List? pngBytes = byteData?.buffer.asUint8List();
+ //Delay is required. See Issue https://github.com/flutter/flutter/issues/22308
+ return Future.delayed(delay, () async {
+ try {
+ final image = await captureAsUiImage(
+ delay: Duration.zero,
+ pixelRatio: pixelRatio,
+ );
+ final byteData =
+ await image?.toByteData(format: ui.ImageByteFormat.png);
+ image?.dispose();
- return pngBytes;
+ final pngBytes = byteData?.buffer.asUint8List();
+
+ return pngBytes;
+ } catch (exception) {
+ _logger.severe('Failed to capture screenshot: $exception');
+ }
+ return null;
});
}
- Future _captureAsUiImage({
- double? pixelRatio,
+ Future captureAsUiImage({
+ double? pixelRatio = 1,
Duration delay = const Duration(milliseconds: 20),
}) {
+ //Delay is required. See Issue https://github.com/flutter/flutter/issues/22308
return Future.delayed(delay, () async {
- // ignore: cast_nullable_to_non_nullable
- final RenderRepaintBoundary boundary = _containerKey.currentContext
- ?.findRenderObject() as RenderRepaintBoundary;
+ try {
+ final findRenderObject =
+ _containerKey.currentContext?.findRenderObject();
- // ignore: unnecessary_null_comparison
- if (boundary == null) {
- throw StateError("No boundary found");
- }
+ print(containerKey.currentContext);
+ print(_containerKey.currentContext?.findRenderObject());
+ if (findRenderObject == null) {
+ return null;
+ }
- final BuildContext? context = _containerKey.currentContext;
- double? pixelRatioValue = pixelRatio;
- if (pixelRatioValue == null) {
- if (context != null) {
- pixelRatioValue =
- pixelRatioValue ?? MediaQuery.of(context).devicePixelRatio;
+ final boundary = findRenderObject as RenderRepaintBoundary;
+ final context = _containerKey.currentContext;
+ var pixelRatioValue = pixelRatio;
+ if (pixelRatio == null) {
+ if (context != null) {
+ pixelRatioValue =
+ pixelRatio ?? MediaQuery.of(context).devicePixelRatio;
+ }
}
+ final image = await boundary.toImage(pixelRatio: pixelRatioValue ?? 1);
+ return image;
+ } catch (exception) {
+ _logger.severe('Failed to capture screenshot: $exception');
}
- final ui.Image image =
- await boundary.toImage(pixelRatio: pixelRatio ?? 1);
- return image;
+ return null;
});
}
diff --git a/lib/handlers/base_email_handler.dart b/lib/handlers/base_email_handler.dart
index 6f7aa612..82f9cf35 100644
--- a/lib/handlers/base_email_handler.dart
+++ b/lib/handlers/base_email_handler.dart
@@ -24,58 +24,60 @@ abstract class BaseEmailHandler extends ReportHandler {
///Setup email title from [report].
String getEmailTitle(Report report) {
- if (emailTitle?.isNotEmpty == true) {
+ if (emailTitle?.isNotEmpty ?? false == true) {
return emailTitle!;
} else {
- return "Error report: >> ${report.error} <<";
+ return 'Error report: >> ${report.error} <<';
}
}
///Setup html email message from [report].
String setupHtmlMessageText(Report report) {
- final StringBuffer buffer = StringBuffer();
+ final buffer = StringBuffer();
if (emailHeader?.isNotEmpty == true) {
- buffer.write(_escapeHtmlValue(emailHeader ?? ""));
- buffer.write("
");
+ buffer
+ ..write(_escapeHtmlValue(emailHeader ?? ''))
+ ..write('
');
}
- buffer.write("Error:
");
- buffer.write(_escapeHtmlValue(report.error.toString()));
- buffer.write("
");
+ buffer
+ ..write('Error:
')
+ ..write(_escapeHtmlValue(report.error.toString()))
+ ..write('
');
if (enableStackTrace) {
- buffer.write("Stack trace:
");
+ buffer.write('Stack trace:
');
_escapeHtmlValue(report.stackTrace.toString())
- .split("\n")
+ .split('\n')
.forEach((element) {
- buffer.write("$element
");
+ buffer.write('$element
');
});
- buffer.write("
");
+ buffer.write('
');
}
if (enableDeviceParameters) {
- buffer.write("Device parameters:
");
+ buffer.write('Device parameters:
');
for (final entry in report.deviceParameters.entries) {
buffer
- .write("${entry.key}: ${_escapeHtmlValue(entry.value)}
");
+ .write('${entry.key}: ${_escapeHtmlValue(entry.value)}
');
}
- buffer.write("
");
+ buffer.write('
');
}
if (enableApplicationParameters) {
- buffer.write("Application parameters:
");
+ buffer.write('Application parameters:
');
for (final entry in report.applicationParameters.entries) {
buffer
- .write("${entry.key}: ${_escapeHtmlValue(entry.value)}
");
+ .write('${entry.key}: ${_escapeHtmlValue(entry.value)}
');
}
- buffer.write("
");
+ buffer.write('
');
}
if (enableCustomParameters) {
- buffer.write("Custom parameters:
");
+ buffer.write('Custom parameters:
');
for (final entry in report.customParameters.entries) {
buffer
- .write("${entry.key}: ${_escapeHtmlValue(entry.value)}
");
+ .write('${entry.key}: ${_escapeHtmlValue(entry.value)}
');
}
- buffer.write("
");
+ buffer.write('
');
}
return buffer.toString();
@@ -88,40 +90,43 @@ abstract class BaseEmailHandler extends ReportHandler {
///Setup raw text email message from [report].
String setupRawMessageText(Report report) {
- final StringBuffer buffer = StringBuffer();
+ final buffer = StringBuffer();
if (emailHeader?.isNotEmpty == true) {
- buffer.write(emailHeader);
- buffer.write("\n\n");
+ buffer
+ ..write(emailHeader)
+ ..write('\n\n');
}
- buffer.write("Error:\n");
- buffer.write(report.error.toString());
- buffer.write("\n\n");
+ buffer
+ ..write('Error:\n')
+ ..write(report.error.toString())
+ ..write('\n\n');
if (enableStackTrace) {
- buffer.write("Stack trace:\n");
- buffer.write(report.stackTrace.toString());
- buffer.write("\n\n");
+ buffer
+ ..write('Stack trace:\n')
+ ..write(report.stackTrace.toString())
+ ..write('\n\n');
}
if (enableDeviceParameters) {
- buffer.write("Device parameters:\n");
+ buffer.write('Device parameters:\n');
for (final entry in report.deviceParameters.entries) {
- buffer.write("${entry.key}: ${entry.value}\n");
+ buffer.write('${entry.key}: ${entry.value}\n');
}
- buffer.write("\n\n");
+ buffer.write('\n\n');
}
if (enableApplicationParameters) {
- buffer.write("Application parameters:\n");
+ buffer.write('Application parameters:\n');
for (final entry in report.applicationParameters.entries) {
- buffer.write("${entry.key}: ${entry.value}\n");
+ buffer.write('${entry.key}: ${entry.value}\n');
}
- buffer.write("\n\n");
+ buffer.write('\n\n');
}
if (enableCustomParameters) {
- buffer.write("Custom parameters:\n");
+ buffer.write('Custom parameters:\n');
for (final entry in report.customParameters.entries) {
- buffer.write("${entry.key}: ${entry.value}\n");
+ buffer.write('${entry.key}: ${entry.value}\n');
}
- buffer.write("\n\n");
+ buffer.write('\n\n');
}
return buffer.toString();
}
diff --git a/lib/handlers/console_handler.dart b/lib/handlers/console_handler.dart
index 6c9017bb..88b1df99 100644
--- a/lib/handlers/console_handler.dart
+++ b/lib/handlers/console_handler.dart
@@ -20,22 +20,24 @@ class ConsoleHandler extends ReportHandler {
@override
Future handle(Report report, BuildContext? context) {
- logger.info(
- "============================== CATCHER LOG ==============================",
- );
- logger.info("Crash occurred on ${report.dateTime}");
- logger.info("");
+ logger
+ ..info(
+ '============================ CATCHER LOG ============================',
+ )
+ ..info('Crash occurred on ${report.dateTime}')
+ ..info('');
if (enableDeviceParameters) {
_printDeviceParametersFormatted(report.deviceParameters);
- logger.info("");
+ logger.info('');
}
if (enableApplicationParameters) {
_printApplicationParametersFormatted(report.applicationParameters);
- logger.info("");
+ logger.info('');
}
- logger.info("---------- ERROR ----------");
- logger.info("${report.error}");
- logger.info("");
+ logger
+ ..info('---------- ERROR ----------')
+ ..info('${report.error}')
+ ..info('');
if (enableStackTrace) {
_printStackTraceFormatted(report.stackTrace as StackTrace?);
}
@@ -43,37 +45,37 @@ class ConsoleHandler extends ReportHandler {
_printCustomParametersFormatted(report.customParameters);
}
logger.info(
- "======================================================================",
+ '======================================================================',
);
return Future.value(true);
}
void _printDeviceParametersFormatted(Map deviceParameters) {
- logger.info("------- DEVICE INFO -------");
+ logger.info('------- DEVICE INFO -------');
for (final entry in deviceParameters.entries) {
- logger.info("${entry.key}: ${entry.value}");
+ logger.info('${entry.key}: ${entry.value}');
}
}
void _printApplicationParametersFormatted(
Map applicationParameters,
) {
- logger.info("------- APP INFO -------");
+ logger.info('------- APP INFO -------');
for (final entry in applicationParameters.entries) {
- logger.info("${entry.key}: ${entry.value}");
+ logger.info('${entry.key}: ${entry.value}');
}
}
void _printCustomParametersFormatted(Map customParameters) {
- logger.info("------- CUSTOM INFO -------");
+ logger.info('------- CUSTOM INFO -------');
for (final entry in customParameters.entries) {
- logger.info("${entry.key}: ${entry.value}");
+ logger.info('${entry.key}: ${entry.value}');
}
}
void _printStackTraceFormatted(StackTrace? stackTrace) {
- logger.info("------- STACK TRACE -------");
- for (final entry in stackTrace.toString().split("\n")) {
+ logger.info('------- STACK TRACE -------');
+ for (final entry in stackTrace.toString().split('\n')) {
logger.info(entry);
}
}
diff --git a/lib/handlers/discord_handler.dart b/lib/handlers/discord_handler.dart
index a0c4d910..141266a4 100644
--- a/lib/handlers/discord_handler.dart
+++ b/lib/handlers/discord_handler.dart
@@ -34,22 +34,22 @@ class DiscordHandler extends ReportHandler {
Future handle(Report report, BuildContext? context) async {
if (report.platformType != PlatformType.web) {
if (!(await CatcherUtils.isInternetConnectionAvailable())) {
- _printLog("No internet connection available");
+ _printLog('No internet connection available');
return false;
}
}
- String message = "";
+ var message = '';
if (customMessageBuilder != null) {
message = await customMessageBuilder!(report);
} else {
message = _buildMessage(report);
}
- final List messages = _setupMessages(message);
+ final messages = _setupMessages(message);
for (final value in messages) {
- final bool isLastMessage = messages.indexOf(value) == messages.length - 1;
- final bool result =
+ final isLastMessage = messages.indexOf(value) == messages.length - 1;
+ final result =
await _sendContent(value, isLastMessage ? report.screenshot : null);
if (!result) {
return result;
@@ -60,12 +60,12 @@ class DiscordHandler extends ReportHandler {
}
List _setupMessages(String message) {
- final List messages = [];
- final int splits = (message.length / 2000).ceil();
- final int messageLength = message.length;
- for (int index = 0; index < splits; index++) {
- final int startIndex = index * 2000;
- int endIndex = startIndex + 2000;
+ final messages = [];
+ final splits = (message.length / 2000).ceil();
+ final messageLength = message.length;
+ for (var index = 0; index < splits; index++) {
+ final startIndex = index * 2000;
+ var endIndex = startIndex + 2000;
if (endIndex > messageLength) {
endIndex = messageLength;
}
@@ -75,63 +75,64 @@ class DiscordHandler extends ReportHandler {
}
String _buildMessage(Report report) {
- final StringBuffer stringBuffer = StringBuffer();
- stringBuffer.write("**Error:**\n${report.error}\n\n");
+ final stringBuffer = StringBuffer()
+ ..write('**Error:**\n${report.error}\n\n');
if (enableStackTrace) {
- stringBuffer.write("**Stack trace:**\n${report.stackTrace}\n\n");
+ stringBuffer.write('**Stack trace:**\n${report.stackTrace}\n\n');
}
if (enableDeviceParameters && report.deviceParameters.isNotEmpty) {
- stringBuffer.write("**Device parameters:**\n");
+ stringBuffer.write('**Device parameters:**\n');
for (final entry in report.deviceParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("\n\n");
+ stringBuffer.write('\n\n');
}
if (enableApplicationParameters &&
report.applicationParameters.isNotEmpty) {
- stringBuffer.write("**Application parameters:**\n");
+ stringBuffer.write('**Application parameters:**\n');
for (final entry in report.applicationParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("\n\n");
+ stringBuffer.write('\n\n');
}
if (enableCustomParameters && report.customParameters.isNotEmpty) {
- stringBuffer.write("**Custom parameters:**\n");
+ stringBuffer.write('**Custom parameters:**\n');
for (final entry in report.customParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("\n\n");
+ stringBuffer.write('\n\n');
}
return stringBuffer.toString();
}
Future _sendContent(String content, File? screenshot) async {
try {
- _printLog("Sending request to Discord server...");
- Response? response;
+ _printLog('Sending request to Discord server...');
+ Response? response;
if (screenshot != null) {
final screenshotPath = screenshot.path;
- final FormData formData = FormData.fromMap({
- "content": content,
- "file": await MultipartFile.fromFile(screenshotPath)
+ final formData = FormData.fromMap({
+ 'content': content,
+ 'file': await MultipartFile.fromFile(screenshotPath),
});
response = await _dio.post(webhookUrl, data: formData);
} else {
final data = {
- "content": content,
+ 'content': content,
};
response = await _dio.post(webhookUrl, data: data);
}
_printLog(
- "Server responded with code: ${response.statusCode} and message: ${response.statusMessage}",
+ 'Server responded with code: ${response.statusCode} and message:'
+ ' ${response.statusMessage}',
);
final statusCode = response.statusCode ?? 0;
return statusCode >= 200 && statusCode < 300;
} catch (exception) {
- _printLog("Failed to send data to Discord server: $exception");
+ _printLog('Failed to send data to Discord server: $exception');
return false;
}
}
diff --git a/lib/handlers/email_auto_handler.dart b/lib/handlers/email_auto_handler.dart
index ce3d10bd..48519a9c 100644
--- a/lib/handlers/email_auto_handler.dart
+++ b/lib/handlers/email_auto_handler.dart
@@ -43,8 +43,8 @@ class EmailAutoHandler extends BaseEmailHandler {
);
@override
- Future handle(Report error, BuildContext? context) {
- return _sendMail(error);
+ Future handle(Report report, BuildContext? context) {
+ return _sendMail(report);
}
Future _sendMail(Report report) async {
@@ -62,14 +62,14 @@ class EmailAutoHandler extends BaseEmailHandler {
if (sendHtml) {
message.html = setupHtmlMessageText(report);
}
- _printLog("Sending email...");
+ _printLog('Sending email...');
final result = await send(message, _setupSmtpServer());
_printLog(
- "Email result: mail: ${result.mail} "
- "sending start time: ${result.messageSendingStart} "
- "sending end time: ${result.messageSendingEnd}",
+ 'Email result: mail: ${result.mail} '
+ 'sending start time: ${result.messageSendingStart} '
+ 'sending end time: ${result.messageSendingEnd}',
);
return true;
diff --git a/lib/handlers/email_manual_handler.dart b/lib/handlers/email_manual_handler.dart
index 2b9be20c..95917e78 100644
--- a/lib/handlers/email_manual_handler.dart
+++ b/lib/handlers/email_manual_handler.dart
@@ -36,21 +36,21 @@ class EmailManualHandler extends BaseEmailHandler {
Future _sendEmail(Report report) async {
try {
- final MailOptions mailOptions = MailOptions(
+ final mailOptions = MailOptions(
body: _getEmailBody(report),
subject: getEmailTitle(report),
recipients: recipients,
isHTML: sendHtml,
attachments: [
- report.screenshot?.path ?? "",
+ report.screenshot?.path ?? '',
],
);
- _printLog("Creating mail request");
+ _printLog('Creating mail request');
await FlutterMailer.send(mailOptions);
- _printLog("Creating mail request success");
+ _printLog('Creating mail request success');
return true;
} catch (exc, stackTrace) {
- _printLog("Exception occurred: $exc stack: $stackTrace");
+ _printLog('Exception occurred: $exc stack: $stackTrace');
return false;
}
}
diff --git a/lib/handlers/file_handler.dart b/lib/handlers/file_handler.dart
index ea1c904d..d96cfcd2 100644
--- a/lib/handlers/file_handler.dart
+++ b/lib/handlers/file_handler.dart
@@ -38,7 +38,7 @@ class FileHandler extends ReportHandler {
}
return await _processReport(report);
} catch (exc, stackTrace) {
- _printLog("Exception occurred: $exc stack: $stackTrace");
+ _printLog('Exception occurred: $exc stack: $stackTrace');
return false;
}
}
@@ -46,7 +46,7 @@ class FileHandler extends ReportHandler {
Future _processReport(Report report) async {
if (_fileValidationResult) {
await _openFile();
- _writeReportToFile(report);
+ await _writeReportToFile(report);
await _closeFile();
return true;
} else {
@@ -56,86 +56,85 @@ class FileHandler extends ReportHandler {
Future _checkFile() async {
try {
- final bool exists = await file.exists();
+ final exists = file.existsSync();
if (!exists) {
file.createSync();
}
- final IOSink sink = file.openWrite(mode: FileMode.append);
- sink.write("");
+ final sink = file.openWrite(mode: FileMode.append)..write('');
await sink.flush();
await sink.close();
return true;
} catch (exc, stackTrace) {
- _printLog("Exception occurred: $exc stack: $stackTrace");
+ _printLog('Exception occurred: $exc stack: $stackTrace');
return false;
}
}
- Future _openFile() async {
+ Future _openFile() async {
_sink = file.openWrite(mode: FileMode.append);
- _printLog("Opened file");
+ _printLog('Opened file');
}
void _writeLineToFile(String text) {
_sink.add(utf8.encode('$text\n'));
}
- Future _closeFile() async {
+ Future _closeFile() async {
await _sink.flush();
await _sink.close();
- _printLog("Closed file");
+ _printLog('Closed file');
}
- void _writeReportToFile(Report report) async {
- _printLog("Writing report to file");
+ Future _writeReportToFile(Report report) async {
+ _printLog('Writing report to file');
_writeLineToFile(
- "============================== CATCHER LOG ==============================",
+ '============================ CATCHER LOG ============================',
);
- _writeLineToFile("Crash occurred on ${report.dateTime}");
- _writeLineToFile("");
+ _writeLineToFile('Crash occurred on ${report.dateTime}');
+ _writeLineToFile('');
if (enableDeviceParameters) {
_logDeviceParametersFormatted(report.deviceParameters);
- _writeLineToFile("");
+ _writeLineToFile('');
}
if (enableApplicationParameters) {
_logApplicationParametersFormatted(report.applicationParameters);
- _writeLineToFile("");
+ _writeLineToFile('');
}
- _writeLineToFile("---------- ERROR ----------");
- _writeLineToFile("${report.error}");
- _writeLineToFile("");
+ _writeLineToFile('---------- ERROR ----------');
+ _writeLineToFile('${report.error}');
+ _writeLineToFile('');
if (enableStackTrace) {
- _writeLineToFile("------- STACK TRACE -------");
- _writeLineToFile("${report.stackTrace}");
+ _writeLineToFile('------- STACK TRACE -------');
+ _writeLineToFile('${report.stackTrace}');
}
if (enableCustomParameters) {
_logCustomParametersFormatted(report.customParameters);
}
_writeLineToFile(
- "======================================================================",
+ '======================================================================',
);
}
void _logDeviceParametersFormatted(Map deviceParameters) {
- _writeLineToFile("------- DEVICE INFO -------");
+ _writeLineToFile('------- DEVICE INFO -------');
for (final entry in deviceParameters.entries) {
- _writeLineToFile("${entry.key}: ${entry.value}");
+ _writeLineToFile('${entry.key}: ${entry.value}');
}
}
void _logApplicationParametersFormatted(
Map applicationParameters,
) {
- _writeLineToFile("------- APP INFO -------");
+ _writeLineToFile('------- APP INFO -------');
for (final entry in applicationParameters.entries) {
- _writeLineToFile("${entry.key}: ${entry.value}");
+ _writeLineToFile('${entry.key}: ${entry.value}');
}
}
void _logCustomParametersFormatted(Map customParameters) {
- _writeLineToFile("------- CUSTOM INFO -------");
+ _writeLineToFile('------- CUSTOM INFO -------');
for (final entry in customParameters.entries) {
- _writeLineToFile("${entry.key}: ${entry.value}");
+ _writeLineToFile('${entry.key}: ${entry.value}');
}
}
diff --git a/lib/handlers/http_handler.dart b/lib/handlers/http_handler.dart
index d040b2aa..b8fd0b1a 100644
--- a/lib/handlers/http_handler.dart
+++ b/lib/handlers/http_handler.dart
@@ -36,16 +36,16 @@ class HttpHandler extends ReportHandler {
}) : headers = headers ?? {};
@override
- Future handle(Report error, BuildContext? context) async {
- if (error.platformType != PlatformType.web) {
+ Future handle(Report report, BuildContext? context) async {
+ if (report.platformType != PlatformType.web) {
if (!(await CatcherUtils.isInternetConnectionAvailable())) {
- _printLog("No internet connection available");
+ _printLog('No internet connection available');
return false;
}
}
if (requestType == HttpRequestType.post) {
- return _sendPost(error);
+ return _sendPost(report);
}
return true;
}
@@ -58,25 +58,24 @@ class HttpHandler extends ReportHandler {
enableStackTrace: enableStackTrace,
enableCustomParameters: enableCustomParameters,
);
- final HashMap mutableHeaders =
- HashMap();
+ final mutableHeaders = HashMap();
if (headers.isNotEmpty == true) {
mutableHeaders.addAll(headers);
}
- final Options options = Options(
- sendTimeout: requestTimeout,
- receiveTimeout: responseTimeout,
+ final options = Options(
+ sendTimeout: Duration(milliseconds: requestTimeout),
+ receiveTimeout: Duration(milliseconds: responseTimeout),
headers: mutableHeaders,
);
- Response? response;
- _printLog("Calling: ${endpointUri.toString()}");
+ Response? response;
+ _printLog('Calling: $endpointUri');
if (report.screenshot != null) {
- final screenshotPath = report.screenshot?.path ?? "";
- final FormData formData = FormData.fromMap({
- "payload_json": json,
- "file": await MultipartFile.fromFile(screenshotPath)
+ final screenshotPath = report.screenshot?.path ?? '';
+ final formData = FormData.fromMap({
+ 'payload_json': json,
+ 'file': await MultipartFile.fromFile(screenshotPath),
});
response = await _dio.post(
endpointUri.toString(),
@@ -91,11 +90,12 @@ class HttpHandler extends ReportHandler {
);
}
_printLog(
- "HttpHandler response status: ${response.statusCode!} body: ${response.data!}",
+ 'HttpHandler response status: ${response.statusCode!} body:'
+ ' ${response.data!}',
);
return true;
} catch (error, stackTrace) {
- _printLog("HttpHandler error: $error, stackTrace: $stackTrace");
+ _printLog('HttpHandler error: $error, stackTrace: $stackTrace');
return false;
}
}
diff --git a/lib/handlers/sentry_handler.dart b/lib/handlers/sentry_handler.dart
index cdeda011..0fc4cd3c 100644
--- a/lib/handlers/sentry_handler.dart
+++ b/lib/handlers/sentry_handler.dart
@@ -41,58 +41,58 @@ class SentryHandler extends ReportHandler {
});
@override
- Future handle(Report error, BuildContext? context) async {
+ Future handle(Report report, BuildContext? context) async {
try {
- _printLog("Logging to sentry...");
+ _printLog('Logging to sentry...');
final tags = {};
if (enableApplicationParameters) {
- tags.addAll(error.applicationParameters);
+ tags.addAll(report.applicationParameters);
}
if (enableDeviceParameters) {
- tags.addAll(error.deviceParameters);
+ tags.addAll(report.deviceParameters);
}
if (enableCustomParameters) {
- tags.addAll(error.customParameters);
+ tags.addAll(report.customParameters);
}
- final event = buildEvent(error, tags);
+ final event = buildEvent(report, tags);
await sentryClient.captureEvent(event);
- _printLog("Logged to sentry!");
+ _printLog('Logged to sentry!');
return true;
} catch (exception, stackTrace) {
- _printLog("Failed to send sentry event: $exception $stackTrace");
+ _printLog('Failed to send sentry event: $exception $stackTrace');
return false;
}
}
String _getApplicationVersion(Report report) {
- String applicationVersion = "";
+ var applicationVersion = '';
final applicationParameters = report.applicationParameters;
- if (applicationParameters.containsKey("appName")) {
- applicationVersion += (applicationParameters["appName"] as String?)!;
+ if (applicationParameters.containsKey('appName')) {
+ applicationVersion += (applicationParameters['appName'] as String?)!;
}
- if (applicationParameters.containsKey("version")) {
- applicationVersion += " ${applicationParameters["version"]}";
+ if (applicationParameters.containsKey('version')) {
+ applicationVersion += ' ${applicationParameters['version']}';
}
if (applicationVersion.isEmpty) {
- applicationVersion = "?";
+ applicationVersion = '?';
}
return applicationVersion;
}
SentryEvent buildEvent(Report report, Map tags) {
return SentryEvent(
- logger: "Catcher",
- serverName: "Catcher",
+ logger: 'Catcher',
+ serverName: 'Catcher',
release: customRelease ?? _getApplicationVersion(report),
environment: customEnvironment ??
- (report.applicationParameters["environment"] as String?),
- message: const SentryMessage("Error handled by Catcher"),
+ (report.applicationParameters['environment'] as String?),
+ message: const SentryMessage('Error handled by Catcher'),
throwable: report.error,
level: SentryLevel.error,
- culprit: "",
+ culprit: '',
tags: changeToSentryMap(tags),
user: userContext,
);
@@ -102,7 +102,7 @@ class SentryHandler extends ReportHandler {
final sentryMap = {};
map.forEach((key, dynamic value) {
if (value.toString().isEmpty) {
- sentryMap[key] = "none";
+ sentryMap[key] = 'none';
} else {
sentryMap[key] = value.toString();
}
diff --git a/lib/handlers/slack_handler.dart b/lib/handlers/slack_handler.dart
index d7b1cd5a..b0beda31 100644
--- a/lib/handlers/slack_handler.dart
+++ b/lib/handlers/slack_handler.dart
@@ -26,8 +26,8 @@ class SlackHandler extends ReportHandler {
SlackHandler(
this.webhookUrl,
this.channel, {
- this.username = "Catcher",
- this.iconEmoji = ":bangbang:",
+ this.username = 'Catcher',
+ this.iconEmoji = ':bangbang:',
this.printLogs = false,
this.enableDeviceParameters = false,
this.enableApplicationParameters = false,
@@ -40,10 +40,10 @@ class SlackHandler extends ReportHandler {
Future handle(Report report, BuildContext? context) async {
try {
if (!(await CatcherUtils.isInternetConnectionAvailable())) {
- _printLog("No internet connection available");
+ _printLog('No internet connection available');
return false;
}
- String message = "";
+ var message = '';
if (customMessageBuilder != null) {
message = await customMessageBuilder!(report);
} else {
@@ -51,54 +51,54 @@ class SlackHandler extends ReportHandler {
}
final data = {
- "text": message,
- "channel": channel,
- "username": username,
- "icon_emoji": iconEmoji
+ 'text': message,
+ 'channel': channel,
+ 'username': username,
+ 'icon_emoji': iconEmoji,
};
- _printLog("Sending request to Slack server...");
- final Response response =
- await _dio.post(webhookUrl, data: data);
+ _printLog('Sending request to Slack server...');
+ final response = await _dio.post(webhookUrl, data: data);
_printLog(
- "Server responded with code: ${response.statusCode} and message: ${response.statusMessage}",
+ 'Server responded with code: ${response.statusCode} and message:'
+ ' ${response.statusMessage}',
);
final statusCode = response.statusCode ?? 0;
return statusCode >= 200 && statusCode < 300;
} catch (exception) {
- _printLog("Failed to send slack message: $exception");
+ _printLog('Failed to send slack message: $exception');
return false;
}
}
String _buildMessage(Report report) {
- final StringBuffer stringBuffer = StringBuffer();
- stringBuffer.write("*Error:* ```${report.error}```\n");
+ final stringBuffer = StringBuffer()
+ ..write('*Error:* ```${report.error}```\n');
if (enableStackTrace) {
- stringBuffer.write("*Stack trace:* ```${report.stackTrace}```\n");
+ stringBuffer.write('*Stack trace:* ```${report.stackTrace}```\n');
}
if (enableDeviceParameters && report.deviceParameters.isNotEmpty) {
- stringBuffer.write("*Device parameters:* ```");
+ stringBuffer.write('*Device parameters:* ```');
for (final entry in report.deviceParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("```\n");
+ stringBuffer.write('```\n');
}
if (enableApplicationParameters &&
report.applicationParameters.isNotEmpty) {
- stringBuffer.write("*Application parameters:* ```");
+ stringBuffer.write('*Application parameters:* ```');
for (final entry in report.applicationParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("```\n");
+ stringBuffer.write('```\n');
}
if (enableCustomParameters && report.customParameters.isNotEmpty) {
- stringBuffer.write("*Custom parameters:* ```");
+ stringBuffer.write('*Custom parameters:* ```');
for (final entry in report.customParameters.entries) {
- stringBuffer.write("${entry.key}: ${entry.value}\n");
+ stringBuffer.write('${entry.key}: ${entry.value}\n');
}
- stringBuffer.write("```\n");
+ stringBuffer.write('```\n');
}
return stringBuffer.toString();
}
diff --git a/lib/handlers/snackbar_handler.dart b/lib/handlers/snackbar_handler.dart
index f31ef310..2aab90c3 100644
--- a/lib/handlers/snackbar_handler.dart
+++ b/lib/handlers/snackbar_handler.dart
@@ -70,7 +70,7 @@ class SnackbarHandler extends ReportHandler {
Future handle(Report error, BuildContext? context) async {
try {
if (!_hasScaffoldMessenger(context!)) {
- _printLog("Passed context has no ScaffoldMessenger in widget ancestor");
+ _printLog('Passed context has no ScaffoldMessenger in widget ancestor');
return false;
}
@@ -95,7 +95,7 @@ class SnackbarHandler extends ReportHandler {
);
return true;
} catch (exception, stackTrace) {
- _printLog("Failed to show snackbar: $exception, $stackTrace");
+ _printLog('Failed to show snackbar: $exception, $stackTrace');
return false;
}
}
@@ -105,7 +105,7 @@ class SnackbarHandler extends ReportHandler {
try {
return context.findAncestorWidgetOfExactType() != null;
} catch (exception, stackTrace) {
- _printLog("_hasScaffoldMessenger failed: $exception, $stackTrace");
+ _printLog('_hasScaffoldMessenger failed: $exception, $stackTrace');
return false;
}
}
@@ -115,7 +115,7 @@ class SnackbarHandler extends ReportHandler {
if (customMessage?.isNotEmpty == true) {
return customMessage!;
} else {
- return "${localizationOptions.toastHandlerDescription} ${error.error}";
+ return '${localizationOptions.toastHandlerDescription} ${error.error}';
}
}
diff --git a/lib/handlers/toast_handler.dart b/lib/handlers/toast_handler.dart
index 2f47407c..69b883ed 100644
--- a/lib/handlers/toast_handler.dart
+++ b/lib/handlers/toast_handler.dart
@@ -28,12 +28,12 @@ class ToastHandler extends ReportHandler {
});
@override
- Future handle(Report error, BuildContext? buildContext) async {
+ Future handle(Report report, BuildContext? context) async {
if (ApplicationProfileManager.isAndroid() ||
ApplicationProfileManager.isIos() ||
ApplicationProfileManager.isWeb()) {
- Fluttertoast.showToast(
- msg: _getErrorMessage(error),
+ await Fluttertoast.showToast(
+ msg: _getErrorMessage(report),
toastLength: _getLength(),
gravity: _getGravity(),
timeInSecForIosWeb: _getLengthIos(),
@@ -46,11 +46,11 @@ class ToastHandler extends ReportHandler {
const Duration(milliseconds: 500),
() {
Navigator.push(
- buildContext!,
+ context!,
PageRouteBuilder(
opaque: false,
pageBuilder: (_, __, ___) => FlutterToastPage(
- _getErrorMessage(error),
+ _getErrorMessage(report),
_getGravity(),
Duration(seconds: _getLengthIos()),
backgroundColor,
@@ -97,7 +97,7 @@ class ToastHandler extends ReportHandler {
if (customMessage?.isNotEmpty == true) {
return customMessage!;
} else {
- return "${localizationOptions.toastHandlerDescription} ${error.error}";
+ return '${localizationOptions.toastHandlerDescription} ${error.error}';
}
}
@@ -137,11 +137,13 @@ class FlutterToastPage extends StatefulWidget {
this.backgroundColor,
this.textColor,
this.textSize, {
- Key? key,
- }) : super(key: key);
+ super.key,
+ });
@override
- _FlutterToastPageState createState() => _FlutterToastPageState();
+ State createState() {
+ return _FlutterToastPageState();
+ }
}
class _FlutterToastPageState extends State {
@@ -161,7 +163,7 @@ class _FlutterToastPageState extends State {
void showToast() {
_fToast.showToast(
- child: Container(
+ child: ColoredBox(
color: widget.backgroundColor,
child: Text(
widget.text,
diff --git a/lib/mode/dialog_report_mode.dart b/lib/mode/dialog_report_mode.dart
index c60bd61f..5f0e7aae 100644
--- a/lib/mode/dialog_report_mode.dart
+++ b/lib/mode/dialog_report_mode.dart
@@ -11,13 +11,12 @@ class DialogReportMode extends ReportMode {
_showDialog(report, context);
}
- Future _showDialog(Report report, BuildContext? context) async {
+ Future _showDialog(Report report, BuildContext? context) async {
await Future.delayed(Duration.zero);
if (context != null) {
if (CatcherUtils.isCupertinoAppAncestor(context)) {
return showCupertinoDialog(
context: context,
- barrierDismissible: false,
builder: (context) => _buildCupertinoDialog(report, context),
);
} else {
diff --git a/lib/mode/page_report_mode.dart b/lib/mode/page_report_mode.dart
index edeab019..5c03e10e 100644
--- a/lib/mode/page_report_mode.dart
+++ b/lib/mode/page_report_mode.dart
@@ -18,9 +18,12 @@ class PageReportMode extends ReportMode {
}
}
- void _navigateToPageWidget(Report report, BuildContext context) async {
+ Future _navigateToPageWidget(
+ Report report,
+ BuildContext context,
+ ) async {
await Future.delayed(Duration.zero);
- Navigator.push(
+ await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PageWidget(this, report),
@@ -51,8 +54,8 @@ class PageWidget extends StatefulWidget {
const PageWidget(
this.pageReportMode,
this.report, {
- Key? key,
- }) : super(key: key);
+ super.key,
+ });
@override
PageWidgetState createState() {
@@ -129,21 +132,21 @@ class PageWidgetState extends State {
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
- onPressed: () => _onAcceptClicked(),
+ onPressed: _onAcceptClicked,
child: Text(
widget
.pageReportMode.localizationOptions.pageReportModeAccept,
),
),
TextButton(
- onPressed: () => _onCancelClicked(),
+ onPressed: _onCancelClicked,
child: Text(
widget
.pageReportMode.localizationOptions.pageReportModeCancel,
),
),
],
- )
+ ),
],
),
);
@@ -158,21 +161,21 @@ class PageWidgetState extends State {
Widget _getStackTraceWidget() {
if (widget.pageReportMode.showStackTrace) {
- String error = "";
+ var error = '';
if (widget.report.error != null) {
error = widget.report.error.toString();
} else if (widget.report.errorDetails != null) {
error = widget.report.errorDetails.toString();
}
- final List items = [
+ final items = [
error,
- ...widget.report.stackTrace.toString().split("\n"),
+ ...widget.report.stackTrace.toString().split('\n'),
];
return SizedBox(
- height: 300.0,
+ height: 300,
child: ListView.builder(
- padding: const EdgeInsets.all(8.0),
+ padding: const EdgeInsets.all(8),
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
return Text(
diff --git a/lib/model/catcher_options.dart b/lib/model/catcher_options.dart
index 4b92cee6..42010a19 100644
--- a/lib/model/catcher_options.dart
+++ b/lib/model/catcher_options.dart
@@ -20,8 +20,8 @@ class CatcherOptions {
/// Localization options (translations)
final List localizationOptions;
- /// Explicit report modes map which will be used to trigger specific report mode
- /// for specific error
+ /// Explicit report modes map which will be used to trigger specific report
+ /// mode for specific error
final Map explicitExceptionReportModesMap;
/// Explicit report handler map which will be used to trigger specific report
@@ -64,7 +64,7 @@ class CatcherOptions {
this.explicitExceptionReportModesMap = const {},
this.explicitExceptionHandlersMap = const {},
this.handleSilentError = true,
- this.screenshotsPath = "",
+ this.screenshotsPath = '',
this.excludedParameters = const [],
this.filterFunction,
this.reportOccurrenceTimeout = 3000,
@@ -81,7 +81,7 @@ class CatcherOptions {
explicitExceptionReportModesMap = {},
explicitExceptionHandlersMap = {},
handleSilentError = true,
- screenshotsPath = "",
+ screenshotsPath = '',
excludedParameters = const [],
filterFunction = null,
reportOccurrenceTimeout = 3000,
@@ -97,7 +97,7 @@ class CatcherOptions {
explicitExceptionReportModesMap = {},
explicitExceptionHandlersMap = {},
handleSilentError = true,
- screenshotsPath = "",
+ screenshotsPath = '',
excludedParameters = const [],
filterFunction = null,
reportOccurrenceTimeout = 3000,
@@ -113,7 +113,7 @@ class CatcherOptions {
explicitExceptionReportModesMap = {},
explicitExceptionHandlersMap = {},
handleSilentError = true,
- screenshotsPath = "",
+ screenshotsPath = '',
excludedParameters = const [],
filterFunction = null,
reportOccurrenceTimeout = 3000,
diff --git a/lib/model/localization_options.dart b/lib/model/localization_options.dart
index aa501fba..3f93364f 100644
--- a/lib/model/localization_options.dart
+++ b/lib/model/localization_options.dart
@@ -18,274 +18,336 @@ class LocalizationOptions {
LocalizationOptions(
this.languageCode, {
- this.notificationReportModeTitle = "Application error occurred",
+ this.notificationReportModeTitle = 'Application error occurred',
this.notificationReportModeContent =
- "Click here to send error report to support team.",
- this.dialogReportModeTitle = "Crash",
+ 'Click here to send error report to support team.',
+ this.dialogReportModeTitle = 'Crash',
this.dialogReportModeDescription =
- "Unexpected error occurred in application. Error report is ready to send to support team. Please click Accept to send error report or Cancel to dismiss report.",
- this.dialogReportModeAccept = "Accept",
- this.dialogReportModeCancel = "Cancel",
- this.pageReportModeTitle = "Crash",
+ 'Unexpected error occurred in application. Error report is ready to'
+ ' send to support team. Please click Accept to send error report '
+ 'or Cancel to dismiss report.',
+ this.dialogReportModeAccept = 'Accept',
+ this.dialogReportModeCancel = 'Cancel',
+ this.pageReportModeTitle = 'Crash',
this.pageReportModeDescription =
- "Unexpected error occurred in application. Error report is ready to send to support team. Please click Accept to send error report or Cancel to dismiss report.",
- this.pageReportModeAccept = "Accept",
- this.pageReportModeCancel = "Cancel",
- this.toastHandlerDescription = "Error occurred:",
- this.snackbarHandlerDescription = "Error occurred:",
+ 'Unexpected error occurred in application. Error report is ready to'
+ ' send to support team. Please click Accept to send error report '
+ 'or Cancel to dismiss report.',
+ this.pageReportModeAccept = 'Accept',
+ this.pageReportModeCancel = 'Cancel',
+ this.toastHandlerDescription = 'Error occurred:',
+ this.snackbarHandlerDescription = 'Error occurred:',
});
static LocalizationOptions buildDefaultEnglishOptions() {
- return LocalizationOptions("en");
+ return LocalizationOptions('en');
}
static LocalizationOptions buildDefaultChineseOptions() {
return LocalizationOptions(
- "zh",
- notificationReportModeTitle: "发生应用错误",
- notificationReportModeContent: "单击此处将错误报告发送给支持团队。",
- dialogReportModeTitle: "错误",
+ 'zh',
+ notificationReportModeTitle: '发生应用错误',
+ notificationReportModeContent: '单击此处将错误报告发送给支持团队。',
+ dialogReportModeTitle: '错误',
dialogReportModeDescription:
- "应用程序中发生意外错误。 错误报告已准备好发送给支持团队。 请单击“接受”以发送错误报告,或单击“取消”以关闭报告。",
- dialogReportModeAccept: "接受",
- dialogReportModeCancel: "取消",
- pageReportModeTitle: "错误",
+ '应用程序中发生意外错误。 错误报告已准备好发送给支持团队。 请单击“接受”以发送错误报告,或单击“取消”以关闭报告。',
+ dialogReportModeAccept: '接受',
+ dialogReportModeCancel: '取消',
+ pageReportModeTitle: '错误',
pageReportModeDescription:
- "应用程序中发生意外错误。 错误报告已准备好发送给支持团队。 请单击“接受”以发送错误报告,或单击“取消”以关闭报告。",
- pageReportModeAccept: "接受",
- pageReportModeCancel: "取消",
- toastHandlerDescription: "发生了错误:",
- snackbarHandlerDescription: "发生了错误:",
+ '应用程序中发生意外错误。 错误报告已准备好发送给支持团队。 请单击“接受”以发送错误报告,或单击“取消”以关闭报告。',
+ pageReportModeAccept: '接受',
+ pageReportModeCancel: '取消',
+ toastHandlerDescription: '发生了错误:',
+ snackbarHandlerDescription: '发生了错误:',
);
}
static LocalizationOptions buildDefaultHindiOptions() {
return LocalizationOptions(
- "hi",
- notificationReportModeTitle: "एप्लिकेशन त्रुटि हुई",
+ 'hi',
+ notificationReportModeTitle: 'एप्लिकेशन त्रुटि हुई',
notificationReportModeContent:
- "समर्थन टीम को त्रुटि रिपोर्ट भेजने के लिए यहां क्लिक करें।.",
- dialogReportModeTitle: "दुर्घटना",
+ 'समर्थन टीम को त्रुटि रिपोर्ट भेजने के लिए यहां क्लिक करें।.',
+ dialogReportModeTitle: 'दुर्घटना',
dialogReportModeDescription:
- "आवेदन में अप्रत्याशित त्रुटि हुई। त्रुटि रिपोर्ट समर्थन टीम को भेजने के लिए तैयार है। कृपया त्रुटि रिपोर्ट भेजने के लिए स्वीकार करें या रिपोर्ट को रद्द करने के लिए रद्द करें पर क्लिक करें।",
- dialogReportModeAccept: "स्वीकार करना",
- dialogReportModeCancel: "रद्द करना",
- pageReportModeTitle: "दुर्घटना",
+ 'आवेदन में अप्रत्याशित त्रुटि हुई। त्रुटि रिपोर्ट समर्थन टीम को '
+ 'भेजने के लिए तैयार है। कृपया त्रुटि रिपोर्ट भेजने के लिए '
+ 'स्वीकार करें या रिपोर्ट को रद्द करने के लिए रद्द करें पर क्लिक '
+ 'करें।',
+ dialogReportModeAccept: 'स्वीकार करना',
+ dialogReportModeCancel: 'रद्द करना',
+ pageReportModeTitle: 'दुर्घटना',
pageReportModeDescription:
- "आवेदन में अप्रत्याशित त्रुटि हुई। त्रुटि रिपोर्ट समर्थन टीम को भेजने के लिए तैयार है। कृपया त्रुटि रिपोर्ट भेजने के लिए स्वीकार करें या रिपोर्ट को रद्द करने के लिए रद्द करें पर क्लिक करें।",
- pageReportModeAccept: "स्वीकार करना",
- pageReportModeCancel: "रद्द करना",
- toastHandlerDescription: "त्रुटि हुई:",
- snackbarHandlerDescription: "त्रुटि हुई:",
+ 'आवेदन में अप्रत्याशित त्रुटि हुई। त्रुटि रिपोर्ट समर्थन टीम को '
+ 'भेजने के लिए तैयार है। कृपया त्रुटि रिपोर्ट भेजने के लिए '
+ 'स्वीकार करें या रिपोर्ट को रद्द करने के लिए रद्द करें पर क्लिक '
+ 'करें।',
+ pageReportModeAccept: 'स्वीकार करना',
+ pageReportModeCancel: 'रद्द करना',
+ toastHandlerDescription: 'त्रुटि हुई:',
+ snackbarHandlerDescription: 'त्रुटि हुई:',
);
}
static LocalizationOptions buildDefaultSpanishOptions() {
return LocalizationOptions(
- "es",
- notificationReportModeTitle: "Error de aplicación ocurrió",
+ 'es',
+ notificationReportModeTitle: 'Error de aplicación ocurrió',
notificationReportModeContent:
- "Haga clic aquí para enviar un informe de error al equipo de soporte.",
- dialogReportModeTitle: "Choque",
+ 'Haga clic aquí para enviar un informe de error al equipo de '
+ 'soporte.',
+ dialogReportModeTitle: 'Choque',
dialogReportModeDescription:
- "Se ha producido un error inesperado en la aplicación. El informe de errores está listo para enviar al equipo de soporte. Haga clic en Aceptar para enviar el informe de errores o en Cancelar para cancelar el informe.",
- dialogReportModeAccept: "Aceptar",
- dialogReportModeCancel: "Cancelar",
- pageReportModeTitle: "Choque",
+ 'Se ha producido un error inesperado en la aplicación. El informe '
+ 'de errores está listo para enviar al equipo de soporte. '
+ 'Haga clic en Aceptar para enviar el informe de errores o en '
+ 'Cancelar para cancelar el informe.',
+ dialogReportModeAccept: 'Aceptar',
+ dialogReportModeCancel: 'Cancelar',
+ pageReportModeTitle: 'Choque',
pageReportModeDescription:
- "Se ha producido un error inesperado en la aplicación. El informe de errores está listo para enviar al equipo de soporte. Haga clic en Aceptar para enviar el informe de errores o en Cancelar para cancelar el informe.",
- pageReportModeAccept: "Aceptar",
- pageReportModeCancel: "Cancelar",
- toastHandlerDescription: "Se produjo un error:",
- snackbarHandlerDescription: "Se produjo un error:",
+ 'Se ha producido un error inesperado en la aplicación. El informe '
+ 'de errores está listo para enviar al equipo de soporte. Haga '
+ 'clic en Aceptar para enviar el informe de errores o en '
+ 'Cancelar para cancelar el informe.',
+ pageReportModeAccept: 'Aceptar',
+ pageReportModeCancel: 'Cancelar',
+ toastHandlerDescription: 'Se produjo un error:',
+ snackbarHandlerDescription: 'Se produjo un error:',
);
}
static LocalizationOptions buildDefaultMalayOptions() {
return LocalizationOptions(
- "ms",
- notificationReportModeTitle: "Ralat permohonan berlaku",
+ 'ms',
+ notificationReportModeTitle: 'Ralat permohonan berlaku',
notificationReportModeContent:
- "Klik di sini untuk menghantar laporan ralat untuk menyokong pasukan.",
- dialogReportModeTitle: "Kemalangan",
+ 'Klik di sini untuk menghantar laporan ralat untuk menyokong '
+ 'pasukan.',
+ dialogReportModeTitle: 'Kemalangan',
dialogReportModeDescription:
- "Ralat tidak dijangka berlaku dalam aplikasi. Laporan ralat sedia dihantar untuk menyokong pasukan. Sila klik Terima untuk menghantar laporan ralat atau Batal untuk menolak laporan.",
- dialogReportModeAccept: "Terima",
- dialogReportModeCancel: "Batalkan",
- pageReportModeTitle: "Kemalangan",
+ 'Ralat tidak dijangka berlaku dalam aplikasi. Laporan ralat sedia '
+ 'dihantar untuk menyokong pasukan. Sila klik Terima untuk '
+ 'menghantar laporan ralat atau Batal untuk menolak laporan.',
+ dialogReportModeAccept: 'Terima',
+ dialogReportModeCancel: 'Batalkan',
+ pageReportModeTitle: 'Kemalangan',
pageReportModeDescription:
- "Ralat tidak dijangka berlaku dalam aplikasi. Laporan ralat sedia dihantar untuk menyokong pasukan. Sila klik Terima untuk menghantar laporan ralat atau Batal untuk menolak laporan.",
- pageReportModeAccept: "Terima",
- pageReportModeCancel: "Batalkan",
- toastHandlerDescription: "Ralat berlaku:",
- snackbarHandlerDescription: "Ralat berlaku:",
+ 'Ralat tidak dijangka berlaku dalam aplikasi. Laporan ralat sedia'
+ ' dihantar untuk menyokong pasukan. Sila klik Terima untuk '
+ 'menghantar laporan ralat atau Batal untuk menolak laporan.',
+ pageReportModeAccept: 'Terima',
+ pageReportModeCancel: 'Batalkan',
+ toastHandlerDescription: 'Ralat berlaku:',
+ snackbarHandlerDescription: 'Ralat berlaku:',
);
}
static LocalizationOptions buildDefaultRussianOptions() {
return LocalizationOptions(
- "ru",
- notificationReportModeTitle: "Произошла ошибка приложения",
+ 'ru',
+ notificationReportModeTitle: 'Произошла ошибка приложения',
notificationReportModeContent:
- "Нажмите здесь, чтобы отправить отчет об ошибке в службу поддержки.",
- dialogReportModeTitle: "авария",
+ 'Нажмите здесь, чтобы отправить отчет об ошибке в службу поддержки.',
+ dialogReportModeTitle: 'авария',
dialogReportModeDescription:
- "В приложении произошла непредвиденная ошибка. Отчет об ошибке готов к отправке в службу поддержки. Пожалуйста, нажмите Принять, чтобы отправить отчет об ошибке или Отмена, чтобы закрыть отчет.",
- dialogReportModeAccept: "принимать",
- dialogReportModeCancel: "отменить",
- pageReportModeTitle: "авария",
+ 'В приложении произошла непредвиденная ошибка. Отчет об ошибке готов '
+ 'к отправке в службу поддержки. Пожалуйста, нажмите Принять, чтобы '
+ 'отправить отчет об ошибке или Отмена, чтобы закрыть отчет.',
+ dialogReportModeAccept: 'принимать',
+ dialogReportModeCancel: 'отменить',
+ pageReportModeTitle: 'авария',
pageReportModeDescription:
- "В приложении произошла непредвиденная ошибка. Отчет об ошибке готов к отправке в службу поддержки. Пожалуйста, нажмите Принять, чтобы отправить отчет об ошибке или Отмена, чтобы закрыть отчет.",
- pageReportModeAccept: "принимать",
- pageReportModeCancel: "отменить",
- toastHandlerDescription: "Произошла ошибка:",
- snackbarHandlerDescription: "Произошла ошибка:",
+ 'В приложении произошла непредвиденная ошибка. Отчет об ошибке готов '
+ 'к отправке в службу поддержки. Пожалуйста, нажмите Принять, чтобы '
+ 'отправить отчет об ошибке или Отмена, чтобы закрыть отчет.',
+ pageReportModeAccept: 'принимать',
+ pageReportModeCancel: 'отменить',
+ toastHandlerDescription: 'Произошла ошибка:',
+ snackbarHandlerDescription: 'Произошла ошибка:',
);
}
static LocalizationOptions buildDefaultPortugueseOptions() {
return LocalizationOptions(
- "pt",
- notificationReportModeTitle: "Erro na aplicação",
+ 'pt',
+ notificationReportModeTitle: 'Erro na aplicação',
notificationReportModeContent:
- "Clique aqui para enviar o relatório de erros à equipe de suporte.",
- dialogReportModeTitle: "Erro",
+ 'Clique aqui para enviar o relatório de erros à equipe de suporte.',
+ dialogReportModeTitle: 'Erro',
dialogReportModeDescription:
- "Ocorreu um erro inesperado no aplicativo. O relatório de erros está pronto para ser enviado à equipe de suporte. Por favor, clique em Aceitar para enviar o relatório de erros ou em Cancelar para descartar o relatório.",
- dialogReportModeAccept: "Aceitar",
- dialogReportModeCancel: "Cancelar",
- pageReportModeTitle: "Erro",
+ 'Ocorreu um erro inesperado no aplicativo. O relatório de erros está '
+ 'pronto para ser enviado à equipe de suporte. Por favor, clique em '
+ 'Aceitar para enviar o relatório de erros ou em Cancelar para '
+ 'descartar o relatório.',
+ dialogReportModeAccept: 'Aceitar',
+ dialogReportModeCancel: 'Cancelar',
+ pageReportModeTitle: 'Erro',
pageReportModeDescription:
- "Ocorreu um erro inesperado no aplicativo. O relatório de erros está pronto para ser enviado à equipe de suporte. Por favor, clique em Aceitar para enviar o relatório de erros ou em Cancelar para descartar o relatório.",
- pageReportModeAccept: "Aceitar",
- pageReportModeCancel: "Cancelar",
- toastHandlerDescription: "Ocorreu um erro:",
- snackbarHandlerDescription: "Ocorreu um erro:",
+ 'Ocorreu um erro inesperado no aplicativo. O relatório de erros '
+ 'está pronto para ser enviado à equipe de suporte. Por favor, clique '
+ 'em Aceitar para enviar o relatório de erros ou em Cancelar para '
+ 'descartar o relatório.',
+ pageReportModeAccept: 'Aceitar',
+ pageReportModeCancel: 'Cancelar',
+ toastHandlerDescription: 'Ocorreu um erro:',
+ snackbarHandlerDescription: 'Ocorreu um erro:',
);
}
static LocalizationOptions buildDefaultFrenchOptions() {
return LocalizationOptions(
- "fr",
+ 'fr',
notificationReportModeTitle: "Une erreur d'application s'est produite",
notificationReportModeContent:
"Cliquez ici pour envoyer un rapport d'erreur à l'équipe de support.",
- dialogReportModeTitle: "Fracas",
+ dialogReportModeTitle: 'Fracas',
dialogReportModeDescription:
- "Une erreur inattendue s'est produite dans l'application. Le rapport d'erreur est prêt à être envoyé à l'équipe de support. Cliquez sur Accepter pour envoyer le rapport d'erreur ou sur Annuler pour rejeter le rapport.",
- dialogReportModeAccept: "Acceptez",
- dialogReportModeCancel: "Annuler",
- pageReportModeTitle: "Fracas",
+ "Une erreur inattendue s'est produite dans l'application. Le rapport "
+ "d'erreur est prêt à être envoyé à l'équipe de support. Cliquez sur "
+ "Accepter pour envoyer le rapport d'erreur ou sur Annuler pour"
+ ' rejeter le rapport.',
+ dialogReportModeAccept: 'Acceptez',
+ dialogReportModeCancel: 'Annuler',
+ pageReportModeTitle: 'Fracas',
pageReportModeDescription:
- "Une erreur inattendue s'est produite dans l'application. Le rapport d'erreur est prêt à être envoyé à l'équipe de support. Cliquez sur Accepter pour envoyer le rapport d'erreur ou sur Annuler pour rejeter le rapport.",
- pageReportModeAccept: "Acceptez",
- pageReportModeCancel: "Annuler",
- toastHandlerDescription: "Erreur est survenue:",
- snackbarHandlerDescription: "Erreur est survenue:",
+ "Une erreur inattendue s'est produite dans l'application. Le rapport "
+ "d'erreur est prêt à être envoyé à l'équipe de support. Cliquez sur "
+ "Accepter pour envoyer le rapport d'erreur ou sur Annuler pour "
+ 'rejeter le rapport.',
+ pageReportModeAccept: 'Acceptez',
+ pageReportModeCancel: 'Annuler',
+ toastHandlerDescription: 'Erreur est survenue:',
+ snackbarHandlerDescription: 'Erreur est survenue:',
);
}
static LocalizationOptions buildDefaultPolishOptions() {
return LocalizationOptions(
- "pl",
- notificationReportModeTitle: "Wystąpił błąd aplikacji",
+ 'pl',
+ notificationReportModeTitle: 'Wystąpił błąd aplikacji',
notificationReportModeContent:
- "Naciśnij tutaj aby wysłać raport do zespołu wpsarcia",
- dialogReportModeTitle: "Błąd aplikacji",
+ 'Naciśnij tutaj aby wysłać raport do zespołu wpsarcia',
+ dialogReportModeTitle: 'Błąd aplikacji',
dialogReportModeDescription:
- "Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby wysłać raport lub odrzuć aby odrzucić raport.",
- dialogReportModeAccept: "Akceptuj",
- dialogReportModeCancel: "Odrzuć",
- pageReportModeTitle: "Błąd aplikacji",
+ 'Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest gotowy '
+ 'do wysłania do zespołu wsparcia. Naciśnij akceptuj aby wysłać'
+ ' raport lub odrzuć aby odrzucić raport.',
+ dialogReportModeAccept: 'Akceptuj',
+ dialogReportModeCancel: 'Odrzuć',
+ pageReportModeTitle: 'Błąd aplikacji',
pageReportModeDescription:
- "Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby wysłać raport lub odrzuć aby odrzucić raport.",
- pageReportModeAccept: "Akceptuj",
- pageReportModeCancel: "Odrzuć",
- toastHandlerDescription: "Wystąpił błąd:",
- snackbarHandlerDescription: "Wystąpił błąd:",
+ 'Wystąpił niespodziewany błąd aplikacji. Raport z błędem jest '
+ 'gotowy do wysłania do zespołu wsparcia. Naciśnij akceptuj aby '
+ 'wysłać raport lub odrzuć aby odrzucić raport.',
+ pageReportModeAccept: 'Akceptuj',
+ pageReportModeCancel: 'Odrzuć',
+ toastHandlerDescription: 'Wystąpił błąd:',
+ snackbarHandlerDescription: 'Wystąpił błąd:',
);
}
static LocalizationOptions buildDefaultItalianOptions() {
return LocalizationOptions(
'it',
- notificationReportModeTitle: "Si è verificato un errore",
+ notificationReportModeTitle: 'Si è verificato un errore',
notificationReportModeContent:
- "Clicca qui per inviare il report relativo all'errore al team di supporto.",
- dialogReportModeTitle: "Errore",
+ "Clicca qui per inviare il report relativo all'errore al team di "
+ 'support.',
+ dialogReportModeTitle: 'Errore',
dialogReportModeDescription:
- "Si è verificato un errore imprevisto durante l'esecuzione. Il report è pronto per essere inviato al team di supporto. Clicca Accetta per inviare il report or Annulla per rifiutare.",
- dialogReportModeAccept: "Accetta",
- dialogReportModeCancel: "Annulla",
- pageReportModeTitle: "Errore",
+ "Si è verificato un errore imprevisto durante l'esecuzione. "
+ 'Il report è pronto per essere inviato al team di supporto. '
+ 'Clicca Acetate per inviare il report or Annulla per rifiutare.',
+ dialogReportModeAccept: 'Accetta',
+ dialogReportModeCancel: 'Annulla',
+ pageReportModeTitle: 'Errore',
pageReportModeDescription:
- "Si è verificato un errore imprevisto durante l'esecuzione. Il report è pronto per essere inviato al team di supporto. Clicca Accetta per inviare il report or Annulla per rifiutare.",
- pageReportModeAccept: "Accetta",
- pageReportModeCancel: "Annulla",
- toastHandlerDescription: "Errore:",
- snackbarHandlerDescription: "Errore:",
+ "Si è verificato un errore imprevisto durante l'esecuzione. "
+ 'Il report è pronto per essere inviato al team di supporto. '
+ 'Clicca Acetate per inviare il report or Annulla per rifiutare.',
+ pageReportModeAccept: 'Accetta',
+ pageReportModeCancel: 'Annulla',
+ toastHandlerDescription: 'Errore:',
+ snackbarHandlerDescription: 'Errore:',
);
}
static LocalizationOptions buildDefaultKoreanOptions() {
return LocalizationOptions(
'ko',
- notificationReportModeTitle: "어플리케이션 에러 발생",
- notificationReportModeContent: "지원팀에 오류를 보고하시려면 여기를 클릭하세요",
- dialogReportModeTitle: "에러",
+ notificationReportModeTitle: '어플리케이션 에러 발생',
+ notificationReportModeContent: '지원팀에 오류를 보고하시려면 여기를 클릭하세요',
+ dialogReportModeTitle: '에러',
dialogReportModeDescription:
- "어플리케이션에서 예기치 않은 오류가 발생했습니다. 지원팀에 오류를 보고할 준비가 되어 있으니 수락을 클릭하여 오류 보고서를 전송하시거나 취소를 클릭하여 보고서를 닫으세요.",
- dialogReportModeAccept: "수락",
- dialogReportModeCancel: "취소",
- pageReportModeTitle: "에러",
- pageReportModeDescription:
- "어플리케이션에서 예기치 않은 오류가 발생했습니다. 지원팀에 오류를 보고할 준비가 되어 있으니 수락을 클릭하여 오류 보고서를 전송하시거나 취소를 클릭하여 보고서를 닫으세요.",
- pageReportModeAccept: "수락",
- pageReportModeCancel: "취소",
- toastHandlerDescription: "오류가 발생했습니다:",
- snackbarHandlerDescription: "오류가 발생했습니다:",
+ '어플리케이션에서 예기치 않은 오류가 발생했습니다. 지원팀에 오류를 보고할 준비가 되어'
+ ' 있으니 수락을 클릭하여 오류 보고서를 전송하시거나 취소를 클릭하여 보고서를 닫으세요.',
+ dialogReportModeAccept: '수락',
+ dialogReportModeCancel: '취소',
+ pageReportModeTitle: '에러',
+ pageReportModeDescription: '어플리케이션에서 예기치 않은 오류가 발생했습니다. 지원팀에 오류를 보고할 '
+ '준비가 되어 있으니 수락을 클릭하여 오류 보고서를 전송하시거나 취소를 클릭하여 보고서를 닫으세요.',
+ pageReportModeAccept: '수락',
+ pageReportModeCancel: '취소',
+ toastHandlerDescription: '오류가 발생했습니다:',
+ snackbarHandlerDescription: '오류가 발생했습니다:',
);
}
static LocalizationOptions buildDefaultDutchOptions() {
return LocalizationOptions(
- "nl",
- notificationReportModeTitle: "Er is een fout opgetreden",
+ 'nl',
+ notificationReportModeTitle: 'Er is een fout opgetreden',
notificationReportModeContent:
- "Klik hier om het foutrapport te versturen naar het ondersteuningsteam.",
- dialogReportModeTitle: "Error",
+ 'Klik hier om het foutrapport te versturen naar het '
+ 'ondersteuningsteam.',
+ dialogReportModeTitle: 'Error',
dialogReportModeDescription:
- "Er is een onverwachte fout opgetreden in de applicatie. Het foutrapport is klaar om naar het ondersteuningsteam te worden verstuurd. Druk op accepteer om het rapport te versturen of op annuleer om het rapport te verwijderen.",
- dialogReportModeAccept: "Accepteer",
- dialogReportModeCancel: "Annuleer",
- pageReportModeTitle: "Error",
+ 'Er is een onverwachte fout opgetreden in de applicatie. '
+ 'Het foutrapport is klaar om naar het ondersteuningsteam te '
+ 'worden verstuurd. Druk op accepteer om het rapport te versturen '
+ 'of op annuleer om het rapport te verwijderen.',
+ dialogReportModeAccept: 'Accepteer',
+ dialogReportModeCancel: 'Annuleer',
+ pageReportModeTitle: 'Error',
pageReportModeDescription:
- "Er is een onverwachte fout opgetreden in de applicatie. Het foutrapport is klaar om naar het ondersteuningsteam te worden verstuurd. Druk op accepteer om het rapport te versturen of op annuleer om het rapport te verwijderen.",
- pageReportModeAccept: "Accepteer",
- pageReportModeCancel: "Annuleer",
- toastHandlerDescription: "Der er sket en fejl:",
- snackbarHandlerDescription: "Der er sket en fejl:",
+ 'Er is een onverwachte fout opgetreden in de applicatie. Het '
+ 'foutrapport is klaar om naar het ondersteuningsteam te worden '
+ 'verstuurd. Druk op accepteer om het rapport te versturen of op '
+ 'annuleer om het rapport te verwijderen.',
+ pageReportModeAccept: 'Accepteer',
+ pageReportModeCancel: 'Annuleer',
+ toastHandlerDescription: 'Der er sket en fejl:',
+ snackbarHandlerDescription: 'Der er sket en fejl:',
);
}
static LocalizationOptions buildDefaultGermanOptions() {
return LocalizationOptions(
- "de",
- notificationReportModeTitle: "Ein Anwendungsfehler ist aufgetreten",
+ 'de',
+ notificationReportModeTitle: 'Ein Anwendungsfehler ist aufgetreten',
notificationReportModeContent:
- "Klicken Sie hier, um einen Fehlerbericht an das Support-Team zu senden.",
- dialogReportModeTitle: "Absturz",
+ 'Klicken Sie hier, um einen Fehlerbericht an das Support-Team zu '
+ 'senden.',
+ dialogReportModeTitle: 'Absturz',
dialogReportModeDescription:
- "Unerwarteter Fehler in der Anwendung aufgetreten. Der Fehlerbericht ist bereit zum Senden an das Support-Team. Bitte klicken Sie auf Akzeptieren, um den Fehlerbericht zu senden, oder auf Abbrechen, um den Bericht zu verwerfen.",
- dialogReportModeAccept: "Akzeptieren",
- dialogReportModeCancel: "Abbrechen",
- pageReportModeTitle: "Absturz",
+ 'Unerwarteter Fehler in der Anwendung aufgetreten. Der '
+ 'Fehlerbericht ist bereit zum Senden an das Support-Team. '
+ 'Bitte klicken Sie auf Akzeptieren, um den Fehlerbericht zu '
+ 'senden, oder auf Abbrechen, um den Bericht zu verwerfen.',
+ dialogReportModeAccept: 'Akzeptieren',
+ dialogReportModeCancel: 'Abbrechen',
+ pageReportModeTitle: 'Absturz',
pageReportModeDescription:
- "Unerwarteter Fehler in der Anwendung aufgetreten. Der Fehlerbericht ist bereit zum Senden an das Support-Team. Bitte klicken Sie auf Akzeptieren, um den Fehlerbericht zu senden, oder auf Abbrechen, um den Bericht zu verwerfen.",
- pageReportModeAccept: "Akzeptieren",
- pageReportModeCancel: "Abbrechen",
- toastHandlerDescription: "Es ist ein Fehler aufgetreten:",
- snackbarHandlerDescription: "Es ist ein Fehler aufgetreten:",
+ 'Unerwarteter Fehler in der Anwendung aufgetreten. Der Fehlerbericht'
+ ' ist bereit zum Senden an das Support-Team. Bitte klicken Sie '
+ 'auf Akzeptieren, um den Fehlerbericht zu senden, oder auf Abbrechen,'
+ ' um den Bericht zu verwerfen.',
+ pageReportModeAccept: 'Akzeptieren',
+ pageReportModeCancel: 'Abbrechen',
+ toastHandlerDescription: 'Es ist ein Fehler aufgetreten:',
+ snackbarHandlerDescription: 'Es ist ein Fehler aufgetreten:',
);
}
diff --git a/lib/model/report.dart b/lib/model/report.dart
index 40452ebe..90029329 100644
--- a/lib/model/report.dart
+++ b/lib/model/report.dart
@@ -52,23 +52,23 @@ class Report {
bool enableStackTrace = true,
bool enableCustomParameters = false,
}) {
- final Map json = {
- "error": error.toString(),
- "customParameters": customParameters,
- "dateTime": dateTime.toIso8601String(),
- "platformType": describeEnum(platformType),
+ final json = {
+ 'error': error.toString(),
+ 'customParameters': customParameters,
+ 'dateTime': dateTime.toIso8601String(),
+ 'platformType': describeEnum(platformType),
};
if (enableDeviceParameters) {
- json["deviceParameters"] = deviceParameters;
+ json['deviceParameters'] = deviceParameters;
}
if (enableApplicationParameters) {
- json["applicationParameters"] = applicationParameters;
+ json['applicationParameters'] = applicationParameters;
}
if (enableStackTrace) {
- json["stackTrace"] = stackTrace.toString();
+ json['stackTrace'] = stackTrace.toString();
}
if (enableCustomParameters) {
- json["customParameters"] = customParameters;
+ json['customParameters'] = customParameters;
}
return json;
}
diff --git a/lib/model/report_handler.dart b/lib/model/report_handler.dart
index 5140708a..265ee196 100644
--- a/lib/model/report_handler.dart
+++ b/lib/model/report_handler.dart
@@ -1,16 +1,15 @@
+import 'package:catcher/model/localization_options.dart';
import 'package:catcher/model/platform_type.dart';
import 'package:catcher/model/report.dart';
import 'package:catcher/utils/catcher_logger.dart';
import 'package:flutter/material.dart';
-import 'localization_options.dart';
-
abstract class ReportHandler {
///Logger instance
late CatcherLogger logger;
/// Method called when report has been accepted by user
- Future handle(Report error, BuildContext? context);
+ Future handle(Report report, BuildContext? context);
/// Get list of supported platforms
List getSupportedPlatforms();
diff --git a/lib/utils/catcher_error_widget.dart b/lib/utils/catcher_error_widget.dart
index 841727a4..32dcb168 100644
--- a/lib/utils/catcher_error_widget.dart
+++ b/lib/utils/catcher_error_widget.dart
@@ -8,14 +8,16 @@ class CatcherErrorWidget extends StatelessWidget {
final double maxWidthForSmallMode;
const CatcherErrorWidget({
- Key? key,
- this.details,
required this.showStacktrace,
required this.title,
required this.description,
required this.maxWidthForSmallMode,
- }) : assert(maxWidthForSmallMode > 0),
- super(key: key);
+ super.key,
+ this.details,
+ }) : assert(
+ maxWidthForSmallMode > 0,
+ 'Max width for small mode must be greater than 0',
+ );
@override
Widget build(BuildContext context) {
@@ -58,7 +60,7 @@ class CatcherErrorWidget extends StatelessWidget {
textAlign: TextAlign.center,
),
const SizedBox(height: 10),
- _buildStackTraceWidget()
+ _buildStackTraceWidget(),
],
),
),
@@ -75,18 +77,19 @@ class CatcherErrorWidget extends StatelessWidget {
Widget _buildStackTraceWidget() {
if (showStacktrace) {
- final List items = [];
+ final items = [];
if (details != null) {
- items.add(details!.exception.toString());
- items.addAll(details!.stack.toString().split("\n"));
+ items
+ ..add(details!.exception.toString())
+ ..addAll(details!.stack.toString().split('\n'));
}
return ListView.builder(
- padding: const EdgeInsets.all(8.0),
+ padding: const EdgeInsets.all(8),
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
- final String line = items[index];
+ final line = items[index];
if (line.isNotEmpty == true) {
return Text(line);
} else {
@@ -100,9 +103,9 @@ class CatcherErrorWidget extends StatelessWidget {
}
String _getDescription() {
- String descriptionText = description;
+ var descriptionText = description;
if (showStacktrace) {
- descriptionText += " See details below.";
+ descriptionText += ' See details below.';
}
return descriptionText;
}
diff --git a/lib/utils/catcher_logger.dart b/lib/utils/catcher_logger.dart
index d20768b2..73c03503 100644
--- a/lib/utils/catcher_logger.dart
+++ b/lib/utils/catcher_logger.dart
@@ -2,7 +2,7 @@ import 'package:logging/logging.dart';
///Class used to provide logger for Catcher.
class CatcherLogger {
- final Logger _logger = Logger("Catcher");
+ final Logger _logger = Logger('Catcher');
///Setup logger configuration.
void setup() {
@@ -11,7 +11,8 @@ class CatcherLogger {
(LogRecord rec) {
// ignore: avoid_print
print(
- '[${rec.time} | ${rec.loggerName} | ${rec.level.name}] ${rec.message}',
+ '[${rec.time} | ${rec.loggerName} | ${rec.level.name}] '
+ '${rec.message}',
);
},
);
diff --git a/pubspec.yaml b/pubspec.yaml
index 44878d68..9939a034 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,11 +1,19 @@
name: catcher
description: Plugin for error catching which provides multiple handlers for dealing with errors when they are not caught by the developer.
-version: 0.7.0
+version: 0.8.0
#author: Jakub Homlala
homepage: https://github.com/jhomlala/catcher
+repository: https://github.com/jhomlala/catcher
+issue_tracker: https://github.com/jhomlala/catcher/issues
+topis:
+ - error
+ - errors
+ - logs
+ - devtools
+ - tool
environment:
- sdk: '>=2.12.0 <3.0.0'
+ sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.0.0"
dependencies:
@@ -13,19 +21,20 @@ dependencies:
sdk: flutter
flutter_web_plugins:
sdk: flutter
- fluttertoast: ^8.0.8
- device_info_plus: ^7.0.0
- device_info_plus_platform_interface: ^6.0.0
- package_info_plus: ^3.0.0
- mailer: ^5.0.2
- dio: ^4.0.1
+ fluttertoast: ^8.2.3
+ device_info_plus: ^9.1.0
+ device_info_plus_platform_interface: ^7.0.0
+ package_info_plus: ^4.2.0
+ mailer: ^6.0.1
+ dio: ^5.3.3
flutter_mailer: ^2.0.0
logging: ^1.0.2
- sentry: ^6.1.0
+ sentry: ^7.12.0
universal_io: ^2.0.4
+ very_good_analysis: ^5.1.0
dev_dependencies:
- lint: ^1.7.2
+ lint: ^2.1.2
flutter:
plugin: