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

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

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

介绍

Catcher 2 是一个Flutter插件,它可以自动捕捉错误/异常,并提供多种处理这些异常的方式。它是基于Jakub Homlala开发的Catcher进行改进和修复后的版本。

pub package CI license platform-flutter Awesome Flutter

它受到ACRA(ACRA)的启发,支持Android、iOS、Web、Linux、Windows和MacOS平台。

安装

pubspec.yaml 添加依赖

dependencies:
  catcher_2: ^2.0.0-alpha.0

获取包

$ flutter packages get

导入

import 'package:catcher_2/catcher_2.dart';

升级自catcher

如果您之前正确使用了catcher,则只需替换以下字符串:

  • Catcher -> Catcher2
  • catcher -> catcher_2 (在少数地方需要使用catcher2)

注意:

  • HttpHandler由于升级到dio 5.x有一些破坏性更改。

如果不确定或遇到问题,请提交新问题

基本示例

下面是一个完整的例子,展示了如何配置和使用Catcher 2来捕捉异常并处理它们。

示例代码

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

void main() {
  /// 配置调试选项(开发模式下使用的设置)
  final debugOptions = Catcher2Options(
    /// 在对话框中显示捕获到的错误信息
    DialogReportMode(),
    [
      /// 将日志发送到HTTP服务器
      HttpHandler(
        HttpRequestType.post,
        Uri.parse('https://jsonplaceholder.typicode.com/posts'),
        printLogs: true,
      ),
      /// 在控制台打印日志
      ConsoleHandler(),
    ],
  );

  /// 配置生产选项(发布模式下使用的设置)
  final releaseOptions = Catcher2Options(
    /// 显示新页面,包含捕获到的错误信息
    PageReportMode(),
    [
      /// 将日志发送到Sentry
      SentryHandler(
        SentryClient(
          SentryOptions(dsn: '<DSN>'),
        ),
      ),
      /// 在控制台打印日志
      ConsoleHandler(),
    ],
  );

  /// 启动Catcher并启动应用程序。现在Catcher将守护并报告任何错误到您配置的服务!
  Catcher2(
    runAppFunction: () {
      runApp(const MyApp());
    },
    ensureInitialized: true,
    debugConfig: debugOptions,
    releaseConfig: releaseOptions,
  );
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

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

  @override
  Widget build(BuildContext context) => MaterialApp(
        /// 最后一步:在这里添加Catcher的navigator key,以便Catcher可以显示页面和对话框!
        navigatorKey: Catcher2.navigatorKey,
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Catcher example'),
          ),
          body: const ChildWidget(),
        ),
      );
}

class ChildWidget extends StatelessWidget {
  const ChildWidget({super.key});

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

  /// 触发一些错误。
  Future<void> generateError() async {
    Catcher2.sendTestException();
  }
}

更多功能

报告模式

Catcher 2 支持四种报告模式:

  • Silent Report Mode:静默模式,不会询问用户是否处理崩溃日志,而是直接发送给处理器。
  • Dialog Report Mode:对话框模式,通过对话框提示用户是否发送错误报告。
  • Page Report Mode:页面模式,通过新页面提示用户是否发送错误报告。
  • Notification Report Mode:通知模式(已移除,因为与Firebase不兼容)。

处理器

Catcher 2 提供了多种处理器用于处理错误报告:

  • Console Handler:在控制台打印错误日志。
  • Email Manual Handler:手动发送邮件。
  • Email Auto Handler:自动发送邮件。
  • Http Handler:通过HTTP请求发送日志。
  • File Handler:将日志保存到文件。
  • Toast Handler:以Toast形式显示短消息。
  • Sentry Handler发送错误报告到Sentry.io
  • Slack Handler:发送消息到Slack。
  • Discord Handler:发送消息到Discord。
  • Snackbar Handler:显示定制化的Snackbar消息。
  • Crashlytics Handler:已被移除,但可以通过自定义报告模式重新启用。

错误小部件

您可以添加一个错误小部件来替代红色死亡屏幕。具体方法如下:

builder: (BuildContext context, Widget widget) {
  Catcher2.addDefaultErrorWidget(
    showStacktrace: true,
    title: "Custom error title",
    description: "Custom error description",
    maxWidthForSmallMode: 150,
  );
  return widget;
},

