Flutter错误报告插件reporter的使用

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

Flutter错误报告插件reporter的使用

报告器(Reporter)

Pub Version GitHub last commit on main

一个用于生成纯 Dart 报告的标准。

注意:目前仅支持表格报告。

示例

检查专门的 示例项目

特性

  • 构建表格报告。
  • 处理列嵌套(colspan)。
  • 处理行嵌套(rowspan)。
  • 完全可定制。
  • 不带任何偏见。
  • 格式独立,可以适应 Excel、Html、Pdf、Markdown、txt 等格式。
  • 使用起来出乎意料地简单。

开始使用

  1. 依赖 reporter 包:

    dart pub add reporter
    
  2. 使用 TabularReporter.calculateHeaderCells 计算表头单元格:

    import 'package:reporter/reporter.dart';
    
    // 假设我们有以下列定义
    List<ColumnDefinition> columns = [
      ColumnDefinition('Client', 1),
      ColumnDefinition('payments', 4),
    ];
    
    // 计算表头单元格
    List<Cell> headerCells = TabularReporter.calculateHeaderCells(columns);
    
  3. 使用 TabularReporter.calculateCells 计算表格主体单元格:

    // 假设我们有以下行数据
    List<List<dynamic>> rows = [
      ['person1', 'project1', 5000.0, '2023-08-01 00:00:00.000', 2000.0],
      ['person1', 'project1', 5000.0, '2023-08-15 00:00:00.000', 1500.0],
      ['person1', 'project1', 5000.0, '2023-08-30 00:00:00.000', 1500.0],
      ['person1', 'project2', 1000.0, null, null],
      ['person1', 'project3', 4000.0, '2023-09-01 00:00:00.000', 1000.0],
      ['person1', 'project3', 4000.0, '2023-09-15 00:00:00.000', 2000.0],
      ['person2', 'project4', 0.0, null, null],
    ];
    
    // 计算表格主体单元格
    List<List<Cell>> bodyCells = TabularReporter.calculateCells(rows, columns);
    
  4. 可选地依赖其他特定生成器:

预览

import 'package:reporter/reporter.dart';
import 'package:reporter_html/reporter_html.dart';

void main() {
  // 假设我们有以下列定义
  List<ColumnDefinition> columns = [
    ColumnDefinition('Client', 1),
    ColumnDefinition('payments', 4),
  ];

  // 计算表头单元格
  List<Cell> headerCells = TabularReporter.calculateHeaderCells(columns);

  // 假设我们有以下行数据
  List<List<dynamic>> rows = [
    ['person1', 'project1', 5000.0, '2023-08-01 00:00:00.000', 2000.0],
    ['person1', 'project1', 5000.0, '2023-08-15 00:00:00.000', 1500.0],
    ['person1', 'project1', 5000.0, '2023-08-30 00:00:00.000', 1500.0],
    ['person1', 'project2', 1000.0, null, null],
    ['person1', 'project3', 4000.0, '2023-09-01 00:00:00.000', 1000.0],
    ['person1', 'project3', 4000.0, '2023-09-15 00:00:00.000', 2000.0],
    ['person2', 'project4', 0.0, null, null],
  ];

  // 计算表格主体单元格
  List<List<Cell>> bodyCells = TabularReporter.calculateCells(rows, columns);

  // 生成 HTML 表格
  String htmlTable = TabularReporter.generateHtmlTable(headerCells, bodyCells);
  
  print(htmlTable);
}

生成的 HTML 表格如下:

