Dart 2.6引入了一种新的语言功能,称为“ static extension members ”。
但是,我不太了解如何使用它。
我想轻松获得childCount
或Row
中的Column
,即使用row.childCount
代替row.children.length
:
void main() {
final row = Row(children: const [Text('one'), Text('two')]),
column = Column(children: const [Text('one'), Text('two'), Text('three')]);
print(row.childCount); // Should print "2".
print(column.childCount); // Should print "3".
}
我尝试执行以下操作,但这是语法错误:
Row.childCount() => this.children.length;
Column.childCount() => this.children.length;
答案 0 :(得分:9)
现在有一个关于扩展方法的official video by the Flutter team。
以下是扩展方法的工作方式的直观示例:
extension FancyNum on num {
num plus(num other) => this + other;
num times(num other) => this * other;
}
我只是在这里扩展num
并将方法添加到类中。可以这样使用:
print(5.plus(3)); // Equal to "5 + 3".
print(5.times(8)); // Equal to "5 * 8".
print(2.plus(1).times(3)); // Equal to "(2 + 1) * 3".
请注意,名称FancyNum
是可选的,以下内容也有效:
extension on num {}
上面的扩展名将使用implicit extension member invocations,因为您不必显式声明num
为FancyNum
。
您还可以显式声明您的扩展名,但这在大多数情况下是不需要的:
print(FancyNum(1).plus(2));
问题的期望行为可以通过扩展Row
或Column
来实现,甚至更好:您可以扩展Flex
,它是Row
的超类和 Column
:
extension ExtendedFlex on Flex {
int get childCount => this.children.length;
}
如果未在this.
的当前词汇范围中定义children
,也可以省略 childCount
,这意味着=> children.length
也是有效的。
导入了Flex
的静态扩展名后,您可以在任何Flex
上调用它,也可以在每个Row
和Column
上调用它。
Row(children: const [Text('one'), Text('two')]).childCount
将得出2
。
答案 1 :(得分:0)
Dart 2.7引入了新的扩展方法概念。
https://dart.dev/guides/language/extension-methods
extension ParseNumbers on String {
int parseInt() {
return int.parse(this);
}
double parseDouble() {
return double.parse(this);
}
}
main() {
int i = '42'.parseInt();
print(i);
}
答案 2 :(得分:0)
扩展名可以具有通用类型参数。对于以下示例显示了多个适用的扩展名可用时的隐式扩展名解析。
extension SmartIterable<T> on Iterable<T> {
void doTheSmartThing(void Function(T) smart) {
for (var e in this) smart(e);
}
}
extension SmartList<T> on List<T> {
void doTheSmartThing(void Function(T) smart) {
for (int i = 0; i < length; i++) smart(this[i]);
}
}
...
List<int> x = ....;
x.doTheSmartThing(print);
这两个扩展名都适用,但是SmartList
扩展名比SmartIterable
扩展名更具体,因为列表<:Iterable<dynamic>
。