Dart 2.0中是否有任何密封类替代品?

时间:2019-01-22 21:52:50

标签: dart flutter

我有Android开发背景,正在学习Flutter。

在Android中,通常的做法是使用Kotlin密封类从ViewModel返回状态,例如。

sealed class MyState {
    data class Success(val data: List<MyObject>) : MyState()
    data class Error(val error: String) : MyState()
}

我想在Flutter中使用类似的模式,并从BLOC类返回一个State对象。在Flutter中实现相同效果的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

这种用例将使用命名工厂构造函数完成。

它需要更多代码,但行为是相同的。

class MyState {
  MyState._();

  factory MyState.success(String foo) = MySuccessState;
  factory MyState.error(String foo) = MyErrorState;
}

class MyErrorState extends MyState {
  MyErrorState(this.msg): super._();

  final String msg;
}

class MySuccessState extends MyState {
  MySuccessState(this.value): super._();

  final String value;
}

答案 1 :(得分:2)

以下是Flutter中密封类/工会的软件包

Freezed

此软件包提供了处理数据类,Dart / Flutter中的密封类的功能

这是解释在Flutter中野兽使用冷冻包装的链接

Use of Freezed Package in Flutter/Dart

答案 2 :(得分:1)

RémiRousselet 的答案在某种程度上是正确的,但正如 sindrenm 所述:

不幸的是,这不是一回事。 Kotlin密封类确保在给定类的定义文件之外没有其他任何给定类的实现。这意味着您可以通过仅提供所有可能的替代方案(无需考虑)来耗尽语句(在Dart中切换)。其他地方的潜在子类别

尽管在 dart语言上对此功能进行了积极的讨论:Algebraic Data Types,但是有一些库可以帮助您实现此行为。您可以使用以下库:

Sealed Unions

Super Enum

Sealed Class

如果使用的是 BLoC 库,则可以使用以下库:

Sealed Flutter Bloc

我希望 dart语言尽快添加此功能