我在Flutter tutorial中看到了以下代码。
@immutable
abstract class TimerState extends Equatable {
final int duration;
TimerState(this.duration, [List props = const []])
: super([duration]..addAll(props));
}
我无法理解构造函数中的代码。有人可以解释一下这里发生了什么吗?
答案 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])
至少在我正确理解语法的情况下。如果没有,有人会用合适的尺子重击我。 :)