[Day15] Flutter - 大海捞针不是办法 ( Dartz )

前言

Hi, 我是鱼板伯爵在原本的try&catch中我们可以截取大部分的错误,但是这仅能告诉我程序崩溃然後就喷一堆错误出来,对我来说就好像有人把整个程序丢给我说不能动一样,因此try&catch并不能满足我对程序追求的完美,这就是我要介绍Dartz的原因,它可以帮助你排除掉一些问题。

本篇教学会延续上一篇[Day14] Flutter - 怎麽串接API ( Http )的程序码进行修改。

完整程序码

安装

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3
  dartz: ^0.9.2
  equatable: ^2.0.3

Folding Either

Either这个型态分成左右两边,左边状态是错误时回传,右边则是成功的时候回传,像是这样子Either<Failure, User>

return createUser.post.fold(
  (failure) => log("$failure"),
  (post) => log("$post"),
);

修改程序码

首先创建一些错误时回传的类别,当遇到错误时就会丢出我们指定的讯息。

abstract class ServiceFailure extends Equatable {
  const ServiceFailure();

  @override
  List<Object> get props => [];
}

class PostFailure extends ServiceFailure {
  final code;
  final message;

  PostFailure(this.code, this.message);

  @override
  List<Object> get props => [code, message];
}

class ServerException extends ServiceFailure {
  final message;

  ServerException(this.message);

  @override
  List<Object> get props => [message];
}

可以看到下面回传有left和right两种,当我post出去结果没有创建新的使用者时,就可以马上知道是程序出问还是我的API出问题。

  Future<Either<ServiceFailure, User>> _createUser(
    Uri url,
    User body,
  ) async {
    try {
      final response = await client.post(
        url,
        headers: {
          'Content-Type': 'application/json',
        },
        body: body.toJson(),
      );
      if (response.statusCode == 201) {
        log(
          "${response.body}",
          name: response.statusCode.toString(),
        );
        return right(User.fromJson(response.body));
      } else {
        return left(PostFailure(
          response.statusCode,
          response.body,
        ));
      }
    } catch (e) {
      return left(ServerException(e));
    }
  }

Note:

虽然他的功能有很多,但是你想要追求更完美更细节的侦错导致绑手绑脚,那可就不是件好事了。


<<:  【Day1】: STM32前言

>>:  Day 01. 回想监控的起源

蓝新金流 - 智付通API串接

1.创建商店:注册->登入->会员中心->商店管理->开立商店设定/商店资料...

[Day17]What is Merkle tree? - 2

hi~今天要延续昨天merkle tree的主题! 我们昨天简述完之後,有用图解,希望大家有更清楚...

Django #1-3 套件管理工具pip pipenv poetry

1. pip Python 原生套件管理工具 venv 虚拟环境 install python -m...

[Day 1] 身为一名普通 iOS 开发者所需的程序知识 Intro

前言 Hi 我是一名普通的 iOS 开发者,兴趣使然的 UI 设计师。不小心参与了几年 iOS 开发...

React Hooks - useRef

在介绍 useRef 之前,先来介绍 ref。 在 React 中如果我们想要获取 DOM 或获取...