Flutter错误追踪插件rollbar_flutter的使用

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

Flutter错误追踪插件rollbar_flutter的使用

使用示例

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

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

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

在上述代码中,RollbarFlutter.run 方法用于初始化并运行应用。 Config 类提供了配置信息,包括访问令牌和包名。

示例代码

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/rollbar.dart' show Rollbar, RollbarFlutter;
import 'package:rollbar_flutter/rollbar.dart' as rollbar;

/// Example Flutter application using rollbar-flutter.
Future&lt;void&gt; 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 Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(title: 'Rollbar Flutter Example'),
    );
  }
}

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

  final String title;

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

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

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

  var _batteryLevel = 'Unknown battery level.';
  var _faultyMsg = 'No successful invocations yet.';
  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 = 'Battery at $level%.';
    } on PlatformException catch (e, stackTrace) {
      batteryLevel = 'Failed to get battery level.';
      Rollbar.drop(
        rollbarBreadCrumb.error(
            'Non-fatal PlatformException while getting battery level.'),
      );
      Rollbar.warn(e, stackTrace);
    }

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

  void faultyMethod() {
    Rollbar.drop(rollbarBreadCrumb.log('Tapped faultyMethod button'));
    Rollbar.warn('This method is about to fail');
    platform
        .faultyMethod()
        .then((message) =&gt; setState(() =&gt; _faultyMsg = message))
        .catchError((e) =&gt; log(e), test: (_) =&gt; false);
  }

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

    setState(() {
      if (++_counter % 2 == 0) {
        throw ArgumentError('Failed to increment counter');
      } else {
        Rollbar.drop(
          rollbarBreadCrumb.log('Counter incremented to $_counter'),
        );
      }
    });
  }

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

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

  void setUser() {
    if (_userIsLoggedIn) {
      Rollbar.setUser(null);
      _userIsLoggedIn = false;
      Rollbar.debug('User logged out');
    } else {
      Rollbar.setUser(const rollbar.User(
        id: '123456',
        username: 'TheUser',
        email: 'user@email.co',
      ));
      _userIsLoggedIn = true;
      Rollbar.debug('User logged in');
    }

    setState(() {
      _setUserText = _userIsLoggedIn ? 'Unset User' : 'Set User';
    });
  }

  void throwError() {
    Rollbar.drop(rollbarBreadCrumb.log('Tapped throwError button'));
    Rollbar.critical('About to throw an error!');
    throw StateError('A state error occurred');
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final bodyChildren = &lt;Widget&gt;[
      ElevatedButton(
        onPressed: batteryLevel,
        child: const Text('Get Battery Level'),
      ),
      Text(_batteryLevel),
      ElevatedButton(
        onPressed: faultyMethod,
        child: const Text('Call Faulty Method'),
      ),
      Text(_faultyMsg),
      if (Platform.isIOS)
        ElevatedButton(
          onPressed: crash,
          child: const Text('Crash application'),
        ),
      const Divider(),
      ElevatedButton(
        onPressed: setUser,
        child: Text(_setUserText),
      ),
      const Divider(),
      ElevatedButton(
        onPressed: asyncFailure,
        child: const Text('Async failure'),
      ),
      ElevatedButton(
        onPressed: throwError,
        child: const Text('Throw error'),
      ),
      const Divider(),
      const Text('Times you have pushed the plus button:'),
      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: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

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

1 回复

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


在Flutter项目中集成和使用rollbar_flutter插件进行错误追踪,可以帮助你更有效地监控应用程序中的错误和崩溃。以下是如何在Flutter项目中设置和使用rollbar_flutter的示例代码。

1. 添加依赖

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

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

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

2. 初始化Rollbar客户端

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Rollbar客户端。你需要提供你的Rollbar项目的访问令牌(access token)。

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

void main() {
  // 初始化Rollbar客户端
  final rollbar = RollbarFlutter(
    accessToken: 'YOUR_ROLLBAR_ACCESS_TOKEN', // 替换为你的Rollbar访问令牌
    environment: 'production', // 或者 'development' 根据你的环境
  );

  // 设置全局错误处理
  FlutterError.onError = (FlutterErrorDetails details) {
    rollbar.error(details.exception, stackTrace: details.stack);
    Zone.current.handleUncaughtError(details.exception, details.stack);
  };

  // 捕获未处理的异常
  runZonedGuarded(() {
    runApp(MyApp());
  }, (error, stackTrace) {
    rollbar.error(error, stackTrace: stackTrace);
  });
}

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 Rollbar Demo'),
      ),
      body: Center(
        child: Text('Check Rollbar for errors!'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 模拟一个错误
          throw Exception('This is a test error!');
        },
        tooltip: 'Throw Error',
        child: Icon(Icons.error),
      ),
    );
  }
}

3. 发送自定义错误报告

你可以在任何需要的地方使用rollbar实例来发送自定义错误报告。例如:

void someFunctionThatMightFail() {
  try {
    // 可能会失败的代码
    throw StateError('This is a custom state error!');
  } catch (error, stackTrace) {
    rollbar.error(error, stackTrace: stackTrace, custom: {
      'functionName': 'someFunctionThatMightFail',
      'additionalInfo': 'This is some additional context for the error.',
    });
  }
}

4. 配置Rollbar(可选)

rollbar_flutter插件提供了多种配置选项,你可以根据需要调整。例如,设置日志级别、启用或禁用特定的日志类型等。

final rollbar = RollbarFlutter(
  accessToken: 'YOUR_ROLLBAR_ACCESS_TOKEN',
  environment: 'production',
  endpoint: 'https://your-custom-rollbar-endpoint.com/api/1/item/', // 如果使用自定义端点
  level: RollbarLevel.debug, // 设置日志级别
  // 其他配置...
);

通过以上步骤,你可以在Flutter项目中集成并使用rollbar_flutter插件进行错误追踪。确保你已经正确设置了Rollbar项目,并且替换示例代码中的访问令牌为你的实际访问令牌。

回到顶部