Flutter错误处理插件neverthrow的使用

Flutter 错误处理插件 neverthrow 的使用

描述

neverthrow 是一个将 TypeScript 包 neverthrow 移植到 Dart 的库。该库提供了用于处理成功和失败结果的 Result 类型。对于异步任务,neverthrow 提供了 ResultAsync 类,它可以包装一个 Future<Result<T, E>>,并提供与常规 Result<T, E> 相同级别的表达性和控制。

ResultAsync 是可then化的,意味着它表现得像一个原生的 Future。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  neverthrow: ^1.0.0

或者运行以下命令:

dart pub add neverthrow

使用

以下是一些使用 neverthrow 的示例代码:

import 'package:neverthrow/neverthrow.dart';

void main() {
  // 创建一个成功的结果
  final okValue = ok(10);
  print(okValue.isOk()); // true
  print(okValue.value); // 10

  // 创建一个失败的结果
  final errValue = err('error');
  print(errValue.isErr()); // true
  print(errValue.error); // error

  // 对成功的结果进行映射操作
  final mappedOk = ok(10).map((value) => value * 2); // Result<int, dynamic>
  print(mappedOk.isOk()); // true
  print(mappedOk.asOk.value); // 20

  // 对失败的结果进行映射操作
  final mappedErr = err('error')
      .mapErr((error) => 'There is an $error'); // Result<dynamic, String>
  print(mappedErr.isErr()); // true
  print(mappedErr.asErr.error); // There is an error

  // 链接多个操作
  final chainedResult = ok(10)
      .andThen((value) => ok(value * 2))
      .andThen((value) => err<int, String>('error'));
  print(chainedResult.isErr()); // true
  print(chainedResult.asErr.error); // error

  // 使用 orElse 处理错误
  final orElseResult = err('error').orElse((error) => ok(10));
  print(orElseResult.isOk()); // true
  print(orElseResult.asOk.value); // 10

  // 使用 match 处理两种情况
  final matchResult = ok(10).match((value) => value * 2, (error) => 0);
  print(matchResult); // 20

  // 使用 unwrapOr 处理两种情况
  final unwrapOrResult = err('error').unwrapOr(10);
  print(unwrapOrResult); // 10

  // 使用 fromFuture 处理 Future 结果
  final futureResult =
      ResultAsync.fromFuture(Future.value(10), (error) => 'There is an $error');
  futureResult.match((value) => print(value), (error) => print(error)); // 10

  // 使用 fromSafeFuture 处理 Future 结果
  final safeFutureResult = ResultAsync.fromSafeFuture(Future.value(10));
  safeFutureResult.match(
      (value) => print(value), (error) => print(error)); // 10

  // 对 Future 结果进行映射操作
  final mappedFuture =
      ResultAsync.fromSafeFuture(Future.value(10)).map((value) => value * 2);
  mappedFuture.match((value) => print(value), (error) => print(error)); // 20

  // 对 Future 错误结果进行映射操作
  final mappedFutureError = ResultAsync.fromFuture(
          Future.error('error'), (error) => 'There is an $error')
      .map((value) => value * 2);
  mappedFutureError.match(
      (value) => print(value), (error) => print(error)); // There is an error

  // 链接多个 Future 操作
  final chainedFutureResult = ResultAsync.fromSafeFuture(Future.value(10))
      .andThen((value) => ResultAsync.fromSafeFuture(Future.value(value * 2)))
      .andThen((value) => ResultAsync.fromFuture(
          Future.error('error'), (error) => 'There is an $error'));
  chainedFutureResult.match(
      (value) => print(value), (error) => print(error)); // There is an error

  // 使用 orElse 处理 Future 错误
  final orElseFutureResult = ResultAsync.fromFuture(
          Future.error('error'), (error) => 'There is an $error')
      .orElse((error) => ResultAsync.fromSafeFuture(Future.value(10)));
  orElseFutureResult.match(
      (value) => print(value), (error) => print(error)); // 10

  // 使用 unwrapOr 处理 Future 结果
  final unwrapOrFutureResult =
      ResultAsync.fromSafeFuture(Future.value(10)).unwrapOr(0);
  unwrapOrFutureResult.then((value) => print(value)); // 10

  // 使用 unwrapOr 处理 Future 错误
  final unwrapOrFutureErrorResult = ResultAsync.fromFuture(
      Future.error('error'), (error) => 'There is an $error').unwrapOr(0);
  unwrapOrFutureErrorResult.then((value) => print(value)); // 0
}

