Dart语法之Typedefs

作者: Swy2w | 来源:发表于2018-10-11 14:50 被阅读5次

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

    相关文章

      网友评论

        本文标题:Dart语法之Typedefs

        本文链接:https://www.haomeiwen.com/subject/ucybaftx.html