Flutter错误处理插件error_handler_2的使用

Flutter错误处理插件error_handler_2的使用

Description

Flutter error handler 2 是一个简单的插件,用于在代码库区域轻松处理错误。它可以通过将错误发送到 Telegram 来帮助开发者了解应用中发生了什么问题。

Vision

快速且简单地在生产环境中了解错误,无需复杂的配置。

Getting started

初始化设置

首先,您需要初始化 error_handler_2 插件,以激活可选功能,例如将错误发送到 Telegram。在调试模式下,默认会记录错误。

设置 Telegram 参数

Future<void> setTelegram(String tokenTelegramPrivate, String chatIdTelegram, bool isSendToTelegram) async {
    ErrorHandlerVar.tokenTelegramPrivate = tokenTelegramPrivate; // 设置 Telegram Bot 的私钥
    ErrorHandlerVar.chatIdTelegram = chatIdTelegram;           // 设置 Telegram 聊天 ID
    ErrorHandlerVar.isSendToTelegram = isSendToTelegram;        // 是否启用发送错误到 Telegram
}

设置设备数据

为了更好地分析错误,您可以设置设备信息。

Future<void> setDeviceData(String device, String appVersion) async {
    ErrorHandlerVar.device = device;       // 设置设备类型(如 Android/iOS)
    ErrorHandlerVar.appVersion = appVersion; // 设置应用版本号
}

使用独立函数发送错误到 Telegram

发送文本消息

Future<void> sendTelegram({
    /// 函数用于向 Telegram 发送聊天消息
    url,
    statusCode,
    statusMessage,
    statusNote,
    String? paramBody,
    String? device,
    String? appVersion,
    String? env,
    required String tokenPrivate,
    required String chatId,
}) async {
    try {
        // 发送 POST 请求到 Telegram API
        Dio().post(
            "https://api.telegram.org/$tokenPrivate/sendMessage?chat_id=$chatId"
            "&text=url: <b>$url</b>;\nerror_code: <b>$statusCode</b>;\nerror_message: <b>$statusMessage</b>;\nerror_note: <b>$statusNote</b>;\ndevice: <b>$device</b>;\nappVersion: <b>$appVersion</b>;\nenv: <b>$env</b>;\nparamBody: <b>$paramBody</b>;&parse_mode=html",
        );
    } catch (er) {
        log(er.toString()); // 捕获异常并记录日志
    }
}

发送文档

如果需要发送文件或日志文件到 Telegram:

Future<void> sendDocument({
    /// 函数用于向 Telegram 发送文档
    url,
    required String path,
    required String tokenPrivate,
    required String chatId,
}) async {
    try {
        // 构造表单数据
        FormData formData = FormData.fromMap({
            "chat_id": ErrorHandlerVar.chatIdTelegram,
            "document": await MultipartFile.fromFile(path, filename: path),
        });

        // 发送 POST 请求到 Telegram API
        await Dio()
            .post(
                "https://api.telegram.org/${ErrorHandlerVar.tokenTelegramPrivate}/sendDocument",
                data: formData,
            )
            .then((value) {
            log(value.toString()); // 打印响应日志
        });
    } catch (er) {
        log(er.toString()); // 捕获异常并记录日志
    }
}

To Do / Roadmap

Version 1.0.0

  • ❌ 使用 http 替代 dio 发送消息到 Telegram

Information

该插件的源码可以在 GitHub 上找到。


完整示例代码

以下是一个完整的示例,展示如何使用 error_handler_2 插件:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:mime/mime.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  bool _isErrorSent = false;

  @override
  void initState() {
    super.initState();
    initializeErrorHandler();
  }

  void initializeErrorHandler() async {
    // 初始化 Telegram 参数
    await setTelegram("YOUR_TELEGRAM_BOT_TOKEN", "YOUR_TELEGRAM_CHAT_ID", true);
    await setDeviceData("Android", "1.0.0");
  }

  Future<void> sendErrorToTelegram() async {
    try {
      // 模拟错误信息
      final url = "https://example.com";
      final statusCode = 500;
      final statusMessage = "Internal Server Error";
      final statusNote = "Something went wrong";

      // 发送错误信息到 Telegram
      await sendTelegram(
        url: url,
        statusCode: statusCode,
        statusMessage: statusMessage,
        statusNote: statusNote,
        device: "Android",
        appVersion: "1.0.0",
      );

      setState(() {
        _isErrorSent = true;
      });
    } catch (e) {
      print("Error sending error to Telegram: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Error Handler Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: sendErrorToTelegram,
              child: Text("Simulate Error"),
            ),
            SizedBox(height: 20),
            if (_isErrorSent)
              Text("Error sent successfully!"),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 替换 YOUR_TELEGRAM_BOT_TOKENYOUR_TELEGRAM_CHAT_ID 为您的实际 Telegram Bot Token 和 Chat ID。
  2. 确保已添加 diomime 依赖到您的 pubspec.yaml 文件中:
    dependencies:
      dio: ^4.0.0
      mime: ^1.0.0
    

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

1 回复

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


error_handler_2 是一个用于 Flutter 的错误处理插件,它可以帮助你更好地管理和处理应用程序中的错误。通过使用这个插件,你可以捕获未处理的异常、错误,并进行相应的处理,比如记录日志、显示错误信息等。

安装 error_handler_2

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

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

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

基本使用

  1. 初始化 ErrorHandler

    在你的 main.dart 文件中,初始化 ErrorHandler,并将其包裹在你的应用程序的根组件中。

    import 'package:flutter/material.dart';
    import 'package:error_handler_2/error_handler_2.dart';
    
    void main() {
      ErrorHandler.init(
        onError: (error, stackTrace) {
          // 处理错误,比如记录日志或显示错误信息
          print('Caught error: $error');
          print('Stack 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('Error Handler Example'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                // 模拟一个错误
                throw Exception('This is a test error');
              },
              child: Text('Throw Error'),
            ),
          ),
        );
      }
    }
    
  2. 捕获和处理错误

    在上面的代码中,ErrorHandler.init 方法用于初始化错误处理器。onError 回调函数会在应用程序中发生未处理的错误时被调用。你可以在这个回调函数中处理错误,比如记录日志、显示错误信息等。

  3. 自定义错误处理

    你可以根据需要自定义错误处理逻辑。例如,你可以根据错误的类型来决定如何处理错误:

    ErrorHandler.init(
      onError: (error, stackTrace) {
        if (error is NetworkException) {
          // 处理网络错误
          print('Network error: $error');
        } else if (error is DatabaseException) {
          // 处理数据库错误
          print('Database error: $error');
        } else {
          // 处理其他错误
          print('Unknown error: $error');
        }
      },
    );
    
  4. 显示错误信息给用户

    你可以在 onError 回调中使用 ScaffoldMessengerSnackBar 来向用户显示错误信息:

    ErrorHandler.init(
      onError: (error, stackTrace) {
        // 显示错误信息给用户
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('An error occurred: $error'),
          ),
        );
      },
    );
回到顶部