Flutter错误处理插件error_handeler_flutter的使用

Flutter错误处理插件error_handeler_flutter的使用

Android配置

在Android上,为了确保在发布模式下正确运行,必须在AndroidManifest.xml文件中添加INTERNETACCESS_NETWORK_STATE权限。以下是相关代码片段:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Permissions for internet_connection_checker -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application

您可以使用以下代码来检查网络连接状态,并根据需要显示一个自定义的Snackbar。

if (!await InternetConnectionChecker().hasConnection) {
  CustomSnackbar().showNoInternetSnackbar();
}

这段代码可以用来显示警告对话框或执行某些操作。

使用插件进行API调用

让我们设置项目以使用HTTP和DIO REST API调用。

void main() async {
  // 设置是否使用HTTP或DIO,默认情况下将使用HTTP
  ErrorHandlerFlutter().init(usehttp: false);

  // 配置DIO
  PackageDio.addInterceptors([]);
  PackageDio.setBaseOptions(
    // 可以在这里设置更多选项
    // 但这里我设置了基本URL以供API调用
    baseUrl: 'https://66c45adfb026f3cc6ceefd10.mockapi.io'
  );

  // 这将添加基础选项和拦截器到DIO客户端
  // 必须调用此方法来设置DIO
  PackageDio.setUpDio();

  // 配置HTTP
  // 您可以定义自己的HTTP客户端(可选)
  PackageHttp.setupClient(client: http.Client());
  // 必须传递主机(基本URL)以发出HTTP请求
  PackageHttp.setup(host: '66c45adfb026f3cc6ceefd10.mockapi.io', prefix: '');

  runApp(const MyApp());
}

初始化Snackbar应在MaterialApp配置之后调用。

[@override](/user/override)
Widget build(BuildContext context) {
  // 在使用ErrorHandelerFlutter类的API调用之前,必须调用init函数
  // 上下文是显示无互联网Snackbar所需的,否则当设备未连接到互联网时,Snackbar将不会出现
  CustomSnackbar().init(context);

  return Scaffold(
    appBar: AppBar(
      // 其他AppBar配置
    ),
    body: // 主体内容
  );
}

调用API并处理响应

使用ErrorHandelerFlutter.get(url)进行GET请求调用,并获取响应为Result类。使用switch语句遍历成功或失败情况。

下面是示例代码,展示了如何进行请求和处理响应:

Future<void> callApi() async {
  clear();
  final Result response = await ErrorHandlerFlutter.get(
    '/data/postdata',
  );
  // await ErrorHandlerFlutter.post('/data/postdata', body: '');
  switch (response) {
    case Success(value: dynamic data):
      result.value = ErrorHandlerFlutter.useHttp
          ? (await json.decode(data.body)).toString()
          : data.data.toString();
      debugPrint('result  :$data');
      break;
    case Failure(error: ErrorResponse resp):
      debugPrint('the error occured : ${resp.errorHandelerFlutterEnum.name}');

      // 持有错误信息
      defMesg.value = resp.errorResponseHolder.defaultMessage;
      customMesg.value = resp.errorResponseHolder.customMessage ?? '';

      // 给出错误类型
      // 如badrequest, InternalServerError等
      errorEnum.value = resp.errorHandelerFlutterEnum.name;

      // 如果错误被包捕获,例如statusCode > 300
      // 请求的响应体存储在这里
      responsebody.value = resp.errorResponseHolder.responseBody ?? '';

      // 通过枚举传递失败以根据失败自定义用途
      switch (resp.errorHandelerFlutterEnum) {
        case ErrorHandelerFlutterEnum.badRequestError:
          debugPrint(
              'the status is 400 , Bad request from client side :resbody:${resp.errorResponseHolder.responseBody}\n mesg :${resp.errorResponseHolder.defaultMessage} ');
          break;
        case ErrorHandelerFlutterEnum.notFoundError:
          debugPrint('404 , Api endpoint not found');
          break;
        default:
          debugPrint(
              'Not matched in main cases : ${resp.errorHandelerFlutterEnum.name} ${resp.errorResponseHolder.defaultMessage}');
      }
      break;
    default:
      debugPrint('Api Response not matched with any cases ');
  }
}

完整示例代码

以下是完整的示例代码,用于演示如何使用该插件进行API调用。

import 'package:error_handeler_flutter/dio_api.dart';
import 'package:error_handeler_flutter/error_handeler_flutter.dart';
import 'package:error_handeler_flutter/http_api.dart';
import 'package:example/controller.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;

