Home Dart学习笔记
Post
Cancel

Dart学习笔记

  1. built-in types:
    • Numbers
      • int. 8个字节[-2^63, 2^63;若转成javaScript, 区间是[-2^53, 2^53)

      • double. 8个字节 (int/double 都是num的子类型)

    • Strings
      • String。 UTF-16编码。

      • 支持引号内$variable / ${expression}

      • 支持单引号/双引号。

      • 用’'’或””” 定义多行。

      • 可以用’+’连接两个string(’+’能省略)。

      • r’’ 来创建一个raw string.

    • Booleans
      • bool
    • Lists. In dart, list = array。
      • List.
      • var list = [1,2,3], list的类型会被推断为List.
    • Maps
      • Map.
      • var m = {“key1”:”value1”, “key2”:”value2”}, list的类型会被推断为Map<String, String>.
      • var m = Map()
      • Runes. the UTF-32 code points of a string. ?
    • Symbols. ?
  2. 变量定义时:dynamic/var/final/const/其他确定的类型

  3. dymamic 与 object的区别?

  4. everything is inherited from object, include null

  5. 支持方法嵌套。可以在方法体内再定义方法。

  6. 没有权限修饰符(如public/private。若class/function/variable 名称以 ‘_‘开头, 只对所在library可见。

  7. 跟java一样,赋值是引用传递。

  8. 未初始化的值默认都是null, 包括numbers(int/double)。

  9. 定义的方法也是对象,类型是Function。 因此方法可以像变量一样进行传递。

  10. 当能推断返回值类型时,方法返回类型可省略。当方法体内只有一行时,可使用 … => …。

  11. 方法定义中两种可选形式:
    • Optional named parameters
      • void test({bool arg1, String arg2})
      • 设置必须的入参:void test({bool arg1, @required String arg2})
      • 设置入参默认值: void test({bool arg1, String arg2 = “str123”})
    • Optional positioned parameters
      • String say(String from, String msg, [String device])
      • 设置入参默认值:String say(String from, String msg, [String device = “android”])
  12. 匿名方法。
    1
    2
    
    var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
    list.forEach((item) => print('{list.indexOf(item)}: item'));
    


  13. 特殊的分配操作符’??=’。 只有在变量为null时才会给变量分配。
    1
    2
    3
    
        b ??= 1 
        //等价于
        b = b ?? 1.
    


  14. 判空操作符’??’。
    1
    
    String playerName(String name) => name ?? 'Guest';
    


  15. 瀑布式操作符’..’。
    1
    2
    3
    4
    5
    
    void main() {
        querySelector('#sample_text_id')
        ..text = 'Click me!'
        ..function-call()
    }
    


  16. 非空操作符’?.’。
    • a?.print(). 当a为非空变量时,调用print()方法。
  17. 抛异常/捕获异常。
    • throw …; 可以抛出任何类型,包括 Exception/Error/any objects

    • 捕获异常时,若没有指定具体类型,表示捕获所有的被抛出的object
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      try {
        breedMoreLlamas();
      } on OutOfLlamasException {
         // A specific exception
         buyMoreLlamas();
      } on Exception catch (e) {
         // Anything else that is an exception
         print('Unknown exception: e');
      } catch (e) {
         // No specified type, handles all
         print('Something really unknown: e');
      }
      
    • catch(e, s) 若catch定义两个入参,则’s’表示报异常方法的调用栈信息。

    • rethrow; 在catch中调用rethrow可继续抛出该异常。
  18. object.runtimeType 获取变量的类型。

  19. 构造方法中的糖语法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    class Point {
        num x, y;
    
        Point(this.x, this.y);
    
        Point(num x, num y) {
           this.x = x;
           this.y = y;
        }
    }
    


  20. 若没有定义构造方法,默认有一个没有入参的构造方法。

  21. 构造方法不能被继承。

  22. 实例初始化的过程: Initializer list -> super class constructor -> constructor.
    1
    2
    3
    4
    
    Point.fromJson(Map<String, num> json)
        : x = json['x'],y = json['y'] {
        print('In Point.fromJson(): (x, y)');
    }
    

    fromJson是类Point的Named constructors, ‘:’后面的是 Initializer list。在Initializer list中,无法使用关键字’this’.

  23. 成员变量的 getter/setter.
    1
    2
    3
    4
    5
    6
    7
    
    class Rectangle {
        ...
        num get right => left + width;
        set right(num value) => left = value - width;
        num get bottom => top + height;
        set bottom(num value) => top = value - height;
    }
    


  24. 每个类都默认定义了一个包括了所有成员的接口(成员变量的getter/setter & 方法的 抽象化方法)。其他的类可通过关键字’implement’来继承。

  25. 重写操作符。
    1
    2
    3
    4
    5
    6
    7
    8
    
    class Vector {
        final int x, y;
    
        Vector(this.x, this.y);
    
        Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
        Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
    }
    

    如果要重写’==’操作符,必须重写hashcode方法。

  26. mixins. 通过关键字’with’实现代码复用。被复用的类不能定义构造方法,且如果被复用类没有其他的用途,可使用关键字’mixin’代替’class’.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    mixin Musical {
        bool canPlayPiano = false;
        bool canCompose = false;
        bool canConduct = false;
    
        void entertainMe() {
            if (canPlayPiano) {
              print('Playing piano');
            } else if (canConduct) {
              print('Waving hands');
            } else {
              print('Humming to self');
            }
        }
    }
    class Musician extends Performer with Musical {
        // ···
    }
    


  27. 库的懒加载。使用关键字’deferred as xxx’来实现。在使用该库时,需要先手动加载。
    1
    2
    3
    4
    
    Future greet() async {
        await hello.loadLibrary();
        hello.printGreeting();
    }
    


  28. 异步方法:await/async.
    • await expression. expression 返回一个Future类型,若原返回类型不是Future类型,会自动包装成Future类型。await expression会返回T object类型

    • 要使用await, 必须在async方法体中

    • 可使用try/catch 捕获 await expression 中的异常

    • 若在async方法中,没有定义返回值,默认返回Future

  29. Generators. 分同步生成器、异步生成器两种。同步生成器使用sync* + yield,返回Iterable类型。异步生成器使用async* + yield 返回Stream类型。
    • 同步生成器:
      1
      2
      3
      4
      
      Iterable<int> naturalsTo(int n) sync* {
        int k = 0;
        while (k < n) yield k++;
      }
      
    • 异步生成器(通过aysnc for 使用 stream):
      1
      2
      3
      4
      
      Stream<int> asynchronousNaturalsTo(int n) async* {
        int k = 0;
        while (k < n) yield k++;
      }
      


  30. Callable classes. 允许类实例像方法一样调用。要求class先实现call方法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class WannabeFunction {
        call(String a, String b, String c) => 'a b $c!';
    }
    
    main() {
        var wf = WannabeFunction();
        var out = wf("Hi","there,","gang");
        print('$out');
    }
    


  31. typedef 关键字。 给一个方法类型设定一个类型别名。
    1
    
    typedef Compare = int Function(Object a, Object b);
    


  32. Metadata(注解). Two annotations are available to all Dart code: @deprecated and @override.
This post is licensed under CC BY 4.0 by the author.