【问题标题】:Flutter constructor argumentsFlutter 构造函数参数
【发布时间】:2019-12-19 16:13:51
【问题描述】:

我在 Flutter tutorial 中看到了以下代码。

@immutable
abstract class TimerState extends Equatable {
  final int duration;

  TimerState(this.duration, [List props = const []])
      : super([duration]..addAll(props));
}

我无法理解构造函数中的代码。有人可以解释一下这里发生了什么吗?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    此构造函数有 2 个位置参数:
    第一个是this.duration,它将初始化final int duration 字段。构造函数中的this.something 表示它将初始化已创建实例的名称为something 的字段。
    第二个参数是可选的位置参数,因为它列在方括号中。它是一个没有类型参数的List,所以这个列表可以包含任何对象的混合。如果未设置此列表的值,则使用空列表的默认值 (= const [])。此处使用const 关键字,因为根据 dart 规则,构造函数的默认参数必须是编译时常量。

    所以调用TimerState(10)TimerState(10, []) 将返回相同的结果。

    下一部分是调用父类Equatable的构造函数。这个类属于equatable package。此类通过删除样板代码来简化覆盖operator ==。它不是比较描述每个字段,而是将所有字段的值放在一个列表中并比较该列表。
    呼叫看起来像 : super([duration]..addAll(props))
    这里[duration] 表示创建包含durationList
    ..addAll(props) 采用创建的带有持续时间的列表,添加来自props 列表中的所有内容,并传入TimerState 构造函数,并返回这个带有持续时间和道具的新列表里面。这样做只是为了简化TimerState 对象的相等性比较。

    因此,通过调用TimerState(10, [prop1, prop2, prop3]),您将创建一个持续时间设置为10 的TimerState,它将调用Equatable 构造函数,并带有参数[10, prop1, prop2, prop3]

    希望我没有让你更加困惑 :)
    我认为在这个例子中使用Equatable 是多余的,因为只有一个实际属性并且TimerState 中的props 从未使用过

    【讨论】:

    • 感谢您的精彩解释。一旦我阅读了您的答案,这一切都说得通了,除了一件事; ..(级联)运算符的用法在这里。我认为它将用于对同一个对象执行多个操作,例如 list.add(x)..add(y)。这里 add(x) 返回 void,所以需要使用 ..。但在上面的代码中,使用了 [duration]..addAll(props)。为什么 [duration].addAll(props) 会抛出错误? [duration] 不是返回一个 List 对象,这样我们就可以直接调用 addAll 方法了吗?
    • @humblePilgrim addAll 也返回 void,因此需要级联运算符返回一个列表
    • 我也见过 const []。这和 const [] 是一样的吗?
    【解决方案2】:

    现在使用扩展运算符可能会更好:

    super([duration]..addAll(props))
    

    变成

    super([duration,...props])
    

    至少如果我正确理解语法的话。如果没有,有人会用合适的尺子打我。 :)

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多