Flutter #2 | Dart Special

Last modified date

Comments: 0

Eine Sammlung von Dart Sprachfeatures. Zum Ausprobieren und noch mehr Informationen kann das Dart Cheatsheet codelab benutzt werden. https://dart.dev/codelabs/dart-cheatsheet




Jede App muss genau eine main() Funktion haben als Einstiegspunkt


Alles ist ein Objekt


Alles was nicht initialisiert wird hat den default Wert null

int lineCount;
assert(lineCount == null);


Final muss einmal im Konstruktor gesetzt werden, Const ist unveränderlich

class Person {
  final name;
  static const String prefix = "Name: ";

  Person(this.name);
}


Es gibt nur int und double


Strings können mit + oder mit Line Breaks, aneinander gehängt werden

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.');


Mit Triple Quotes können Multiline-String erzeugt werden

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";


Raw Strings können mir dem prefix r erstellt werden

var s = r'In a raw string, not even \n gets special treatment.';


Mit dem Spread Operator (…) können mehrere Elemente zu einer Liste hinzugefügt werden. Zusätzlich ist es möglich eine Nullabfrage zu machen.

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);


For und If können in Listen benutzt werden

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');


Funktionen sind auch Objekte


Funktionen können optionale und benötigte Parameter haben. Optionale Parameter können dabei named oder positional sein

//optional
void enableFlags(bool bold, bool hidden) {...}

//named optional
void enableFlags({bool bold, bool hidden}) {...}

enableFlags(bold: true, hidden: false);

//named required
void enableFlags({@required bool bold, bool hidden}) {...}

//optional positional 
String say(String from, String msg, [String device]) {...}


Funktionen können eine Funktion als Parameter übergeben bekommen

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);


Assign operators können bei Null einen Wert zuweisen

// Assign value to b if b is null; otherwise, b stays the same
b ??= value;


Cascade Notation erlaubt eine Reihe von Operationen auf dem gleichen Objekt zu machen

querySelector('#confirm') // Get an object.
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

//equivalent to this 
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

//nested cascades are also possible
final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();


Assert kann während der Entwicklung genutzt werden, um die Ausführung von Code zu unterbrechen, falls eine Überprüfung fehlschlägt

// 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'));


Exceptions können mit einem oder zwei Parameter gefangen werden, der zweite Parameter enthält den Stacktrace

try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}


Konstruktoren können vereinfacht dargestellt werden

class Point {
  num x, y;

  // Syntactic sugar for setting x and y
  // before the constructor body runs.
  Point(this.x, this.y);
}


Es gibt named Konstruktoren

class Point {
  num x, y;

  Point(this.x, this.y);

  // Named constructor
  Point.origin() {
    x = 0;
    y = 0;
  }
}


Variablen können über eine initializer list initialisiert werden

// 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)');
}


Assert kann auch mit Konstruktoren benutzt werden

Point.withAssert(this.x, this.y) : assert(x >= 0) {
  print('In Point.withAssert(): ($x, $y)');
}


Mit Mixins können Features zu einer Klasse hinzugefügt werden

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');
    }
  }
}


Mixins können so erstellt werden, dass sie nur von bestimmten Typen genutzt werden können

mixin MusicalPerformer on Musician {
  // ···
}

Share

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Post comment

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.