Flutter错误追踪插件rollbar_flutter_bump的使用

Flutter错误追踪插件rollbar_flutter_bump的使用

rollbar-flutter 是一个用于将异常、错误和日志消息报告到 Rollbar 的 Flutter 通知器。

使用

一个简单的使用示例:

import 'package:flutter/services.dart';
import 'package:rollbar_flutter_bump/rollbar.dart';

Future<void> main() async {
  const config = Config(
    accessToken: 'YOUR-ROLLBAR-ACCESSTOKEN',
    package: 'rollbar_flutter_example',
  );

  await RollbarFlutter.run(config, () => runApp(const MyApp()));
}

通过这样的设置,rollbar-flutter 将会自动捕获并报告应用程序中的任何未处理的错误。

你也可以显式地向 Rollbar 报告错误或消息:

await Rollbar.info('Nothing out of the ordinary so far...');

完整的示例可以在 example 目录中查看。

兼容性

  • Flutter 3: 版本 3.0.0 及以上

记录版本特定的问题,即使不在支持的版本之外,也欢迎记录,我们会尽可能修复这些问题。

平台支持

  • Android: 是
  • iOS: 是
  • Web: 否
  • Windows: 否
  • macOS: 否
  • Linux: 否

根据用户的反馈,其他平台将被优先考虑。

文档

有关完整的使用说明和配置参考,请参阅我们的 rollbar-flutter SDK 文档

发布历史与更新日志

查看我们的 发布页面 以获取所有发布的列表和更改记录。

帮助和支持

如果你遇到任何问题,请发送邮件至 support@rollbar.com

对于错误报告,请在 GitHub 上打开一个新问题。

许可证

rollbar-flutter 是根据 MIT 许可证发布的免费软件。详情请参阅 LICENSE 文件。


完整示例 Demo

以下是一个完整的示例,展示了如何使用 rollbar_flutter_bump 插件来捕获和报告错误。

import 'dart:io' show Platform;
import 'dart:async';
import 'dart:developer';

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

import 'package:rollbar_flutter_bump/rollbar.dart' show Rollbar, RollbarFlutter;
import 'package:rollbar_flutter_bump/rollbar.dart' as rollbar;

/// 示例 Flutter 应用程序使用 rollbar-flutter。
Future<void> main() async {
  const config = rollbar.Config(
      accessToken: 'YOUR-ROLLBAR-ACCESSTOKEN',
      package: 'rollbar_flutter_example');

  await RollbarFlutter.run(config, () {
    Rollbar.drop(rollbar.Breadcrumb.navigation(
      from: 'initialize',
      to: 'runApp',
    ));
    Rollbar.info('Rollbar initialized');
    runApp(const MyApp());
  });
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Rollbar Flutter 示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(title: 'Rollbar Flutter 示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  static const platform = MethodChannel('com.rollbar.flutter.example/activity');

  var _userIsLoggedIn = false;
  var _setUserText = 'Set User';

  var _batteryLevel = '未知电池水平。';
  var _faultyMsg = '尚未成功调用。';
  var _counter = 0;

  MyHomePageState();

  void batteryLevel() async {
    Rollbar.drop(
      rollbar.Breadcrumb.widget(
        element: 'batteryLevel',
        extra: const {'action': 'tapped'},
      ),
    );

    String batteryLevel;
    try {
      final int level = await platform.batteryLevel;
      batteryLevel = '电池水平为 $level%。';
    } on PlatformException catch (e, stackTrace) {
      batteryLevel = '未能获取电池水平。';
      Rollbar.drop(
        rollbar.Breadcrumb.error(
            '获取电池水平时发生非致命的 PlatformException。'),
      );
      Rollbar.warn(e, stackTrace);
    }

    setState(() {
      _batteryLevel = batteryLevel;
    });
  }

  void faultyMethod() {
    Rollbar.drop(rollbar.Breadcrumb.log('点击了 faultyMethod 按钮'));
    Rollbar.warn('此方法即将失败');
    platform
        .faultyMethod()
        .then((message) => setState(() => _faultyMsg = message))
        .catchError((e) => log(e), test: (_) => false);
  }

  void incrementCounter() {
    Rollbar.drop(rollbar.Breadcrumb.widget(
      element: 'incrementCounter',
      extra: const {'action': 'tapped'},
    ));

    setState(() {
      if (++_counter % 2 == 0) {
        throw ArgumentError('未能增加计数器');
      } else {
        Rollbar.drop(
          rollbar.Breadcrumb.log('计数器增加到 $_counter'),
        );
      }
    });
  }

  void asyncFailure() {
    _asyncFailure(1).then((n) => log('$n ~/ 0 = ???'));
  }

  Future<int> _asyncFailure(int num) async {
    return Future<int>.delayed(Duration(seconds: num), () => num ~/ 0);
  }

  void setUser() {
    if (_userIsLoggedIn) {
      Rollbar.setUser(null);
      _userIsLoggedIn = false;
      Rollbar.debug('用户已注销');
    } else {
      Rollbar.setUser(const rollbar.User(
        id: '123456',
        username: 'TheUser',
        email: 'user@email.co',
      ));
      _userIsLoggedIn = true;
      Rollbar.debug('用户已登录');
    }

    setState(() {
      _setUserText = _userIsLoggedIn ? '取消用户' : '设置用户';
    });
  }

  void throwError() {
    Rollbar.drop(rollbar.Breadcrumb.log('点击了 throwError 按钮'));
    Rollbar.critical('即将抛出错误!');
    throw StateError('状态错误发生');
  }

  void crash() {
    Rollbar.drop(rollbar.Breadcrumb.navigation(from: 'app', to: 'crash'));
    platform.crash();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final bodyChildren = <Widget>[
      ElevatedButton(
        onPressed: batteryLevel,
        child: const Text('获取电池水平'),
      ),
      Text(_batteryLevel),
      ElevatedButton(
        onPressed: faultyMethod,
        child: const Text('调用故障方法'),
      ),
      Text(_faultyMsg),
      if (Platform.isIOS)
        ElevatedButton(
          onPressed: crash,
          child: const Text('崩溃应用程序'),
        ),
      const Divider(),
      ElevatedButton(
        onPressed: setUser,
        child: Text(_setUserText),
      ),
      const Divider(),
      ElevatedButton(
        onPressed: asyncFailure,
        child: const Text('异步失败'),
      ),
      ElevatedButton(
        onPressed: throwError,
        child: const Text('抛出错误'),
      ),
      const Divider(),
      const Text('你已经按下了加号按钮的次数:'),
      Text(
        '$_counter',
        style: Theme.of(context).textTheme.headlineMedium,
      ),
      const Divider(height: 10),
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: bodyChildren,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ),
    );
  }
}

