我在 Flutter tutorial 中看到了以下代码。
@immutable
abstract class TimerState extends Equatable {
final int duration;
TimerState(this.duration, [List props = const []])
: super([duration]..addAll(props));
}
我无法理解构造函数中的代码。有人可以解释一下这里发生了什么吗?
最佳答案
此构造函数有 2 个位置参数:
第一个是 this.duration
,它将初始化 final inturation
字段。构造函数中的 this.something
意味着它将使用创建的实例的名称 something
初始化该字段。
第二个参数是可选位置参数,因为它列在方括号中。它是一个没有类型参数的List
,因此该列表可以包含任何对象的混合。如果未设置此列表的值,则使用空列表的默认值(= const []
)。这里使用 const 关键字是因为根据 dart 规则,构造函数的默认参数必须是编译时常量。
因此调用 TimerState(10)
和 TimerState(10, [])
将返回相同的结果。
下一部分是调用父类Equatable
的构造函数。该类属于equatable package
。此类旨在通过删除样板代码来简化重写operator ==
。它不是在比较中描述每个字段,而是将所有字段的值放入一个列表并比较该列表。
调用看起来像 : super([duration]..addAll(props))
.
这里[duration]
表示创建包含duration
的List
。
..addAll(props)
获取创建的包含持续时间的列表,添加在 TimerState
构造函数中传递的 props
列表中的所有内容,并返回这个包含持续时间的新列表以及里面的 Prop 。这样做只是为了简化 TimerState
对象的相等性比较。
因此,通过调用 TimerState(10, [prop1, prop2, prop3])
,您将创建一个持续时间设置为 10 的 TimerState
,它将调用 Equatable
带参数的构造函数[10, prop1, prop2, prop3]
我希望我没有让你更加困惑:)
我认为在这个例子中使用 Equatable
有点矫枉过正,因为只有一个实际属性,而 TimerState
中的 props
从未被使用过
关于Flutter 构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57472083/