【问题标题】:Are there any sealed classes alternatives in Dart 2.0?Dart 2.0 中是否有任何密封类替代方案?
【发布时间】:2019-06-16 10:31:48
【问题描述】:

我有 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 中实现相同目标的最佳方法是什么?

【问题讨论】:

标签: dart flutter


【解决方案1】:

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

它需要更多的代码,但行为是一样的。

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;
}

【讨论】:

  • 非常好!谢谢@rémi-rousselet 此处还记录了使用抽象类并实现其接口的这种模式的变体:github.com/dart-lang/sdk/issues/33079#issuecomment-388912316
  • 不幸的是,这不是一回事。 Kotlin 密封类保证在定义它们的文件之外没有给定类的其他实现。这意味着您可以通过仅提供所有可能的替代方案作为案例来耗尽when 语句(Dart 中的switch)不得不考虑其他地方的潜在子类。
  • @sindrenm 是的。请参阅github.com/rrousselGit/Freezed,它进一步推动了此处的原理展示,包括when 之类的内容。
  • 对!是的,我想这可以通过代码生成库来完成。 ?
【解决方案2】:

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

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

虽然 dart 语言 上对此功能进行了积极的讨论:Algebraic Data Types,但有一些库可以帮助您实现此行为。你可以使用这个库:

Sealed Unions

Super Enum

Sealed Class

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

Sealed Flutter Bloc

希望飞镖语言尽快添加这个功能

【讨论】:

    【解决方案3】:

    这是 Flutter 中密封类/联合的包

    Freezed

    这个包提供了处理数据类,Dart/Flutter 中的密封类的功能

    这里是解释如何在 Flutter 中使用 freezed package 的链接

    Use of Freezed Package in Flutter/Dart

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2017-03-06
      • 1970-01-01
      • 2020-06-13
      • 2021-11-26
      • 2011-06-07
      • 2012-05-03
      • 2012-08-18
      • 2020-12-27
      相关资源
      最近更新 更多