Flutter异常报告插件unhandled_error_reporter的使用

Flutter异常报告插件unhandled_error_reporter的使用

Pub

报告任何未处理的异常/错误/失败到后端服务作为[堆栈跟踪、设备信息、此错误的风险级别]

让我们来发现它

首先创建一个将错误发送到服务器的类

class RemoteReporter extends IRemoteReporter {
  [@override](/user/override)
  // 任何未捕获的错误都会在这个对象上
  Future<void> report(UnhandledError error) async {
    // 如果你想在控制台上打印[error],可以调用super
    super.report(error);
    // 在这里编写发送错误到后端的API调用
  }
}

其次,创建一个确定错误风险级别的类

class RiskLevelDeterminer implements IRiskLevelDeterminer {
  [@override](/user/override)
  RiskLevel determine(ErrorDto error) {
    if (error.errorObject is UnExpectedFailure) {
      return RiskLevel.high;
    }

    return RiskLevel.low;
  }
}

最后,主函数应该像这样编写

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 我们之前创建的对象
  final remoteReporter = RemoteReporter();
  final riskLevelDeterminer = RiskLevelDeterminer();
  final errorCapture = ErrorCapture(remoteReporter, riskLevelDeterminer);
  // 应该调用init
  await errorCapture.init();
  // 我们的Flutter处理器
  FlutterError.onError = errorCapture.handleFlutterError;
  // 我们的Dart错误处理器
  PlatformDispatcher.instance.onError = (error, stack) {
    errorCapture.handleAsyncDartError(error, stack);
    return true;
  };
  runApp(MyApp());
}

示例代码

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

class Failure {}

class UnExpectedFailure extends Failure {}

class RiskLevelDeterminer implements IRiskLevelDeterminer {
  [@override](/user/override)
  RiskLevel determine(ErrorDto error) {
    if (error.errorObject is UnExpectedFailure) {
      return RiskLevel.high;
    }
    return RiskLevel.low;
  }
}

class RemoteReporter extends IRemoteReporter {
  [@override](/user/override)
  Future<void> report(UnhandledError error) async {
    super.report(error);
    // 这里可以添加发送错误到后端的API调用
  }
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final errorCapture = ErrorCapture(RemoteReporter(), RiskLevelDeterminer());
  await errorCapture.init();
  FlutterError.onError = errorCapture.handleFlutterError;
  PlatformDispatcher.instance.onError = (error, stack) {
    errorCapture.handleAsyncDartError(error, stack);
    return true;
  };
}

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

  void throwError() {
    throw UnExpectedFailure();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      floatingActionButton: FloatingActionButton(onPressed: throwError),
    ));
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中集成和使用unhandled_error_reporter插件的示例代码。这个插件用于捕获未处理的异常并报告它们,从而帮助你更好地调试和监控你的应用。

1. 添加依赖

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

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

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

2. 初始化插件

在你的应用的入口文件(通常是main.dart)中初始化unhandled_error_reporter插件。这里假设你希望将错误信息发送到一个日志服务器(例如,使用HTTP POST请求)。

import 'package:flutter/material.dart';
import 'package:unhandled_error_reporter/unhandled_error_reporter.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() {
  // 配置UnhandledErrorReporter
  UnhandledErrorReporter.instance.onError = (error, stackTrace) async {
    // 格式化错误信息
    final errorJson = {
      'error': error.toString(),
      'stackTrace': stackTrace.toString(),
    };
    final errorBody = jsonEncode(errorJson);

    // 发送错误报告到日志服务器
    try {
      await http.post(
        Uri.parse('https://your-log-server.com/report-error'),
        headers: <String, String>{
          'Content-Type': 'application/json',
        },
        body: errorBody,
      );
      print('Error report sent successfully.');
    } catch (e) {
      print('Failed to send error report: $e');
    }
  };

  // 初始化Flutter应用
  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: () {
            // 模拟一个未处理的异常
            throw UnimplementedError('This is an unhandled error.');
          },
          child: Text('Throw Unhandled Error'),
        ),
      ),
    );
  }
}

3. 运行应用

运行你的Flutter应用,当你点击按钮触发未处理的异常时,unhandled_error_reporter会捕获这个异常,并尝试将错误信息发送到你在onError回调中指定的日志服务器。

注意事项

  • 确保你的日志服务器能够接收并处理POST请求,并且URL是正确的。
  • 根据你的需求,你可能需要调整错误信息的格式或发送方式。
  • 在生产环境中,考虑添加额外的错误处理逻辑,比如重试机制或错误缓存。

这个示例展示了如何集成unhandled_error_reporter插件来捕获和报告未处理的异常。根据你的具体需求,你可以进一步定制这个解决方案。

回到顶部