Flutter异常捕获与日志管理插件catcher的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter异常捕获与日志管理插件Catcher的使用

简介

Catcher 是一个Flutter插件,它可以自动捕获错误/异常并处理它们。Catcher提供了多种方式来处理错误,并支持Android、iOS、Web、Linux、Windows和MacOS平台。

Catcher Logo

安装

pubspec.yaml中添加依赖:

dependencies:
  catcher: ^0.8.0

然后运行命令安装依赖包:

$ flutter packages get

接下来添加导入语句:

import 'package:catcher/catcher.dart';

基本示例

以下是一个基本的例子,它展示了如何使用Dialog Report Mode和Console Handler进行调试配置,以及使用Dialog Report Mode和Email Manual Handler进行发布配置。

步骤1:创建Catcher配置

CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [ConsoleHandler()]);
CatcherOptions releaseOptions = CatcherOptions(DialogReportMode(), [
  EmailManualHandler(["support@email.com"])
]);

步骤2:传递根组件和Catcher配置

Catcher(rootWidget: MyApp(), debugConfig: debugOptions, releaseConfig: releaseOptions);

步骤3:添加navigator key到MaterialApp或CupertinoApp

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: Catcher.navigatorKey,
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Plugin example app'),
          ),
          body: ChildWidget()),
    );
  }
}

测试代码

class ChildWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: TextButton(
            child: Text("Generate error"),
            onPressed: () => generateError()));
  }

  generateError() async {
    throw "Test exception";
  }
}

如果你运行这段代码,你会看到屏幕上有一个“Generate error”的按钮。点击这个按钮后,它将生成一个测试异常,该异常会被Catcher捕获。在用户确认对话框之前,Catcher不会将报告发送给处理器;一旦用户确认,报告将被发送到控制台处理器,后者会将错误信息记录到控制台。

更多功能

报告模式(Report Modes)

Catcher支持四种报告模式:

  • Silent Report Mode:默认模式,不询问用户许可直接处理日志。
  • Notification Report Mode:已移除,因为与Firebase不兼容。
  • Dialog Report Mode:显示包含错误信息的对话框,用户可以选择接受或取消。
  • Page Report Mode:显示新的页面,包含错误信息和堆栈跟踪视图。

处理器(Handlers)

Catcher支持多种处理器来处理错误报告:

  • Console Handler:将日志输出到控制台。
  • Email Manual Handler:允许用户手动发送电子邮件报告。
  • Email Auto Handler:自动发送带有错误报告的电子邮件。
  • Http Handler:将报告发送到外部服务器。
  • File Handler:将日志存储在文件中。
  • Toast Handler:以短消息形式展示错误信息。
  • Sentry Handler将错误发送到Sentry.io
  • Slack Handler:将消息发送到Slack工作区。
  • Discord Handler:将消息发送到Discord服务器。
  • Snackbar Handler:显示自定义的Snackbar消息。

其他特性

  • Localization:支持多语言本地化。
  • Explicit Exception Handlers Map:为特定异常设置专门的处理器。
  • Explicit Exception Report Modes Map:为特定异常设置专门的报告模式。
  • Error Widget:替换默认的红色死亡屏幕。
  • Current Config:获取当前使用的配置。
  • Update Config:运行时更新Catcher配置。
  • Screenshots:自动创建并包含截图在报告中。

示例代码

以下是完整的示例代码,结合了上述所有配置:

import 'package:catcher/catcher.dart';
import 'package:flutter/material.dart';

void main() {
  final debugOptions = CatcherOptions(
    DialogReportMode(),
    [
      HttpHandler(HttpRequestType.post, Uri.parse('https://jsonplaceholder.typicode.com/posts'), printLogs: true),
      ConsoleHandler(),
    ],
  );

  final releaseOptions = CatcherOptions(
    PageReportMode(),
    [
      SentryHandler(SentryClient(SentryOptions(dsn: '<DSN>'))),
      ConsoleHandler(),
    ],
  );

  Catcher(
    runAppFunction: () {
      runApp(const MyApp());
    },
    debugConfig: debugOptions,
    releaseConfig: releaseOptions,
  );
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: Catcher.navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Catcher example'),
        ),
        body: const ChildWidget(),
      ),
    );
  }
}

class ChildWidget extends StatelessWidget {
  const ChildWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return TextButton(
      onPressed: generateError,
      child: const Text('Generate error'),
    );
  }

  Future<void> generateError() async {
    Catcher.sendTestException();
  }
}

通过以上步骤,你可以在Flutter项目中集成Catcher插件,实现强大的异常捕获和日志管理功能。


更多关于Flutter异常捕获与日志管理插件catcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异常捕获与日志管理插件catcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,异常捕获与日志管理对于确保应用的稳定性和用户体验至关重要。catcher 是一个功能强大的 Flutter 插件,它可以帮助你轻松地实现异常捕获和日志管理。以下是如何在 Flutter 项目中使用 catcher 插件的示例代码。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 catcher 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  catcher: ^0.6.8  # 请检查最新版本号

然后运行 flutter pub get 来获取依赖。

2. 配置 Catcher

main.dart 或其他合适的位置配置 Catcher。以下是一个基本的配置示例:

import 'package:flutter/material.dart';
import 'package:catcher/catcher.dart';

void main() {
  // 配置 Catcher
  CatcherOptions config = CatcherOptions(
    enableLog: true, // 启用日志捕获
    enableReport: true, // 启用报告
    enableDialog: true, // 启用错误对话框
    unhandledExceptionHandlers: [
      // 自定义未处理异常处理器
      (context, error) {
        // 你可以在这里添加自定义处理逻辑,比如发送错误报告到服务器
        print("Custom Unhandled Exception: $error");
      },
    ],
    dialogConfigs: [
      DialogConfig(
        reportButtonText: "Report",
        closeButtonText: "Close",
        title: "An error occurred",
        description: "Sorry, an unexpected error occurred. Please try again later.",
        customHead: null, // 自定义头部
        customBody: null, // 自定义主体
      ),
    ],
    // 你可以在这里配置更多的选项,比如日志级别、报告接收者等
  );

  // 初始化 Catcher
  Catcher.initialize(config).then((_) {
    runApp(MyApp());
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Catcher Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 触发一个错误来测试 Catcher
              throw Exception("This is a test exception!");
            },
            child: Text('Throw Exception'),
          ),
        ),
      ),
    );
  }
}

3. 处理捕获的异常

在上面的代码中,我们配置了 Catcher 以捕获未处理的异常,并在触发异常时显示一个对话框。你可以通过 unhandledExceptionHandlers 属性添加自定义的异常处理逻辑。

4. 查看日志和报告

Catcher 默认会将捕获的日志和报告输出到控制台。如果你需要将日志和报告发送到远程服务器,你可以配置 reportReceivers 属性,比如使用 HttpReportReceiver

reportReceivers: [
  HttpReportReceiver(
    url: "https://your-server.com/report",
    method: HttpMethod.POST,
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer YOUR_TOKEN",
    },
    reportSerializer: JsonReportSerializer(), // 使用 JSON 序列化器
  ),
],

5. 运行应用

现在你可以运行你的 Flutter 应用,并触发一个异常来测试 Catcher 是否正常工作。你应该能看到一个错误对话框,并且异常信息会被捕获并输出到控制台(或发送到配置的远程服务器)。

通过以上步骤,你就可以在 Flutter 项目中成功集成和使用 catcher 插件来实现异常捕获和日志管理。根据项目的实际需求,你可以进一步定制 Catcher 的配置。

回到顶部