Flutter #2 | Dart Special
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 {
// ···
}