void main() async {
  // 设置是否使用HTTP或DIO,默认情况下将使用HTTP
  ErrorHandlerFlutter().init(usehttp: false);

  // 配置DIO
  PackageDio.addInterceptors([]);
  PackageDio.setBaseOptions(
      baseUrl: 'https://66c45adfb026f3cc6ceefd10.mockapi.io');
  PackageDio.setUpDio();

  // 配置HTTP
  PackageHttp.setupClient(client: http.Client());
  PackageHttp.setup(host: '66c45adfb026f3cc6ceefd10.mockapi.io', prefix: '');

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Error Handeler Example'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isConnected = false;
  Map? _result;
  ErrorResponse? failure;

  // 输入您的URL以测试
  // String url = 'https://mocki.io/v1/cbde42ba-5b27-4530-8fc5-2d3aa669ccbd';
  String url = 'https://66c45adfb026f3cc6ceefd10.mockapi.io/data/posstdata';

  final cont = Get.put(ApiController());

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 在使用ErrorHandelerFlutter类的API调用之前,必须调用init函数
    // 上下文是显示无互联网Snackbar所需的,否则当设备未连接到互联网时,Snackbar将不会出现
    CustomSnackbar().init(context);

    return Scaffold(
      backgroundColor: Colors.green,
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Internet Connection: ${isConnected ? 'Connected' : 'Not Connected'}',
              ),
              if (cont.errorEnum.isNotEmpty)
                Obx(
                  () => Text(
                    cont.errorEnum.value,
                    style: Theme.of(context).textTheme.headlineMedium,
                  ),
                ),
              Obx(
                () => cont.defMesg.isNotEmpty
                    ? Text(
                        cont.defMesg.value,
                        style: Theme.of(context).textTheme.headlineMedium,
                      )
                    : SizedBox(),
              ),
              Obx(
                () => cont.customMesg.isNotEmpty
                    ? Text(
                        cont.customMesg.value,
                        style: Theme.of(context).textTheme.headlineMedium,
                      )
                    : SizedBox(),
              ),
              Obx(
                () => cont.responsebody.isNotEmpty
                    ? Text(
                        cont.responsebody.value,
                        style: Theme.of(context).textTheme.headlineMedium,
                      )
                    : SizedBox(),
              ),
              Obx(
                () => cont.result.isNotEmpty
                    ? Text(
                        cont.result.value,
                        style: Theme.of(context).textTheme.headlineMedium,
                      )
                    : SizedBox(),
              ),
              const SizedBox(
                height: 30,
              ),
              ElevatedButton(
                  onPressed: () async {
                    await cont.callApi();
                  },
                  child: const Text('Call Api'))
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final connected = await InternetConnectionChecker().hasConnection;
          setState(() {
            isConnected = connected;
          });
        },
        tooltip: 'Internet Connection',
        child: const Icon(Icons.wifi),
      ),
    );
  }
}

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

1 回复

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


error_handler_flutter 是一个用于处理 Flutter 应用中未捕获异常的插件。它可以帮助开发者捕获和处理应用中的错误,并提供了一种方式来显示错误信息、记录错误日志或采取其他自定义操作。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  error_handler_flutter: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装插件。

基本用法

1. 初始化 ErrorHandler

在你的 main.dart 文件中,初始化 ErrorHandler 并设置全局错误处理。

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

void main() {
  // 初始化 ErrorHandler
  ErrorHandlerFlutter.init(
    onError: (error, stackTrace) {
      // 处理错误,例如记录日志或显示错误信息
      debugPrint('Error: $error');
      debugPrint('Stack trace: $stackTrace');
    },
  );

  runApp(MyApp());
}

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

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

2. 处理异步错误

如果你想要捕获异步操作中的错误,可以使用 ErrorHandlerFlutter.runAsync 方法:

ElevatedButton(
  onPressed: () async {
    await ErrorHandlerFlutter.runAsync(
      () async {
        // 异步操作
        await Future.delayed(Duration(seconds: 1));
        throw Exception('This is an async error');
      },
      onError: (error, stackTrace) {
        debugPrint('Async Error: $error');
        debugPrint('Async Stack trace: $stackTrace');
      },
    );
  },
  child: Text('Throw Async Error'),
)

3. 自定义错误处理

你可以通过 ErrorHandlerFlutter.init 方法中的 onError 参数来自定义错误处理逻辑。例如,你可以将错误信息发送到服务器、记录到日志文件或显示一个友好的错误提示。

ErrorHandlerFlutter.init(
  onError: (error, stackTrace) {
    // 将错误信息发送到服务器
    sendErrorToServer(error, stackTrace);

    // 记录错误日志
    logError(error, stackTrace);

    // 显示友好的错误提示
    showErrorDialog(error);
  },
);
回到顶部