如何使用Dart扩展功能?

时间:2019-10-08 14:18:46

标签: flutter dart

Dart 2.6引入了一种新的语言功能,称为“ static extension members ”。
但是,我不太了解如何使用它。

我想轻松获得childCountRow中的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;

3 个答案:

答案 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,因为您不必显式声明numFancyNum

您还可以显式声明您的扩展名,但这在大多数情况下是不需要的:

print(FancyNum(1).plus(2));

Flex childCount

问题的期望行为可以通过扩展RowColumn来实现,甚至更好:您可以扩展Flex,它是Row的超类 Column

extension ExtendedFlex on Flex {
  int get childCount => this.children.length;
}
如果未在this.的当前词汇范围中定义children,也可以省略

childCount,这意味着=> children.length也是有效的。


导入了Flex静态扩展名后,您可以在任何Flex上调用它,也可以在每个RowColumn上调用它。
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>