在学习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