Flutter数据类型求和插件sum_data_types的使用

Flutter数据类型求和插件sum_data_types的使用

本dart库通过蓝图混入(mixin)生成不可变的数据类和求和类型(sum types)。生成的类定义了结构化相等性和hashCode,并提供了有意义的toString实现。

该库受到以下两个库的影响:

然而,它们的接口不同,所以我们创建了一个新的包。

安装

在你的依赖项中添加这些包:

dependencies:
  sum_data_types: [插入最新版本号]

dev_dependencies:
  build_runner: ^1.7.0
  sum_data_types_generator: [插入最新版本号]

数据类

数据类类似于不可变记录。数据类的字段用于以结构化方式定义相等性和hashCode

定义一个蓝图混入

这里是一个例子:

import 'package:sum_data_types/main.dart';
import 'package:quiver/core.dart';
import 'package:kt_dart/collection.dart';

@DataClass()
mixin User on _UserBase {
  String get name;
  Optional<int> get age;
  KtList<User> get friends;

  int numerOfFriends() {
    return this.friends.size;
  }
}

@DataClass() 注解触发了从混入生成数据类。 混入应该为数据类的每个属性定义 getter。代码生成将生成==(结构化相等性),hashCodetoString的代码。 此外,它还会生成一个copyWith方法,你可以通过这个方法非破坏性地修改现有对象的某些字段(即copyWith返回对象的副本)。

你可以通过使用两个布尔标志toStringeqHashCode来自定义代码生成。如果你将其中一个标志设置为false,则不会生成toString==hashCode的代码。例如:

@DataClass(toString: false)
mixin UserWithPassword {
  String get userId;
  String get password;

  String toString() {
    return "User($userId)"; // 不打印密码
  }
}

使用生成的类

你可以通过使用生成的UserFactory类的静态make方法来创建数据类的实例。

void main() {
  final userBob = UserFactory.make(
    name: "Bob",
    friends: KtList.empty(),
  );
  final userSarah = UserFactory.make(
    name: "Sarah",
    friends: KtList.empty(userBob),
    age: 31,
  );
}

可选字段

如果字段的类型是Optional<...>,则字段是可选的。Optional来自quiver.core库。 建议使用不可变集合,例如来自kt.dart包的集合。你也可以使用内置集合,如List,但它们的相等性基于指针相等性,而不是结构化相等性。

求和类型

求和类型在新类型下组合了各种类型的替代方案。生成的代码定义了用于区分不同替代方案的切换函数。

定义一个蓝图混入

这里是一个例子:

import 'package:sum_data_types/main.dart';

@SumType()
mixin Either<A, B> on _EitherBase<A, B> {
  A get _left;
  B get _right;
}

@SumType() 注解触发了从混入生成数据类。 混入应该为求和类型的每个替代方案定义 getter。getter 的名称必须以下划线开头。代码生成将生成==(结构化相等性),hashCodetoString的代码。 此外,它还会生成iswitchiswitcho方法,你可以用它们来遍历各种替代方案。这里是iswitch方法的一个使用示例:

void foo(Either<String, int> x) {
  x.iswitch(
    left: (s) => print("String: " + s),
    right: (i) => print("int: " + i.toString())
  );
}

iswitcho方法有一个额外的otherwise标签,因此当你使用iswitcho时不必覆盖所有情况。

你可以通过使用两个布尔标志toStringeqHashCode来自定义代码生成。如果你将其中一个标志设置为false,则不会生成toString==hashCode的代码。

使用生成的类

你可以通过使用生成的EitherFactory类的静态leftright方法来创建求和类型的实例。

EitherFactory.right(42)

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

1 回复

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


在Flutter中,如果你想对不同的数据类型进行求和操作,可以使用自定义的插件或库。虽然Flutter本身没有内置的sum_data_types插件,但你可以创建一个自定义的函数或使用现有的方法来处理不同数据类型的求和。

自定义求和函数

假设你想对整数、浮点数和字符串(如果它们可以转换为数字)进行求和,你可以创建一个自定义的函数。以下是一个简单的示例:

void main() {
  List<dynamic> data = [1, 2.5, "3.2", 4, "5.7"];
  
  double sum = sumDataTypes(data);
  
  print("Sum: $sum"); // 输出: Sum: 16.4
}

double sumDataTypes(List<dynamic> data) {
  double sum = 0.0;
  
  for (var item in data) {
    if (item is int) {
      sum += item.toDouble();
    } else if (item is double) {
      sum += item;
    } else if (item is String) {
      double? parsedValue = double.tryParse(item);
      if (parsedValue != null) {
        sum += parsedValue;
      }
    }
  }
  
  return sum;
}
回到顶部