更多关于Flutter错误处理插件neverthrow的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误处理插件neverthrow的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,neverthrow 是一个用于错误处理的库,它提供了一种更类型安全和表达力强的方式来处理应用程序中的错误。以下是如何在Flutter项目中使用 neverthrow 进行错误处理的代码示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 neverthrow 依赖:

dependencies:
  flutter:
    sdk: flutter
  neverthrow: ^x.y.z  # 替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,让我们看一些使用 neverthrow 的代码示例。

1. 导入库

在你的 Dart 文件中导入 neverthrow

import 'package:neverthrow/neverthrow.dart';

2. 定义错误类型

使用 Neverthrow 之前,通常你会定义一些自定义错误类型:

class InvalidInputError extends Error with Exception {
  final String message;
  InvalidInputError(this.message);
}

class NetworkError extends Error with Exception {
  final String message;
  NetworkError(this.message);
}

3. 使用 Result 类型

neverthrow 提供了一个 Result 类型,它可以包含成功值或错误。你可以使用 Result.successResult.failure 来创建这些值。

Result<int, Error> parseAndValidateInput(String input) {
  try {
    int value = int.parse(input);
    if (value < 0) {
      return Result.failure(InvalidInputError('Input must be a non-negative integer.'));
    }
    return Result.success(value);
  } catch (e) {
    return Result.failure(InvalidInputError('Invalid input format.'));
  }
}

Result<String, Error> fetchDataFromNetwork(String url) {
  // 模拟网络请求
  if (url.contains('error')) {
    return Result.failure(NetworkError('Simulated network error.'));
  }
  return Result.success('Data fetched from $url');
}

4. 处理 Result

你可以使用 match 方法来处理 Result,根据它是成功还是失败来执行不同的逻辑。

void processInput(String input) {
  Result<int, Error> result = parseAndValidateInput(input);

  result.match(
    (successValue) {
      print('Success: $successValue');
      // 进一步处理成功值
    },
    (failureError) {
      if (failureError is InvalidInputError) {
        print('Invalid Input Error: ${failureError.message}');
      } else if (failureError is NetworkError) {
        print('Network Error: ${failureError.message}');
      } else {
        print('Unknown Error: ${failureError.message}');
      }
    },
  );
}

void fetchData(String url) {
  Result<String, Error> result = fetchDataFromNetwork(url);

  result.match(
    (successMessage) {
      print('Network Success: $successMessage');
      // 处理成功获取的数据
    },
    (failureError) {
      if (failureError is NetworkError) {
        print('Network Error: ${failureError.message}');
      } else {
        print('Unknown Error: ${failureError.message}');
      }
    },
  );
}

5. 组合操作

你可以使用 andThen 方法来链式处理多个 Result 操作:

void combinedOperation(String input, String url) {
  Result<int, Error> parsedResult = parseAndValidateInput(input);

  parsedResult.andThen(
    (value) => fetchDataFromNetwork(url),
  ).match(
    (successMessage) {
      print('Combined Success: Value = $value, Message = $successMessage');
    },
    (failureError) {
      if (failureError is InvalidInputError) {
        print('Invalid Input Error: ${failureError.message}');
      } else if (failureError is NetworkError) {
        print('Network Error: ${failureError.message}');
      } else {
        print('Unknown Error: ${failureError.message}');
      }
    },
  );
}

注意:在 combinedOperation 中,由于 andThen 需要访问 value 变量,但 value 是在 match 的成功分支中定义的,因此在实际代码中你需要调整逻辑以适应作用域限制,这里仅作为示例说明如何链式处理。

通过这些示例,你可以看到 neverthrow 如何帮助你在 Flutter 应用中更优雅地处理错误。希望这些代码示例对你有帮助!

回到顶部