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

相关推荐
发现一只大呆瓜6 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
霍理迪7 小时前
Vue的响应式和生命周期
前端·javascript·vue.js
李剑一7 小时前
别再瞎写了!Cesium 模型 360° 环绕,4 套源码全公开,项目直接用
前端
小码哥_常7 小时前
Android消息机制:Handler、Looper和Message的深度剖析
前端
小码哥_常7 小时前
安卓开发新姿势:文件Picker全攻略,无痛适配不再难
前端
happymaker06267 小时前
web前端学习日记——DAY04
前端·学习
发现一只大呆瓜7 小时前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
swipe8 小时前
为什么 RAG 一定离不开向量检索:从文档向量化到语义搜索的工程实现
前端·llm·agent
OpenTiny社区9 小时前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp
IT_陈寒9 小时前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端