使用Dartz 针对网络请求进行封装

错误处理是网络请求过程中最重要的方面之一,同时他也是项目过程中很重要的一个东西。了解dartz包的Either能以一种更清晰、更简洁的方式来管理成功和失败情况,让我们深入了解 dartz 里面Either。

Either

Either就像一个值的容器,该值可能是错误或任何其他值。一般情况下,Left 是错误,Right 分别是值。

Either的使用

一般情况下我们针对网络请求的处理如下:

dart 复制代码
// A function that uses traditional error handling  
Future<http.Response> getData() async {  
try {  
final response = await http.post(Uri.parse('yourapilink'), body: {});  
if (response.statusCode == 200) {  
return response; // 成功
} else {  
// 失败  
switch (response.statusCode) {  
case 400:  
throw '服务器无法处理您的请求';  
case 401:  
throw '没有授权。。';  
default:  
throw '出现了一些其他的问题......';  
}  
}  
} catch (e) {  
//捕获意外错误
throw '发生意外错误:: $e';  
}  
}

尽管它提供了熟悉的结构化控制流,但传统的异常处理可能会带来性能开销,破坏自然代码流,导致冗长,并提供有限的信息,从而影响了一定程度的可读性和效率。

现在让我们使用Either来处理上面的网络请求:

csharp 复制代码
import 'package:dartz/dartz.dart';
// 使用 Either 概念处理错误的函数  
Future<Either< String , http.Response>> getData() async {  
try {  
Final response = wait http.post( Uri .parse( 'yourapilink' ), body: {});  
if (response.statusCode == 200 ) {  
// 在这种情况下,请求成功  
// 我们返回包含响应的 Right  
return Right(response);  
}  
// 在这种情况下,请求不成功  
// 我们可以检查状态代码  
// 返回相应的消息  
switch (response.statusCode) {  
case 400 :  
return const Left( '服务器无法处理您的请求' ) ;  
case 401 :  
return const Left( '没有授权' );  
default:  
return const Left( '出现了一些其他的问题...' );  
}  
} catch (e) {  
return Left(e.toString());  
}  
}

Either可以有效地处理潜在的错误,并将该函数无缝集成到代码的各个部分中。这种方法可以提供更健壮和灵活的编程体验。

最后封装后的使用场景:

scss 复制代码
Future  requestData() async {  
// 首先我们执行 getData() 函数并等待结果。  
final value = await getData(); 
// 然后我们折叠结果以访问左值和右值  
// 如果它是左值(错误),我们将处理错误  
// 如果它是右值(实际数据),我们将相应地处理它。  
value.fold(  
(left) {  
// 向用户显示错误消息  
debugPrint(left);  
},  
(right) {  
// 请求成功时返回的值  
// 使用此数据更新 UI  
debugPrint(right) );  
},  
);  
}

通过采用这种方法,忽视错误处理的风险就会降低,从而使您的项目更加的清晰,以及易读,在dartz包中有很多简洁的功能和东西有待发现。

相关推荐
懒大王爱吃狼34 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
逐·風5 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫5 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦6 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子6 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山7 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
lqj_本人8 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
清灵xmf9 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨9 小时前
VUE+Vite之环境文件配置及使用环境变量
前端