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
更多关于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');
}