dart Flutter类型的联合

w41d8nur  于 2023-10-13  发布在  Flutter
关注(0)|答案(3)|浏览(240)

我试图在flutter中定义一个类型的联合作为变量的类型。我想实现这样的目标:

class Type1 {
  String attr1;
  Map<String, String> attr2;
  Type1();
}

class Type2 {
  String attr1;
  String attr2;
  Type2();
}

Union2<Type1, Type2> myInstance;

Union2<String, int> stringOrInt;

我不想使用dynamic
我发现了一个旧的软件包称为union,但它是停产。你知道还有什么方法可以达到我的目的吗?
非常感谢你的回答!
PS:作为参考,我需要Union类型来创建Hive数据集适配器(框可能有不同的对象值)。

mtb9vblg

mtb9vblg1#

您可以使用freezed,它是用于数据类/联合/模式匹配/克隆的代码生成器。
这就是我们如何用freezed写union。

@freezed
class Union with _$Union {
  const factory Union.data(int value) = Data;
  const factory Union.loading() = Loading;
  const factory Union.error([String? message]) = Error;
}

开始使用冷冻,你不会后悔的。这是一个很棒的包。
类型为DataLoadingError

var union = Union(42);
if(union is Data) {
  print(union.value);
}

或者通过模式匹配,

var union = Union(42);

print(
  union.when(
    (int value) => 'Data $value',
    loading: () => 'loading',
    error: (String? message) => 'Error: $message',
  ),
);
bzzcjhmw

bzzcjhmw2#

Tuple是你需要的:https://pub.dev/packages/tuple
用法如下:

const t = Tuple2<String, int>('a', 10);
print(t.item1); // prints 'a'
print(t.item2); // prints 10
hzbexzde

hzbexzde3#

你可以使用dart3中引入的密封类,也可以使用Either package

相关问题