Flutter错误报告插件n_bug_reporter的使用

Flutter错误报告插件n_bug_reporter的使用

获取开始

本项目是一个Flutter插件包的起点,这种插件包包含针对Android和/或iOS平台的特定实现代码。

对于如何开始使用Flutter,可以查看我们的在线文档,该文档提供了教程、示例、移动开发指南以及完整的API参考。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用n_bug_reporter插件来创建错误报告任务和获取屏幕截图。

import 'dart:typed_data';

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

import 'package:flutter/services.dart';
import 'package:n_bug_reporter/n_bug_reporter.dart';
import 'package:n_bug_reporter/model/clickup_custom_field_ids.dart';

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  String? _createdTaskId = '未知';
  static const String privateKey = ''; // 请在此处填写私钥
  Uint8List? _currentSS;

  // 这个键必须传递给nbugreporter
  // 并且scaffold应该包裹在repaint边界内
  // 关于repaint边界: https://www.woolha.com/tutorials/flutter-using-repaintboundary-examples
  final GlobalKey _key = GlobalKey();

  [@override](/user/override)
  void initState() {
    super.initState();
    NBugReporter.configure(
        privateKey: privateKey,
        listId: '', // 请在此处填写列表ID
        templateId: '', // 请在此处填写模板ID
        customFieldIds: ClickUpCustomFieldIds(
            appBundleId: '', // 请在此处填写应用包ID
            activity: '', // 请在此处填写活动
            deviceInfo: '', // 请在此处填写设备信息
            platform: ''), // 请在此处填写平台
        repaintBoundaryKey: _key);
    initPlatformState();
  }

  // 平台消息是异步的,所以我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    String platformVersion;
    String createdTaskId;
    // 平台消息可能会失败,所以我们使用try/catch来捕获PlatformException。
    // 我们还处理了消息可能返回null的情况。
    try {
      platformVersion = await NBugReporter.platformVersion ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果小部件在异步平台消息发送时从树中移除,我们希望丢弃回复而不是调用setState来更新不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final ButtonStyle style = ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20));

    return MaterialApp(
      home: RepaintBoundary(
        key: _key,
        child: Scaffold(
          appBar: AppBar(
            title: const Text('插件示例应用'),
          ),
          body: Stack(
            children: [
              Positioned(
                  child: NBugReporter.nBugReporterButton(
                    prereport: (){},
                    postreport: (){},
                  ),
                  left: 0,
                  bottom: 0),
              Center(
                child: Column(
                  children: [
                    Text('运行在: $_platformVersion\n'),
                    Text('创建的任务ID: $_createdTaskId\n'),
                    ElevatedButton(
                      style: style,
                      onPressed: () async {
                        var res = await NBugReporter.createTaskFromTemplate();
                        setState(() {
                          _createdTaskId = res?.id;
                        });
                      },
                      child: const Text('创建N BUG REPORTER任务'),
                    ),
                    ElevatedButton(
                      style: style,
                      onPressed: () async {
                        var ss = await NBugReporter.getScreenshot(repaintBoundaryKey: _key);
                        setState(() {
                          _currentSS = ss;
                        });
                      },
                      child: Column(
                        children: [
                          _currentSS != null
                              ? Image.memory(
                                  _currentSS!,
                                  height: 100,
                                  width: 100,
                                )
                              : const SizedBox.shrink(),
                          const Text('获取屏幕截图'),
                        ],
                      ),
                    )
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


n_bug_reporter 是一个 Flutter 插件,用于帮助开发者收集和报告应用程序中的错误信息。它可以帮助你在应用程序崩溃或出现错误时,自动收集日志、设备信息、用户反馈等,并将其发送到指定的服务器或邮件地址。

以下是如何使用 n_bug_reporter 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  n_bug_reporter: ^1.0.0  # 请确保使用最新版本

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

2. 初始化插件

在你的 Flutter 应用程序的 main.dart 文件中初始化 n_bug_reporter 插件:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 n_bug_reporter
  NBugReporter.init(
    email: 'your-email@example.com',  // 接收错误报告的邮箱
    subject: 'Bug Report from My App',  // 邮件主题
    body: 'Please describe the issue:',  // 邮件正文提示
  );

  runApp(MyApp());
}

3. 捕获异常

为了捕获未处理的异常,你可以使用 FlutterError.onErrorrunZonedGuarded

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:n_bug_reporter/n_bug_reporter.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 n_bug_reporter
  NBugReporter.init(
    email: 'your-email@example.com',
    subject: 'Bug Report from My App',
    body: 'Please describe the issue:',
  );

  // 捕获未处理的异常
  runZonedGuarded(() {
    FlutterError.onError = (FlutterErrorDetails details) {
      NBugReporter.reportError(details.exception, details.stack);
    };

    runApp(MyApp());
  }, (error, stackTrace) {
    NBugReporter.reportError(error, stackTrace);
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Bug Reporter Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Bug Reporter Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 模拟一个错误
              throw Exception('This is a test exception');
            },
            child: Text('Throw Exception'),
          ),
        ),
      ),
    );
  }
}

4. 手动报告错误

你也可以在代码中手动调用 NBugReporter.reportError 来报告错误:

try {
  // 一些可能抛出异常的代码
} catch (e, stackTrace) {
  NBugReporter.reportError(e, stackTrace);
}

5. 配置其他选项

n_bug_reporter 还提供了其他一些配置选项,例如设置附件的最大大小、自定义日志文件路径等。你可以根据需要进行配置。

NBugReporter.init(
  email: 'your-email@example.com',
  subject: 'Bug Report from My App',
  body: 'Please describe the issue:',
  maxAttachmentSize: 5 * 1024 * 1024,  // 5MB
  logFilePath: '/path/to/log/file.log',
);

6. 运行应用

现在,当你运行应用程序并触发异常时,n_bug_reporter 会自动捕获错误并提示用户发送错误报告。用户可以选择发送报告到指定的邮箱。

7. 处理用户反馈

你可以在 NBugReporter.init 中设置 onReportSent 回调,以便在用户发送报告后执行一些操作:

NBugReporter.init(
  email: 'your-email@example.com',
  subject: 'Bug Report from My App',
  body: 'Please describe the issue:',
  onReportSent: () {
    print('Bug report sent successfully');
  },
);

8. 自定义 UI

如果你需要自定义错误报告的 UI,你可以使用 NBugReporter.showReportDialog 方法手动触发报告对话框:

ElevatedButton(
  onPressed: () {
    NBugReporter.showReportDialog(
      context,
      exception: 'Custom Exception',
      stackTrace: StackTrace.current,
    );
  },
  child: Text('Report Custom Error'),
);
回到顶部