获取当前配置

获取当前使用的配置:

Catcher2Options options = catcher2.getCurrentConfig();

更新配置

在运行时更新Catcher 2配置:

catcher2.updateConfig(
  debugConfig: Catcher2Options(
    PageReportMode(),
    [ConsoleHandler()],
  ),
);

截图功能

Catcher 2可以在报告中自动创建并包含截图。只需要用Catcher2Screenshot包装您的根组件,并提供截图存储路径即可。

MaterialApp(
  navigatorKey: Catcher2.navigatorKey,
  home: Catcher2Screenshot(
    catcher2: Catcher2.getInstance(),
    child: Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: ChildWidget(),
    ),
  ),
);

final Catcher2Options debugOptions = Catcher2Options(
  DialogReportMode(),
  [ToastHandler()],
  screenshotsPath: path,
);

以上就是关于Flutter异常捕获与日志管理插件catcher_2的基本使用说明。希望对您有所帮助!


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

1 回复

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


在Flutter中,catcher_2 是一个强大的异常捕获与日志管理插件,它能够帮助开发者有效地捕获应用中的异常、错误,并将这些异常信息发送到指定的服务端进行监控和分析。以下是如何在Flutter项目中使用 catcher_2 插件的代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  catcher_2: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

2. 配置 Catcher

在你的 Flutter 应用中配置 Catcher。通常,这可以在 main.dart 文件中完成。

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

void main() {
  // 初始化Catcher
  CatcherConfig config = CatcherConfig(
    enableLog: true,  // 是否启用日志捕获
    enableReport: true,  // 是否启用报告
    enableConsoleLog: true,  // 是否在控制台打印日志
    enableDialog: true,  // 是否显示错误对话框
    debugMode: true,  // 是否为调试模式
    logLevel: LogLevel.VERBOSE,  // 设置日志级别
    unhandledExceptionHandler: (context, error, stackTrace) {
      // 自定义未处理的异常处理
      print("Unhandled Exception: $error");
      print("Stack Trace: $stackTrace");
    },
    reportMode: ReportMode.DIALOG,  // 报告模式(对话框、通知等)
    reportSubmitCallback: (report) async {
      // 自定义报告提交回调
      // 例如,将报告发送到你的服务器
      print("Sending report: $report");
      // await sendReportToServer(report);
    },
    serverConfigs: [
      ServerConfig(
        url: "https://your-server-endpoint.com/report",  // 报告发送的URL
        method: RequestMethod.POST,  // 请求方法
        headers: {
          "Content-Type": "application/json",
          "Authorization": "Bearer YOUR_TOKEN",  // 示例:添加授权头
        },
        bodyTemplate: (report) => Map.fromEntries(
          report.toJson()!.entries.map(
            (entry) => MapEntry(entry.key, entry.value.toString()),
          ),
        ),  // 将报告转换为JSON格式发送到服务器
      ),
    ],
  );

  Catcher.initialize(config).then((_) {
    runApp(MyApp());
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Catcher Demo'),
        ),
        body: Center(
          child: Text('Throw an error to see Catcher in action!'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 示例:手动触发一个异常
            throw Exception("This is a test exception!");
          },
          tooltip: 'Throw Exception',
          child: Icon(Icons.error),
        ),
      ),
    );
  }
}

3. 捕获日志和异常

在应用中,你可以使用 Catcher.log 方法来捕获日志,Catcher.report 方法来捕获异常。不过,在大多数情况下,Catcher 会自动捕获未处理的异常和日志。

void someFunction() {
  try {
    // 可能会抛出异常的代码
    int result = 10 / 0;  // 示例:除以零会引发异常
  } catch (e, stack) {
    // 手动捕获并报告异常
    Catcher.report(e, stack);
  }

  // 捕获日志
  Catcher.log("This is a log message", LogLevel.INFO);
}

4. 运行和测试

运行你的 Flutter 应用,并触发一些异常(如点击上面的浮动按钮)。你应该能够看到 Catcher 捕获并处理的异常对话框,或者在控制台中看到捕获的日志。

以上代码示例展示了如何在 Flutter 项目中配置和使用 catcher_2 插件来捕获和管理异常及日志。根据实际需求,你可以进一步自定义和扩展这些配置。

回到顶部