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

相关推荐
vipbic1 小时前
别再把“做个H5”挂嘴边了:这个词,官方压根就没有定义过
前端
ZC跨境爬虫3 小时前
跟着 MDN 学CSS day_39:(Flexbox 弹性盒子核心机制)
前端·css·ui·html·tensorflow
小陈同学呦3 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
喵个咪3 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
摆烂大大王5 小时前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao5 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色5 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆5 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
lichenyang4536 小时前
鸿蒙 MVVM 实战:从 Demo 到工程化,聊聊登录、状态管理与埋点系统设计
前端
IT_陈寒6 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端