Flutter异常处理插件api_exception的使用

Flutter异常处理插件api_exception的使用

特性

  • 处理400 - 500状态码的正常消息错误。
  • 可以自定义错误信息。

平台支持

Android iOS MacOS Web Linux Windows
✔️ ✔️ ✔️ ✔️ ✔️ ✔️

入门指南

要使用此插件,在pubspec.yaml文件中添加api_exception作为依赖项。

dependencies:
  api_exception: ^x.x.x

使用方法

导入库

在需要使用的Dart文件中导入库:

import 'package:api_exception/api_exception.dart';
处理异常

在服务层中添加以下代码来处理异常。不要忘记添加catch(捕获AppException)以便将错误重新抛出到逻辑层等。

ExceptionHandling.handelAPIError(
  desireStatusCode: 200, // 期望的状态码
  response: response, // 响应数据
);
示例

在业务逻辑层中处理API请求并捕获异常:

[@override](/user/override)
Future<List<VideoTypesData>> getData() async {
  try {
    final url = _appEndpoint.getData();
    final response = await _httpClient.get(url, {});
    ExceptionHandling.handelAPIError(
      desireStatusCode: 200,
      response: response,
    );
    return VideoTypes.fromJson(response.body).data;
  } on AppException {
    rethrow;
  }
}
处理错误信息

在视图层中可以这样处理错误信息:

Text(exception?.errorMessage(context) ?? '未知错误')
示例

在状态管理中显示错误信息:

if (state.status.isFailure) {
  ScaffoldMessenger.of(context)
    ..hideCurrentSnackBar
    ..showSnackBar(
      SnackBar(
        backgroundColor: Colors.red,
        content: Text(
          state.exception?.errorMessage(context) ?? '未知错误',
          style: const TextStyle(
            color: Colors.white,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
    );
}
自定义错误信息

可以通过传递参数来自定义错误信息:

// 示例错误码状态 = 404
Text(exception?.errorMessage(context, notFoundMessage: "抱歉,我们找不到您的数据") ?? '未知错误')

对于未知错误,包会从JSON响应体中获取错误信息(“message” || “error”),或者你可以修改错误信息。

错误类型列表

case ErrorType.badRequest:
  return "Bad Request";

case ErrorType.unauthorized:
  return "Unauthorized";

case ErrorType.paymentRequired:
  return "Payment Required";

case ErrorType.loginFailed:
  return "登录失败";

case ErrorType.unauthenticated:
  return "未认证";

case ErrorType.unknown:
  return "未知错误";

case ErrorType.forbidden:
  return "禁止";

case ErrorType.notFound:
  return "未找到";

case ErrorType.methodNotAllowed:
  return "方法不允许";

case ErrorType.notAcceptable:
  return "不可接受";

case ErrorType.internalServerError:
  return "内部服务器错误";

case ErrorType.notImplemented:
  return "未实现";

case ErrorType.badGateway:
  return "坏网关";

完整示例代码

以下是完整的示例代码:

import 'package:api_exception_example/cubit/home_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:api_exception/exception.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => HomeCubit()..onInitData(),
      child: BlocConsumer<HomeCubit, HomeState>(
        listener: (context, state) {
          if (state.status.isFailure) {
            ScaffoldMessenger.of(context)
              ..hideCurrentSnackBar
              ..showSnackBar(
                SnackBar(
                  backgroundColor: Colors.red,
                  content: Text(
                    state.exception?.errorMessage(context) ?? "未知错误",
                    style: const TextStyle(
                      color: Colors.white,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              );
          }
        },
        builder: (context, state) {
          return Scaffold(
            appBar: AppBar(
              title: const Text("示例获取数据"),
            ),
            body: state.status.isLoading || state.status.isFailure
                ? const Center(
                    child: CircularProgressIndicator(),
                  )
                : const Text("成功获取数据"),
          );
        },
      ),
    );
  }
}

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

1 回复

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


api_exception 是一个用于处理 API 异常的 Flutter 插件,它可以帮助开发者更轻松地捕获和处理网络请求中的异常。这个插件通常用于处理 HTTP 请求中的各种错误,例如网络错误、服务器错误、认证错误等。

以下是如何使用 api_exception 插件的基本步骤:

1. 添加依赖

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

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

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

2. 导入插件

在你的 Dart 文件中导入 api_exception 插件:

import 'package:api_exception/api_exception.dart';

3. 使用 ApiException 处理异常

当你发起网络请求时,可以使用 ApiException 来捕获和处理异常。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('API Exception Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: fetchData,
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }

  Future<void> fetchData() async {
    try {
      final response = await http.get(Uri.parse('https://example.com/api/data'));

      if (response.statusCode == 200) {
        // 成功处理响应数据
        print('Data fetched successfully');
      } else {
        // 抛出 ApiException
        throw ApiException(
          message: 'Failed to fetch data',
          statusCode: response.statusCode,
        );
      }
    } on ApiException catch (e) {
      // 处理 ApiException
      print('API Exception: ${e.message}, Status Code: ${e.statusCode}');
    } catch (e) {
      // 处理其他异常
      print('Unexpected error: $e');
    }
  }
}

4. 自定义异常处理

你还可以根据需要对 ApiException 进行扩展,以处理更多特定的异常情况。例如,你可以创建自定义的异常类来区分不同类型的错误:

class NetworkException extends ApiException {
  NetworkException({String message = 'Network error', int statusCode = 500})
      : super(message: message, statusCode: statusCode);
}

class AuthenticationException extends ApiException {
  AuthenticationException({String message = 'Authentication failed', int statusCode = 401})
      : super(message: message, statusCode: statusCode);
}

然后在你的代码中使用这些自定义异常:

try {
  final response = await http.get(Uri.parse('https://example.com/api/data'));

  if (response.statusCode == 200) {
    print('Data fetched successfully');
  } else if (response.statusCode == 401) {
    throw AuthenticationException();
  } else {
    throw NetworkException();
  }
} on AuthenticationException catch (e) {
  print('Authentication failed: ${e.message}');
} on NetworkException catch (e) {
  print('Network error: ${e.message}');
} catch (e) {
  print('Unexpected error: $e');
}
回到顶部