Flutter函数类型定义插件func_types的使用

Flutter函数类型定义插件func_types的使用

提供了用于Dart的功能类型。

为什么应该使用这个库? 有许多库提供功能类型,但它们提供了太多的方法来规避对值的安全处理。此库通过明确标记可能导致异常的操作为“不安全”,来强制执行对值的安全处理。

重要事项

这是一个预发布版本,公共API可能会更改。

特性

提供了以下类型:

  • ✅ Option
  • ✅ Either
  • ✅ Result
    • ExTrace(Exception/错误和StackTrace的包装器)

还为上述类型的Iterable提供了扩展函数。

开始使用

更多示例可以在git仓库的example文件夹中找到。

使用方法

Option

void main(List<String>? nullableArgs) {
  final maybeArgs = Option.of(nullableArgs);

  // 匹配两种情况
  maybeArgs.match(
          onSome: (args) => print('Arguments were provided'),
          onNone: () => print('Missing arguments'));

  // 仅匹配非空值
  maybeArgs.ifSome((args) => print('Arguments were provided'));
  // 异步
          () async {
    await maybeArgs
            .ifSomeAsync((args) async => print('Arguments were provided'));
  }();

  // 仅匹配空值
  maybeArgs.ifNone(() => print('Missing arguments'));
  // 异步
          () async {
    await maybeArgs.ifNoneAsync(() async => print('Missing arguments'));
  }();

  // 安全获取内部值
  maybeArgs.get(List.empty());
  // 使用函数
  maybeArgs.getOr(() => List.empty());
  // 异步
          () async {
    await maybeArgs.getOrAsync(() async => List.empty());
  }();
}

Either

void main() {
  final num = one();

  // 匹配两种情况
  num.match(
      onLeft: (oneStr) {
        print(oneStr.runtimeType == String);
      },
      onRight: (oneInt) {
        print(oneInt.runtimeType == int);
      }
  );

  // 仅匹配左值
  num.ifLeft((left) => print(left.runtimeType == String));
  // 异步
  () {
    num.ifLeftAsync((left) async => print(left.runtimeType == String));
  }();

  // 安全获取左值
  num.left("2");
  // 使用函数
  num.leftOr(() => "2");
  // 异步
  () async {
    await num.leftOrAsync(() async => "2");
  }();

  // 对右值进行相同操作
}

Either<String, int> one() {
  return Either.left("1");
}

Result

String failing() {
  throw Exception();
}

void main() {
  final stringResult = Result.tryCatch(() => failing());

  // 匹配两种情况
  stringResult.match(
    onOk: (okStr) => print(okStr),
    onErr: (err) => print("${err.ex}: ${err.stackTrace}"),
  );

  // 仅匹配成功值
  stringResult.ifOk((str) => print(str));
  // 异步
  () async {
    await stringResult.ifOkAsync((str) async => print(str));
  }();

  // 仅匹配错误值
  stringResult.ifErr((err) => print(err));
  // 异步
  () async {
    await stringResult.ifErrAsync((err) async => print(err));
  }();

  // 安全获取成功值
  stringResult.ok("2");
  // 使用函数
  stringResult.okOr(() => "2");
  // 异步
  () async {
    await stringResult.okOrAsync(() async => "2");
  }();

  // 安全获取错误值
  stringResult.err(ExTrace(Exception(), StackTrace.current));
  // 使用函数
  stringResult.errOr(() => ExTrace(Exception(), StackTrace.current));
  // 异步
  () async {
    await stringResult
        .errOrAsync(() async => ExTrace(Exception(), StackTrace.current));
  }();
}

更多关于Flutter函数类型定义插件func_types的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter函数类型定义插件func_types的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,func_types 是一个用于定义和操作函数类型的插件。它可以帮助你更好地管理函数类型,使得代码更加清晰和类型安全。以下是如何使用 func_types 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 func_types 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  func_types: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 func_types 包:

import 'package:func_types/func_types.dart';

3. 定义函数类型

func_types 允许你定义和使用函数类型。例如,你可以定义一个接受两个整数并返回一个整数的函数类型:

typedef IntFunction = Func2<int, int, int>;

这里 Func2 表示一个接受两个参数并返回一个值的函数类型。Func2 的泛型参数分别表示第一个参数类型、第二个参数类型和返回值类型。

4. 使用函数类型

你可以像使用普通函数类型一样使用 IntFunction

IntFunction add = (int a, int b) => a + b;

void main() {
  print(add(2, 3));  // 输出: 5
}

5. 高阶函数

func_types 还支持高阶函数的定义和使用。例如,你可以定义一个接受 IntFunction 作为参数的函数:

int operate(int a, int b, IntFunction func) {
  return func(a, b);
}

void main() {
  print(operate(2, 3, add));  // 输出: 5
}

6. 其他函数类型

func_types 提供了 Func0Func9 来支持不同参数数量的函数类型。例如:

  • Func0<R>: 无参数函数,返回类型为 R
  • Func1<A, R>: 接受一个 A 类型参数,返回类型为 R
  • Func2<A, B, R>: 接受两个参数 AB,返回类型为 R
  • 依此类推,直到 Func9

7. 函数组合

func_types 还支持函数组合。例如,你可以将两个函数组合在一起:

Func1<int, int> increment = (int x) => x + 1;
Func1<int, int> square = (int x) => x * x;

void main() {
  var composed = compose(square, increment);
  print(composed(3));  // 输出: 16 (先递增,再平方)
}
回到顶部