extension _Methods on MethodChannel {
  Future<int> get batteryLevel async => await invokeMethod('getBatteryLevel');
  Future<String> faultyMethod() async => await invokeMethod('faultyMethod');
  Future<Never> crash() async => await invokeMethod('crash');
}

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

1 回复

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


rollbar_flutter_bump 是一个用于在 Flutter 应用中集成 Rollbar 错误追踪的插件。Rollbar 是一个实时错误追踪和日志管理工具,可以帮助开发者快速发现并修复应用中的问题。

以下是如何在 Flutter 项目中使用 rollbar_flutter_bump 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  rollbar_flutter_bump: ^1.0.0  # 请使用最新版本

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

2. 初始化 Rollbar

在你的 Flutter 应用的 main.dart 文件中,初始化 Rollbar。你需要在 main 函数中调用 RollbarFlutterBump.init 方法,并传入你的 Rollbar 访问令牌。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 Rollbar
  await RollbarFlutterBump.init(
    accessToken: 'YOUR_ROLLBAR_ACCESS_TOKEN',  // 替换为你的 Rollbar 访问令牌
    environment: 'production',  // 设置环境,例如 'development', 'staging', 'production'
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Rollbar Example',
      home: MyHomePage(),
    );
  }
}

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

3. 捕获并发送错误

rollbar_flutter_bump 会自动捕获未处理的异常,并将它们发送到 Rollbar。你也可以手动捕获并发送错误信息,例如:

try {
  // 一些可能会抛出异常的代码
} catch (e, stackTrace) {
  // 手动发送错误到 Rollbar
  RollbarFlutterBump.captureException(e, stackTrace: stackTrace);
}

4. 发送自定义消息

除了捕获异常,你还可以发送自定义消息到 Rollbar:

RollbarFlutterBump.captureMessage('This is a custom message', level: Level.info);

5. 配置 Rollbar

你可以在初始化时配置 Rollbar 的各种参数,例如:

await RollbarFlutterBump.init(
  accessToken: 'YOUR_ROLLBAR_ACCESS_TOKEN',
  environment: 'production',
  codeVersion: '1.0.0',  // 代码版本
  person: Person(id: '123', username: 'john_doe'),  // 用户信息
  // 其他配置项
);
回到顶部