Flutter构造函数参数

时间:2019-08-13 06:17:03

标签: flutter dart

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

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

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

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

2 个答案:

答案 0 :(得分:4)

此构造函数具有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]意味着创建包含List的{​​{1}}。
duration获取带有持续时间的已创建列表,添加..addAll(props)构造函数中传递的props列表中的所有内容,并返回包含持续时间和道具的新列表。这样做只是为了简化TimerState对象的相等性比较。

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

我希望我不要再让您感到困惑了:)
我认为在此示例中使用Equatable是过大的,因为只有一个实际属性,并且从未使用过[10, prop1, prop2, prop3]中的Equatable

答案 1 :(得分:0)

这几天使用扩展运算符可能会更好:

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

成为

super([duration,...props])

至少在我正确理解语法的情况下。如果没有,有人会用合适的尺子重击我。 :)