<table>
  <thead>
    <tr>
      <th rowspan="3" colspan="1">Client</th>
      <th rowspan="1" colspan="4">payments</th>
    </tr>
    <tr>
      <th rowspan="2" colspan="1">reason</th>
      <th rowspan="2" colspan="1">total to pay</th>
      <th rowspan="1" colspan="2">instances</th>
    </tr>
    <tr>
      <th rowspan="1" colspan="1">date</th>
      <th rowspan="1" colspan="1">amount</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="6" colspan="1">person1</td>
      <td rowspan="3" colspan="1">project1</td>
      <td rowspan="3" colspan="1">5000.0</td>
      <td rowspan="1" colspan="1">2023-08-01 00:00:00.000</td>
      <td rowspan="1" colspan="1">2000.0</td>
    </tr>
    <tr>
      <td rowspan="1" colspan="1">2023-08-15 00:00:00.000</td>
      <td rowspan="1" colspan="1">1500.0</td>
    </tr>
    <tr>
      <td rowspan="1" colspan="1">2023-08-30 00:00:00.000</td>
      <td rowspan="1" colspan="1">1500.0</td>
    </tr>
    <tr>
      <td rowspan="1" colspan="1">project2</td>
      <td rowspan="1" colspan="1">1000.0</td>
    </tr>
    <tr>
      <td rowspan="2" colspan="1">project3</td>
      <td rowspan="2" colspan="1">4000.0</td>
      <td rowspan="1" colspan="1">2023-09-01 00:00:00.000</td>
      <td rowspan="1" colspan="1">1000.0</td>
    </tr>
    <tr>
      <td rowspan="1" colspan="1">2023-09-15 00:00:00.000</td>
      <td rowspan="1" colspan="1">2000.0</td>
    </tr>
    <tr>
      <td rowspan="1" colspan="1">person2</td>
      <td rowspan="1" colspan="1">project4</td>
      <td rowspan="1" colspan="1">0.0</td>
    </tr>
  </tbody>
</table>

更多关于Flutter错误报告插件reporter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误报告插件reporter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用错误报告插件reporter的一个基本示例。这里我们假设你已经在你的Flutter项目中添加了reporter依赖。如果你还没有添加,请先在pubspec.yaml文件中添加如下依赖:

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

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

1. 初始化Reporter

首先,你需要在你的应用的入口文件(通常是main.dart)中初始化Reporter。这里我们假设你想将错误报告发送到某个远程服务器。

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

void main() {
  // 配置Reporter
  configureReporter(
    onSendReport: (Report report) async {
      // 这里你可以实现将报告发送到你的服务器的逻辑
      // 例如,通过HTTP POST请求发送报告
      print("Sending report: ${report.toJson()}");
      // 示例:使用dio库发送POST请求(你需要先添加dio依赖)
      // var response = await Dio().post('https://your-server.com/report', data: report.toJson());
    },
    onError: (Object error, StackTrace stackTrace) {
      // 处理发送报告时的错误
      print("Error sending report: $error\nStack trace: $stackTrace");
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 触发一个错误以测试Reporter
            throw UnimplementedError('This is a test error');
          },
          child: Text('Throw Error'),
        ),
      ),
    );
  }
}

2. 捕获并报告错误

在上面的代码中,我们已经在main函数中配置了Reporter,并且添加了一个按钮来触发一个错误。当这个错误被抛出时,Reporter会自动捕获它,并尝试通过onSendReport回调发送报告。

3. 自定义Report内容

你可以通过扩展Report类来自定义报告的内容。例如,你可能想添加用户信息、设备信息等。

class CustomReport extends Report {
  String userInfo;

  CustomReport({
    required String error,
    required StackTrace stackTrace,
    this.userInfo = '',
  }) : super(error: error, stackTrace: stackTrace);

  @override
  Map<String, dynamic> toJson() {
    Map<String, dynamic> json = super.toJson();
    json['userInfo'] = userInfo;
    return json;
  }
}

// 使用自定义报告
configureReporter<CustomReport>(
  onSendReport: (CustomReport report) async {
    print("Sending custom report: ${report.toJson()}");
    // 发送报告到你的服务器
  },
  onError: (Object error, StackTrace stackTrace) {
    print("Error sending custom report: $error\nStack trace: $stackTrace");
  },
  reportFactory: (error, stackTrace) => CustomReport(
    error: error.toString(),
    stackTrace: stackTrace,
    userInfo: 'User ID: 12345',  // 示例用户信息
  ),
);

在这个例子中,我们定义了一个CustomReport类,它继承自Report并添加了一个userInfo字段。然后,我们在配置Reporter时使用reportFactory参数指定如何创建这个自定义报告实例。

注意事项

  • 确保你的服务器能够接收并处理这些错误报告。
  • 根据你的需求调整错误报告的内容和格式。
  • 考虑在发送敏感信息前进行脱敏处理。

这样,你就可以在Flutter应用中使用Reporter插件来捕获和报告错误了。

回到顶部