使用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包中有很多简洁的功能和东西有待发现。

相关推荐
万少2 小时前
HarmonyOS官方模板集成创新活动-流蓝卡片
前端·harmonyos
-To be number.wan5 小时前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
噢,我明白了5 小时前
JavaScript 中处理时间格式的核心方式
前端·javascript
纸上的彩虹6 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
be or not to be7 小时前
深入理解 CSS 浮动布局(float)
前端·css
LYFlied7 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
老华带你飞7 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小徐_23337 小时前
2025 前端开源三年,npm 发包卡我半天
前端·npm·github
GIS之路8 小时前
GIS 数据转换:使用 GDAL 将 Shp 转换为 GeoJSON 数据
前端
JIngJaneIL8 小时前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端