美文网首页
Dart语言

Dart语言

作者: C_G__ | 来源:发表于2019-07-23 14:42 被阅读0次

    Variables

    var name = 'Bob';
    dynamic name = 'Bob';
    String name = 'Bob';
    

    Default value

    int lineCount;
    assert(lineCount == null);
    

    Final and const

    final name = 'Bob'; // Without a type annotation
    final String nickname = 'Bobby';
    name = 'Alice'; // Error: a final variable can only be set once.
    
    const bar = 1000000; // Unit of pressure (dynes/cm2)
    const double atm = 1.01325 * bar; // Standard atmosphere
    
    var foo = const [];
    final bar = const [];
    const baz = []; // Equivalent to `const []`
    foo = [1, 2, 3]; // Was const []
    baz = [42]; // Error: Constant variables can't be assigned a value.
    

    Built-in types

    • numbers
      int
    var x = 1;
    var hex = 0xDEADBEEF;
    var y = 1.1;
    var exponents = 1.42e5;
    

    double

    double z = 1; // Equivalent to double z = 1.0.
    

    convert

    // String -> int
    var one = int.parse('1');
    assert(one == 1);
    
    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);
    
    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');
    
    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');
    
    assert((3 << 1) == 6); // 0011 << 1 == 0110
    assert((3 >> 1) == 1); // 0011 >> 1 == 0001
    assert((3 | 4) == 7); // 0011 | 0100 == 0111
    
    const msPerSecond = 1000;
    const secondsUntilRetry = 5;
    const msUntilRetry = secondsUntilRetry * msPerSecond;
    
    • strings
    var s1 = 'Single quotes work well for string literals.';
    var s2 = "Double quotes work just as well.";
    var s3 = 'It\'s easy to escape the string delimiter.';
    var s4 = "It's even easier to use the other delimiter.";
    
    var s = 'string interpolation';
    
    assert('Dart has $s, which is very handy.' ==
        'Dart has string interpolation, ' +
            'which is very handy.');
    assert('That deserves all caps. ' +
            '${s.toUpperCase()} is very handy!' ==
        'That deserves all caps. ' +
            'STRING INTERPOLATION is very handy!');
    
    var s1 = 'String '
        'concatenation'
        " works even over line breaks.";
    assert(s1 ==
        'String concatenation works even over '
            'line breaks.');
    
    var s2 = 'The + operator ' + 'works, as well.';
    assert(s2 == 'The + operator works, as well.');
    
    var s1 = '''
    You can create
    multi-line strings like this one.
    ''';
    
    var s2 = """This is also a
    multi-line string.""";
    
    var s = r'In a raw string, not even \n gets special treatment.';
    
    // These work in a const string.
    const aConstNum = 0;
    const aConstBool = true;
    const aConstString = 'a constant string';
    
    // These do NOT work in a const string.
    var aNum = 0;
    var aBool = true;
    var aString = 'a string';
    const aConstList = [1, 2, 3];
    
    const validConstString = '$aConstNum $aConstBool $aConstString';
    // const invalidConstString = '$aNum $aBool $aString $aConstList';
    
    • booleans
    // Check for an empty string.
    var fullName = '';
    assert(fullName.isEmpty);
    
    // Check for zero.
    var hitPoints = 0;
    assert(hitPoints <= 0);
    
    // Check for null.
    var unicorn;
    assert(unicorn == null);
    
    // Check for NaN.
    var iMeantToDoThis = 0 / 0;
    assert(iMeantToDoThis.isNaN);
    
    • lists (also known as arrays)
    var list = [1, 2, 3];
    assert(list.length == 3);
    assert(list[1] == 2);
    
    list[1] = 1;
    assert(list[1] == 1);
    
    var constantList = const [1, 2, 3];
    
    var list = [1, 2, 3];
    var list2 = [0, ...list];
    assert(list2.length == 4);
    
    var list;
    var list2 = [0, ...?list];
    assert(list2.length == 1);
    
    var nav = [
      'Home',
      'Furniture',
      'Plants',
      if (promoActive) 'Outlet'
    ];
    
    var listOfInts = [1, 2, 3];
    var listOfStrings = [
      '#0',
      for (var i in listOfInts) '#$i'
    ];
    assert(listOfStrings[1] == '#1');
    
    • sets
    var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
    
    var names = <String>{};
    // Set<String> names = {}; // This works, too.
    // var names = {}; // Creates a map, not a set.
    
    var elements = <String>{};
    elements.add('fluorine');
    elements.addAll(halogens);
    
    var elements = <String>{};
    elements.add('fluorine');
    elements.addAll(halogens);
    assert(elements.length == 5);
    
    final constantSet = const {
      'fluorine',
      'chlorine',
      'bromine',
      'iodine',
      'astatine',
    };
    // constantSet.add('helium'); // Uncommenting this causes an error.
    
    • maps
    var gifts = {
      // Key:    Value
      'first': 'partridge',
      'second': 'turtledoves',
      'fifth': 'golden rings'
    };
    
    var nobleGases = {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    
    var gifts = Map();
    gifts['first'] = 'partridge';
    gifts['second'] = 'turtledoves';
    gifts['fifth'] = 'golden rings';
    
    var nobleGases = Map();
    nobleGases[2] = 'helium';
    nobleGases[10] = 'neon';
    nobleGases[18] = 'argon';
    
    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds'; // Add a key-value pair
    
    var gifts = {'first': 'partridge'};
    assert(gifts['first'] == 'partridge');
    
    var gifts = {'first': 'partridge'};
    assert(gifts['fifth'] == null);
    
    var gifts = {'first': 'partridge'};
    gifts['fourth'] = 'calling birds';
    assert(gifts.length == 2);
    
    final constantMap = const {
      2: 'helium',
      10: 'neon',
      18: 'argon',
    };
    
    // constantMap[2] = 'Helium'; // Uncommenting this causes an error.
    
    • runes (for expressing Unicode characters in a string)
    main() {
      var clapping = '\u{1f44f}';
      print(clapping);
      print(clapping.codeUnits);
      print(clapping.runes.toList());
    
      Runes input = new Runes(
          '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
      print(new String.fromCharCodes(input));
    }
    
    • symbols
    #radix
    #bar
    

    Functions

    bool isNoble(int atomicNumber) {
      return _nobleGases[atomicNumber] != null;
    }
    
    isNoble(atomicNumber) {
      return _nobleGases[atomicNumber] != null;
    }
    
    bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
    

    Optional parameters

    enableFlags(bold: true, hidden: false);
    
    /// Sets the [bold] and [hidden] flags ...
    void enableFlags({bool bold, bool hidden}) {...}
    
    const Scrollbar({Key key, @required Widget child})
    
    String say(String from, String msg, [String device]) {
      var result = '$from says $msg';
      if (device != null) {
        result = '$result with a $device';
      }
      return result;
    }
    
    assert(say('Bob', 'Howdy') == 'Bob says Howdy');
    
    assert(say('Bob', 'Howdy', 'smoke signal') ==
        'Bob says Howdy with a smoke signal');
    

    Default parameter values

    /// Sets the [bold] and [hidden] flags ...
    void enableFlags({bool bold = false, bool hidden = false}) {...}
    
    // bold will be true; hidden will be false.
    enableFlags(bold: true);
    
    String say(String from, String msg,
        [String device = 'carrier pigeon', String mood]) {
      var result = '$from says $msg';
      if (device != null) {
        result = '$result with a $device';
      }
      if (mood != null) {
        result = '$result (in a $mood mood)';
      }
      return result;
    }
    
    assert(say('Bob', 'Howdy') ==
        'Bob says Howdy with a carrier pigeon');
    
    void doStuff(
        {List<int> list = const [1, 2, 3],
        Map<String, String> gifts = const {
          'first': 'paper',
          'second': 'cotton',
          'third': 'leather'
        }}) {
      print('list:  $list');
      print('gifts: $gifts');
    }
    

    The main() function

    void main() {
      querySelector('#sample_text_id')
        ..text = 'Click me!'
        ..onClick.listen(reverseText);
    }
    
    // Run the app like this: dart args.dart 1 test
    void main(List<String> arguments) {
      print(arguments);
    
      assert(arguments.length == 2);
      assert(int.parse(arguments[0]) == 1);
      assert(arguments[1] == 'test');
    }
    

    Functions as first-class objects

    void printElement(int element) {
      print(element);
    }
    
    var list = [1, 2, 3];
    
    // Pass printElement as a parameter.
    list.forEach(printElement);
    
    var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
    assert(loudify('hello') == '!!! HELLO !!!');
    

    Anonymous functions

    var list = ['apples', 'bananas', 'oranges'];
    list.forEach((item) {
      print('${list.indexOf(item)}: $item');
    });
    
    list.forEach(
        (item) => print('${list.indexOf(item)}: $item'));
    

    Lexical scope

    bool topLevel = true;
    
    void main() {
      var insideMain = true;
    
      void myFunction() {
        var insideFunction = true;
    
        void nestedFunction() {
          var insideNestedFunction = true;
    
          assert(topLevel);
          assert(insideMain);
          assert(insideFunction);
          assert(insideNestedFunction);
        }
      }
    }
    

    Lexical closures

    /// Returns a function that adds [addBy] to the
    /// function's argument.
    Function makeAdder(num addBy) {
      return (num i) => addBy + i;
    }
    
    void main() {
      // Create a function that adds 2.
      var add2 = makeAdder(2);
    
      // Create a function that adds 4.
      var add4 = makeAdder(4);
    
      assert(add2(3) == 5);
      assert(add4(3) == 7);
    }
    

    Testing functions for equality

    void foo() {} // A top-level function
    
    class A {
      static void bar() {} // A static method
      void baz() {} // An instance method
    }
    
    void main() {
      var x;
    
      // Comparing top-level functions.
      x = foo;
      assert(foo == x);
    
      // Comparing static methods.
      x = A.bar;
      assert(A.bar == x);
    
      // Comparing instance methods.
      var v = A(); // Instance #1 of A
      var w = A(); // Instance #2 of A
      var y = w;
      x = w.baz;
    
      // These closures refer to the same instance (#2),
      // so they're equal.
      assert(y.baz == x);
    
      // These closures refer to different instances,
      // so they're unequal.
      assert(v.baz != w.baz);
    }
    

    Return values

    foo() {}
    
    assert(foo() == null);
    

    Operators

    操作符
    a++
    a + b
    a = b
    a == b
    c ? a : b
    a is T
    
    // Parentheses improve readability.
    if ((n % i == 0) && (d % i == 0)) ...
    
    // Harder to read, but equivalent.
    if (n % i == 0 && d % i == 0) ...
    
    assert(2 + 3 == 5);
    assert(2 - 3 == -1);
    assert(2 * 3 == 6);
    assert(5 / 2 == 2.5); // Result is a double
    assert(5 ~/ 2 == 2); // Result is an int
    assert(5 % 2 == 1); // Remainder
    
    assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
    
    var a, b;
    
    a = 0;
    b = ++a; // Increment a before b gets its value.
    assert(a == b); // 1 == 1
    
    a = 0;
    b = a++; // Increment a AFTER b gets its value.
    assert(a != b); // 1 != 0
    
    a = 0;
    b = --a; // Decrement a before b gets its value.
    assert(a == b); // -1 == -1
    
    a = 0;
    b = a--; // Decrement a AFTER b gets its value.
    assert(a != b); // -1 != 0
    
    
    assert(2 == 2);
    assert(2 != 3);
    assert(3 > 2);
    assert(2 < 3);
    assert(3 >= 3);
    assert(2 <= 3);
    
    if (emp is Person) {
      // Type check
      emp.firstName = 'Bob';
    }
    
    (emp as Person).firstName = 'Bob';
    
    // Assign value to a
    a = value;
    // Assign value to b if b is null; otherwise, b stays the same
    b ??= value;
    
    var a = 2; // Assign using =
    a *= 3; // Assign and multiply: a = a * 3
    assert(a == 6);
    
    if (!done && (col == 0 || col == 3)) {
      // ...Do something...
    }
    
    inal value = 0x22;
    final bitmask = 0x0f;
    
    assert((value & bitmask) == 0x02); // AND
    assert((value & ~bitmask) == 0x20); // AND NOT
    assert((value | bitmask) == 0x2f); // OR
    assert((value ^ bitmask) == 0x2d); // XOR
    assert((value << 4) == 0x220); // Shift left
    assert((value >> 4) == 0x02); // Shift right
    
    var visibility = isPublic ? 'public' : 'private';
    
    String playerName(String name) => name ?? 'Guest';
    
    // Slightly longer version uses ?: operator.
    String playerName(String name) => name != null ? name : 'Guest';
    
    // Very long version uses if-else statement.
    String playerName(String name) {
      if (name != null) {
        return name;
      } else {
        return 'Guest';
      }
    }
    
    querySelector('#confirm') // Get an object.
      ..text = 'Confirm' // Use its members.
      ..classes.add('important')
      ..onClick.listen((e) => window.alert('Confirmed!'));
    
    var button = querySelector('#confirm');
    button.text = 'Confirm';
    button.classes.add('important');
    button.onClick.listen((e) => window.alert('Confirmed!'));
    
    final addressBook = (AddressBookBuilder()
          ..name = 'jenny'
          ..email = 'jenny@example.com'
          ..phone = (PhoneNumberBuilder()
                ..number = '415-555-0100'
                ..label = 'home')
              .build())
        .build();
    
    var sb = StringBuffer();
    sb.write('foo')
      ..write('bar'); // Error: method 'write' isn't defined for 'void'.
    
    

    if else

    if (isRaining()) {
      you.bringRainCoat();
    } else if (isSnowing()) {
      you.wearJacket();
    } else {
      car.putTopDown();
    }
    

    for

    var message = StringBuffer('Dart is fun');
    for (var i = 0; i < 5; i++) {
      message.write('!');
    }
    
    var callbacks = [];
    for (var i = 0; i < 2; i++) {
      callbacks.add(() => print(i));
    }
    callbacks.forEach((c) => c());
    
    candidates.forEach((candidate) => candidate.interview());
    
    var collection = [0, 1, 2];
    for (var x in collection) {
      print(x); // 0 1 2
    }
    

    while

    while (!isDone()) {
      doSomething();
    }
    
    do {
      printLine();
    } while (!atEndOfPage());
    

    Break and continue

    while (true) {
      if (shutDownRequested()) break;
      processIncomingRequests();
    }
    
    for (int i = 0; i < candidates.length; i++) {
      var candidate = candidates[i];
      if (candidate.yearsExperience < 5) {
        continue;
      }
      candidate.interview();
    }
    
    candidates
        .where((c) => c.yearsExperience >= 5)
        .forEach((c) => c.interview());
    

    Switch and case

    var command = 'OPEN';
    switch (command) {
      case 'CLOSED':
        executeClosed();
        break;
      case 'PENDING':
        executePending();
        break;
      case 'APPROVED':
        executeApproved();
        break;
      case 'DENIED':
        executeDenied();
        break;
      case 'OPEN':
        executeOpen();
        break;
      default:
        executeUnknown();
    }
    
    var command = 'OPEN';
    switch (command) {
      case 'OPEN':
        executeOpen();
        // ERROR: Missing break
    
      case 'CLOSED':
        executeClosed();
        break;
    }
    
    var command = 'CLOSED';
    switch (command) {
      case 'CLOSED': // Empty case falls through.
      case 'NOW_CLOSED':
        // Runs for both CLOSED and NOW_CLOSED.
        executeNowClosed();
        break;
    }
    
    var command = 'CLOSED';
    switch (command) {
      case 'CLOSED':
        executeClosed();
        continue nowClosed;
      // Continues executing at the nowClosed label.
    
      nowClosed:
      case 'NOW_CLOSED':
        // Runs for both CLOSED and NOW_CLOSED.
        executeNowClosed();
        break;
    }
    
    Assert
    // Make sure the variable has a non-null value.
    assert(text != null);
    
    // Make sure the value is less than 100.
    assert(number < 100);
    
    // Make sure this is an https URL.
    assert(urlString.startsWith('https'));
    
    assert(urlString.startsWith('https'),
        'URL ($urlString) should start with "https".');
    

    Exceptions

    throw FormatException('Expected at least 1 section');
    
    throw 'Out of llamas!';
    
    void distanceTo(Point other) => throw UnimplementedError();
    
    try {
      breedMoreLlamas();
    } on OutOfLlamasException {
      buyMoreLlamas();
    }
    
    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');
    }
    
    try {
      // ···
    } on Exception catch (e) {
      print('Exception details:\n $e');
    } catch (e, s) {
      print('Exception details:\n $e');
      print('Stack trace:\n $s');
    }
    
    void misbehave() {
      try {
        dynamic foo = true;
        print(foo++); // Runtime error
      } catch (e) {
        print('misbehave() partially handled ${e.runtimeType}.');
        rethrow; // Allow callers to see the exception.
      }
    }
    
    void main() {
      try {
        misbehave();
      } catch (e) {
        print('main() finished handling ${e.runtimeType}.');
      }
    }
    
    try {
      breedMoreLlamas();
    } finally {
      // Always clean up, even if an exception is thrown.
      cleanLlamaStalls();
    }
    
    try {
      breedMoreLlamas();
    } catch (e) {
      print('Error: $e'); // Handle the exception first.
    } finally {
      cleanLlamaStalls(); // Then clean up.
    }
    

    Classes

    var p = Point(2, 2);
    
    // Set the value of the instance variable y.
    p.y = 3;
    
    // Get the value of y.
    assert(p.y == 3);
    
    // Invoke distanceTo() on p.
    num distance = p.distanceTo(Point(4, 4));
    
    // If p is non-null, set its y value to 4.
    p?.y = 4;
    
    var p1 = Point(2, 2);
    var p2 = Point.fromJson({'x': 1, 'y': 2});
    
    var p1 = new Point(2, 2);
    var p2 = new Point.fromJson({'x': 1, 'y': 2});
    
    var a = const ImmutablePoint(1, 1);
    var b = const ImmutablePoint(1, 1);
    
    assert(identical(a, b)); // They are the same instance!
    
    // Lots of const keywords here.
    const pointAndLine = const {
      'point': const [const ImmutablePoint(0, 0)],
      'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
    };
    
    // Only one const, which establishes the constant context.
    const pointAndLine = {
      'point': [ImmutablePoint(0, 0)],
      'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
    };
    
    var a = const ImmutablePoint(1, 1); // Creates a constant
    var b = ImmutablePoint(1, 1); // Does NOT create a constant
    
    assert(!identical(a, b)); // NOT the same instance!
    
    print('The type of a is ${a.runtimeType}');
    
    class Point {
      num x; // Declare instance variable x, initially null.
      num y; // Declare y, initially null.
      num z = 0; // Declare z, initially 0.
    }
    
    class Point {
      num x;
      num y;
    }
    
    void main() {
      var point = Point();
      point.x = 4; // Use the setter method for x.
      assert(point.x == 4); // Use the getter method for x.
      assert(point.y == null); // Values default to null.
    }
    
    class Point {
      num x, y;
    
      Point(num x, num y) {
        // There's a better way to do this, stay tuned.
        this.x = x;
        this.y = y;
      }
    }
    
    class Point {
      num x, y;
    
      // Syntactic sugar for setting x and y
      // before the constructor body runs.
      Point(this.x, this.y);
    }
    
    class Point {
      num x, y;
    
      Point(this.x, this.y);
    
      // Named constructor
      Point.origin() {
        x = 0;
        y = 0;
      }
    }
    
    class Employee extends Person {
      Employee() : super.fromJson(getDefaultData());
      // ···
    }
    
    // Initializer list sets instance variables before
    // the constructor body runs.
    Point.fromJson(Map<String, num> json)
        : x = json['x'],
          y = json['y'] {
      print('In Point.fromJson(): ($x, $y)');
    }
    
    Point.withAssert(this.x, this.y) : assert(x >= 0) {
      print('In Point.withAssert(): ($x, $y)');
    }
    
    class Point {
      num x, y;
    
      // The main constructor for this class.
      Point(this.x, this.y);
    
      // Delegates to the main constructor.
      Point.alongXAxis(num x) : this(x, 0);
    }
    
    class ImmutablePoint {
      static final ImmutablePoint origin =
          const ImmutablePoint(0, 0);
    
      final num x, y;
    
      const ImmutablePoint(this.x, this.y);
    }
    
    class Logger {
      final String name;
      bool mute = false;
    
      // _cache is library-private, thanks to
      // the _ in front of its name.
      static final Map<String, Logger> _cache =
          <String, Logger>{};
    
      factory Logger(String name) {
        if (_cache.containsKey(name)) {
          return _cache[name];
        } else {
          final logger = Logger._internal(name);
          _cache[name] = logger;
          return logger;
        }
      }
    
      Logger._internal(this.name);
    
      void log(String msg) {
        if (!mute) print(msg);
      }
    }
    
    var logger = Logger('UI');
    logger.log('Button clicked');
    
    
    import 'dart:math';
    
    class Point {
      num x, y;
    
      Point(this.x, this.y);
    
      num distanceTo(Point other) {
        var dx = x - other.x;
        var dy = y - other.y;
        return sqrt(dx * dx + dy * dy);
      }
    }
    
    
    class Rectangle {
      num left, top, width, height;
    
      Rectangle(this.left, this.top, this.width, this.height);
    
      // Define two calculated properties: right and bottom.
      num get right => left + width;
      set right(num value) => left = value - width;
      num get bottom => top + height;
      set bottom(num value) => top = value - height;
    }
    
    void main() {
      var rect = Rectangle(3, 4, 20, 15);
      assert(rect.left == 3);
      rect.right = 12;
      assert(rect.left == -8);
    }
    

    Abstract methods

    abstract class Doer {
      // Define instance variables and methods...
    
      void doSomething(); // Define an abstract method.
    }
    
    class EffectiveDoer extends Doer {
      void doSomething() {
        // Provide an implementation, so the method is not abstract here...
      }
    }
    

    Abstract classes

    // This class is declared abstract and thus
    // can't be instantiated.
    abstract class AbstractContainer {
      // Define constructors, fields, methods...
    
      void updateChildren(); // Abstract method.
    }
    

    Implicit interfaces

    // A person. The implicit interface contains greet().
    class Person {
      // In the interface, but visible only in this library.
      final _name;
    
      // Not in the interface, since this is a constructor.
      Person(this._name);
    
      // In the interface.
      String greet(String who) => 'Hello, $who. I am $_name.';
    }
    
    // An implementation of the Person interface.
    class Impostor implements Person {
      get _name => '';
    
      String greet(String who) => 'Hi $who. Do you know who I am?';
    }
    
    String greetBob(Person person) => person.greet('Bob');
    
    void main() {
      print(greetBob(Person('Kathy')));
      print(greetBob(Impostor()));
    }
    

    Extending a class

    class Television {
      void turnOn() {
        _illuminateDisplay();
        _activateIrSensor();
      }
      // ···
    }
    
    class SmartTelevision extends Television {
      void turnOn() {
        super.turnOn();
        _bootNetworkInterface();
        _initializeMemory();
        _upgradeApps();
      }
      // ···
    }
    

    Overriding members

    class SmartTelevision extends Television {
      @override
      void turnOn() {...}
      // ···
    }
    

    Overridable operators

    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);
    
      // Operator == and hashCode not shown. For details, see note below.
      // ···
    }
    
    void main() {
      final v = Vector(2, 3);
      final w = Vector(2, 2);
    
      assert(v + w == Vector(4, 5));
      assert(v - w == Vector(0, 1));
    }
    

    noSuchMethod()

    class A {
      // Unless you override noSuchMethod, using a
      // non-existent member results in a NoSuchMethodError.
      @override
      void noSuchMethod(Invocation invocation) {
        print('You tried to use a non-existent member: ' +
            '${invocation.memberName}');
      }
    }
    

    Enumerated types

    enum Color { red, green, blue }
    
    assert(Color.red.index == 0);
    assert(Color.green.index == 1);
    assert(Color.blue.index == 2);
    
    List<Color> colors = Color.values;
    assert(colors[2] == Color.blue);
    
    var aColor = Color.blue;
    
    switch (aColor) {
      case Color.red:
        print('Red as roses!');
        break;
      case Color.green:
        print('Green as grass!');
        break;
      default: // Without this, you see a WARNING.
        print(aColor); // 'Color.blue'
    }
    

    Adding features to a class: mixins

    class Musician extends Performer with Musical {
      // ···
    }
    
    class Maestro extends Person
        with Musical, Aggressive, Demented {
      Maestro(String maestroName) {
        name = maestroName;
        canConduct = true;
      }
    }
    
    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');
        }
      }
    }
    
    mixin MusicalPerformer on Musician {
      // ···
    }
    

    Class variables and methods

    class Queue {
      static const initialCapacity = 16;
      // ···
    }
    
    void main() {
      assert(Queue.initialCapacity == 16);
    }
    
    import 'dart:math';
    
    class Point {
      num x, y;
      Point(this.x, this.y);
    
      static num distanceBetween(Point a, Point b) {
        var dx = a.x - b.x;
        var dy = a.y - b.y;
        return sqrt(dx * dx + dy * dy);
      }
    }
    
    void main() {
      var a = Point(2, 2);
      var b = Point(4, 4);
      var distance = Point.distanceBetween(a, b);
      assert(2.8 < distance && distance < 2.9);
      print(distance);
    }
    

    Generics

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    names.add(42); // Error
    
    abstract class ObjectCache {
      Object getByKey(String key);
      void setByKey(String key, Object value);
    }
    
    abstract class StringCache {
      String getByKey(String key);
      void setByKey(String key, String value);
    }
    
    abstract class Cache<T> {
      T getByKey(String key);
      void setByKey(String key, T value);
    }
    

    Using collection literals

    var names = <String>['Seth', 'Kathy', 'Lars'];
    var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'};
    var pages = <String, String>{
      'index.html': 'Homepage',
      'robots.txt': 'Hints for web robots',
      'humans.txt': 'We are people, not machines'
    };
    

    Using parameterized types with constructors

    var nameSet = Set<String>.from(names);
    var views = Map<int, View>();
    

    Generic collections and the types they contain

    var names = List<String>();
    names.addAll(['Seth', 'Kathy', 'Lars']);
    print(names is List<String>); // true
    

    Restricting the parameterized type

    class Foo<T extends SomeBaseClass> {
      // Implementation goes here...
      String toString() => "Instance of 'Foo<$T>'";
    }
    
    class Extender extends SomeBaseClass {...}
    
    var someBaseClassFoo = Foo<SomeBaseClass>();
    var extenderFoo = Foo<Extender>();
    
    var foo = Foo();
    print(foo); // Instance of 'Foo<SomeBaseClass>'
    
    var foo = Foo<Object>(); // Error
    

    Using generic methods

    T first<T>(List<T> ts) {
      // Do some initial work or error checking, then...
      T tmp = ts[0];
      // Do some additional checking or processing...
      return tmp;
    }
    

    Libraries and visibility

    import 'dart:html';
    import 'package:test/test.dart';
    
    import 'package:lib1/lib1.dart';
    import 'package:lib2/lib2.dart' as lib2;
    
    // Uses Element from lib1.
    Element element1 = Element();
    
    // Uses Element from lib2.
    lib2.Element element2 = lib2.Element();
    
    // Import only foo.
    import 'package:lib1/lib1.dart' show foo;
    
    // Import all names EXCEPT foo.
    import 'package:lib2/lib2.dart' hide foo;
    

    Lazily loading a library

    import 'package:greetings/hello.dart' deferred as hello;
    
    Future greet() async {
      await hello.loadLibrary();
      hello.printGreeting();
    }
    

    Asynchrony support

    Handling Futures

    await lookUpVersion();
    
    Future checkVersion() async {
      var version = await lookUpVersion();
      // Do something with version
    }
    
    try {
      version = await lookUpVersion();
    } catch (e) {
      // React to inability to look up the version
    }
    
    var entrypoint = await findEntrypoint();
    var exitCode = await runExecutable(entrypoint, args);
    await flushThenExit(exitCode);
    
    Future main() async {
      checkVersion();
      print('In main: version is ${await lookUpVersion()}');
    }
    

    Declaring async functions

    String lookUpVersion() => '1.0.0';
    Future<String> lookUpVersion() async => '1.0.0';
    

    Handling Streams

    await for (varOrType identifier in expression) {
      // Executes each time the stream emits a value.
    }
    
    Future main() async {
      // ...
      await for (var request in requestServer) {
        handleRequest(request);
      }
      // ...
    }
    

    Generators

    Iterable<int> naturalsTo(int n) sync* {
      int k = 0;
      while (k < n) yield k++;
    }
    
    Stream<int> asynchronousNaturalsTo(int n) async* {
      int k = 0;
      while (k < n) yield k++;
    }
    
    Iterable<int> naturalsDownFrom(int n) sync* {
      if (n > 0) {
        yield n;
        yield* naturalsDownFrom(n - 1);
      }
    }
    

    Callable classes

    class WannabeFunction {
      call(String a, String b, String c) => '$a $b $c!';
    }
    
    main() {
      var wf = new WannabeFunction();
      var out = wf("Hi","there,","gang");
      print('$out');
    }
    

    Isolates

    Typedefs

    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);
    }
    
    typedef Compare = int Function(Object a, Object b);
    
    class SortedCollection {
      Compare compare;
    
      SortedCollection(this.compare);
    }
    
    // Initial, broken implementation.
    int sort(Object a, Object b) => 0;
    
    void main() {
      SortedCollection coll = SortedCollection(sort);
      assert(coll.compare is Function);
      assert(coll.compare is Compare);
    }
    
    typedef Compare<T> = int Function(T a, T b);
    
    int sort(int a, int b) => a - b;
    
    void main() {
      assert(sort is Compare<int>); // True!
    }
    

    Metadata

    class Television {
      /// _Deprecated: Use [turnOn] instead._
      @deprecated
      void activate() {
        turnOn();
      }
    
      /// Turns the TV's power on.
      void turnOn() {...}
    }
    
    library todo;
    
    class Todo {
      final String who;
      final String what;
    
      const Todo(this.who, this.what);
    }
    
    import 'todo.dart';
    
    @Todo('seth', 'make this do something')
    void doSomething() {
      print('do something');
    }
    

    Comments

    void main() {
      // TODO: refactor into an AbstractLlamaGreetingFactory?
      print('Welcome to my Llama farm!');
    }
    
    void main() {
      /*
       * This is a lot of work. Consider raising chickens.
    
      Llama larry = Llama();
      larry.feed();
      larry.exercise();
      larry.clean();
       */
    }
    

    Documentation comments

    /// A domesticated South American camelid (Lama glama).
    ///
    /// Andean cultures have used llamas as meat and pack
    /// animals since pre-Hispanic times.
    class Llama {
      String name;
    
      /// Feeds your llama [Food].
      ///
      /// The typical llama eats one bale of hay per week.
      void feed(Food food) {
        // ...
      }
    
      /// Exercises your llama with an [activity] for
      /// [timeLimit] minutes.
      void exercise(Activity activity, int timeLimit) {
        // ...
      }
    }
    

    相关文章

      网友评论

          本文标题:Dart语言

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