Flutter错误处理插件error_handeler_flutter的使用
Flutter错误处理插件error_handeler_flutter的使用
Android配置
在Android上,为了确保在发布模式下正确运行,必须在AndroidManifest.xml
文件中添加INTERNET
和ACCESS_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
更多关于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);
},
);