Dart语法之Typedefs

在学习Flutter的过程中用到了ValueChange<T>这个方法,是用typedef修饰的一个方法。查阅了一番资料,记录下对Typedefs的理解。

先看看官网的解释,我并没有看明白这个到底有什么用,可以做什么事。

说下自己的个人理解。首先需要明确的一点是在Dart中,方法是一等对象。可以把方法当做参数调用另外一个方法。 typedef 本质上为 一个方法签名提供了一个别名。官网上介绍TypeDef的时候有一句话说道:”If we change the code to use explicit names and retain type information” ,使用typedef会保留方法的类型信息。以官网的例子说明

class SortedCollection {
  Function compare;

  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

void main() {
  SortedCollection coll = SortedCollection(sort);

  // All we know is that compare is a function,
  // but what type of function?
  assert(coll.compare is Function);
}

当把 f 赋值给 compare 的时候, 类型信息丢失了。 f 的类型是 (Object, Object) → int (这里 → 代表返回值类型)。我们不能使用“coll.compare is int f(Object a, Object b)”判断,我们只知道该类型是一个 Function。而使用typedef,相当于给方法贴了一个类型标签。

我在Effective Dart中看到一条规则说到: 如果需要的只是一个回调函数,使用方法即可。 如果你定义了一个类,里面只有一个名字无意义的函数, 例如 call 或者 invoke, 这种情况最好用方法替代;

//good
typedef Predicate<E> = bool Function(E element);

//bad
abstract class Predicate<E> {
  bool test(E element);
}

前面提到的ValueChange<T>这个方法就是作为回调函数使用,具体细节可以参考The parent widget manages the widget’s state

    原文作者:Swy2w
    原文地址: https://www.jianshu.com/p/010d2dff6845
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