Einführung in Dart für Java-Entwickler

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

1. Einführung

Dart ist die Programmiersprache von Flutter, dem Toolkit von Google zur Erstellung von UI-Designs für Mobilgeräte, Web-Apps und Desktop-Apps.

In diesem Codelab lernen Sie Dart kennen und konzentrieren sich auf Funktionen, die Java-Entwickler möglicherweise nicht erwarten. Sie können Dart-Funktionen in 1 Minute schreiben, Skripts in 5 Minuten und Apps in 10 Minuten.

Lerninhalte

  • Konstruktoren erstellen
  • Verschiedene Möglichkeiten zur Angabe von Parametern
  • Wann und wie Sie Getter und Setter erstellen
  • Datenschutz bei Dart
  • Fabriken erstellen
  • Funktionsweise der Programmierung in Dart
  • Weitere Dart-Konzepte

Voraussetzungen

Zum Ausführen dieses Codelabs benötigst du nur einen Browser.

Sie schreiben und führen alle Beispiele in DartPad aus, einem interaktiven, browserbasierten Tool zum Spielen mit Dart-Sprachfunktionen und Kernbibliotheken. Sie können aber auch eine IDE verwenden, z. B. WebStorm, IntelliJ mit dem Dart-Plug-in oder Visual Studio Code mit der Dart-Code-Erweiterung.

Was möchten Sie in diesem Codelab lernen?

Ich bin neu im Thema und möchte einen guten Überblick erhalten. Ich kenne mich mit diesem Thema aus, aber ich möchte mir das Wissen noch einmal ansehen. Ich suche nach Beispielcode zur Verwendung in meinem Projekt. Ich suche nach einer Erklärung für etwas Besonderes.

2. Einfache Dart-Kurs erstellen

Sie erstellen zuerst eine einfache Dart-Klasse mit denselben Funktionen wie die Bicycle-Klasse aus der Java-Anleitung. Die Klasse Bicycle enthält einige private Instanzvariablen mit Getter und Setter. Eine main()-Methode instanziiert einen Bicycle und druckt ihn in der Konsole aus.

99c813a1913dcc42 c97a12197358d545

DartPad starten

Dieses Codelab bietet eine neue DartPad-Instanz für jede Reihe von Übungen. Über den Link unten wird eine neue Instanz geöffnet, die ein Standardbeispiel enthält. Sie können DartPad weiterhin im Codelab verwenden. Wenn Sie jedoch auf Zurücksetzen klicken, wird in DartPad Ihre Standardeinstellung wiederhergestellt.

b2f84ff91b0e1396 DatPad öffnen

Fahrradklasse definieren

b2f84ff91b0e1396 Fügen Sie über der Funktion main() eine Klasse Bicycle mit drei Instanzvariablen hinzu. Entfernen Sie außerdem den Inhalt aus main(), wie im folgenden Code-Snippet dargestellt:

class Bicycle {
  int cadence;
  int speed;
  int gear;
}

void main() {
}

konf1e10b838bf60ee.png Beobachtungen

  • In diesem Beispiel gibt das Dart-Analysetool einen Fehler aus, der Sie darüber informiert, dass die Variablen initialisiert werden müssen, da sie nicht null sind. Im nächsten Abschnitt können Sie das Problem beheben.
  • Darts Hauptmethode heißt main(). Wenn Sie Zugriff auf Befehlszeilenargumente benötigen, können Sie sie hinzufügen: main(List<String> args).
  • Die Methode main() befindet sich auf der obersten Ebene. In Dart können Sie Code außerhalb von Klassen definieren. Variablen, Funktionen, Getter und Setter können auch außerhalb von Klassen verwendet werden.
  • Im ursprünglichen Java-Beispiel werden private Instanzvariablen mithilfe des private-Tags deklariert, was Dart nicht verwendet. Weiter unten erfahren Sie mehr zum Thema Datenschutz. Fügen Sie dazu eine schreibgeschützte Variable hinzu."
  • Weder die main() noch Bicycle werden als public deklariert, da alle Kennungen standardmäßig öffentlich sind. Dart hat keine Keywords für public, private oder protected.
  • Für Dart wird ein zweistelliger Einzug statt 4 verwendet. Dank des praktischen Dartformats musst du dir keine Gedanken über Leerzeichen-Konventionen in Dart machen. Gemäß den Konventionen für Dartcodes ( Effective Dart) sind die offiziellen Regeln für die Leerzeichenverarbeitung in Dart jederzeit, was das Dartformat erzeugt."

Fahrradkonstruktor definieren

b2f84ff91b0e1396 Füge der Klasse Bicycle den folgenden Konstruktor hinzu:

Bicycle(this.cadence, this.speed, this.gear);

konf1e10b838bf60ee.png Beobachtungen

  • Dieser Konstruktor hat keinen Text, der in Dart gültig ist.
  • Wenn Sie das Semikolon (;) am Ende eines no-body-Konstruktors vergessen, zeigt DartPad folgenden Fehler an: "Ein Funktionstext muss angegeben werden."
  • Die Verwendung von this in einer Konstruktorliste mit Parametern ist eine praktische Tastenkombination zum Zuweisen von Werten zu Instanzvariablen.
  • Der obige Code entspricht dem folgenden Code mit einer Initialisierungsliste:
Bicycle(int cadence, int speed, int gear)
      : this.cadence = cadence,
        this.speed = speed,
        this.gear = gear;

Code formatieren

Sie können den Dart-Code jederzeit neu formatieren. Klicken Sie dazu oben in DartPad auf Format. Die Neuformatierung ist besonders nützlich, wenn Sie Code in DartPad einfügen und die Begründung deaktiviert ist.

b2f84ff91b0e1396 Klicken Sie auf Format.

Fahrradinstanz instanziieren und drucken

b2f84ff91b0e1396 Fügen Sie der Funktion main() den folgenden Code hinzu:

void main() {
  var bike = new Bicycle(2, 0, 1);
  print(bike);
}

b2f84ff91b0e1396 Entfernen Sie das optionale Keyword new:

var bike = Bicycle(2, 0, 1);

konf1e10b838bf60ee.png Beobachtung

  • Das Keyword new wurde in Dart 2 optional.
  • Wenn du weißt, dass sich ein Wert für eine Variable nicht ändern wird, kannst du final anstelle von var verwenden.
  • Die Funktion print() akzeptiert jedes beliebige Objekt (nicht nur Strings). Sie wird mithilfe der toString()-Methode des Objekts in ein String konvertiert.

Beispiel ausführen

b2f84ff91b0e1396 Führen Sie das Beispiel aus, indem Sie oben im DartPad-Fenster auf Ausführen klicken. Wenn Ausführen aktiviert ist, lesen Sie den Abschnitt Probleme weiter unten auf dieser Seite.

Es sollte folgende Ausgabe angezeigt werden:

Instance of 'Bicycle'

konf1e10b838bf60ee.png Beobachtung

  • Es dürfen keine Fehler oder Warnungen angezeigt werden, die darauf hinweisen, dass die Typinferenz funktioniert und das Analysegerät darauf hinweist, dass die mit var bike = beginnende Anweisung eine Fahrradinstanz definiert.

Ausgabe verbessern

Die Ausgabe von „Case“ für Fahrrad ist zwar korrekt, aber nicht sehr informativ. Alle Dart-Klassen haben die Methode toString(), die Sie überschreiben können, um nützlichere Ergebnisse zu erhalten.

b2f84ff91b0e1396 Fügen Sie die folgende toString()-Methode an einer beliebigen Stelle der Bicycle-Klasse hinzu:

@override
String toString() => 'Bicycle: $speed mph';

konf1e10b838bf60ee.png Beobachtungen

  • Mit der Annotation @override wird dem Analysegerät mitgeteilt, dass Sie ein Mitglied absichtlich überschreiben. Im Analysetool wird ein Fehler ausgegeben, wenn die Überschreibung nicht korrekt durchgeführt werden kann.
  • Dart unterstützt beim Festlegen von Strings einfache oder doppelte Anführungszeichen.
  • Mit der Interpolation von Strings können Sie den Wert eines Ausdrucks in ein String-Literal setzen: ${expression}. Wenn der Ausdruck eine Kennung ist, können Sie die geschweiften Klammern überspringen: $variableName.
  • Einzeilige Funktionen oder Methoden mit Fettpfeil (=>) kürzen.

Beispiel ausführen

b2f84ff91b0e1396 Klicken Sie auf Ausführen.

Es sollte folgende Ausgabe angezeigt werden:

Bicycle: 0 mph

Probleme?Überprüfe deinen Code.

Schreibgeschützte Variable hinzufügen

Im ursprünglichen Java-Beispiel wird speed als schreibgeschützte Variable definiert. Sie wird als „privat“ deklariert und bietet nur einen Getter. Als Nächstes stellen wir Ihnen in Dart dieselben Funktionen zur Verfügung.

b2f84ff91b0e1396 Öffnen Sie bicycle.dart in DartPad (oder verwenden Sie die Kopie weiter).

Wenn Sie eine Dart-Kennung für ihre Bibliothek als „privat“ kennzeichnen möchten, beginnen Sie ihren Namen mit einem Unterstrich (_). Sie können speed in schreibgeschützt konvertieren, indem Sie den Namen ändern und einen Getter hinzufügen.

Geschwindigkeit einer privaten, schreibgeschützten Instanzvariablen festlegen

b2f84ff91b0e1396 Entfernen Sie im Bicycle-Konstruktor den Parameter speed:

Bicycle(this.cadence, this.gear);

b2f84ff91b0e1396 Entfernen Sie in main() den zweiten (speed) Parameter aus dem Aufruf beim Bicycle-Konstruktor:

var bike = Bicycle(2, 1);

b2f84ff91b0e1396 Ändern Sie die vorhandenen Termine von speed in _speed. (Zwei Orte)

b2f84ff91b0e1396 initialisieren Sie _speed auf 0:

int _speed = 0;

b2f84ff91b0e1396 Fügen Sie der Klasse Bicycle den folgenden Getter hinzu:

int get speed => _speed;

konf1e10b838bf60ee.png Beobachtungen

  • Jede Variable (auch wenn sie eine Zahl ist) muss entweder initialisiert oder als nulldeklarierbar sein, indem ? zur Typdeklaration hinzugefügt wird.
  • Der Dart-Compiler erzwingt den Datenschutz für Bibliotheksbibliotheken für jede ID mit vorangestelltem Unterstrich. Datenschutz in der Bibliothek bedeutet im Allgemeinen, dass die ID nur in der Datei sichtbar ist (nicht nur in der Klasse), in der die ID definiert ist.
  • Standardmäßig bietet Dart implizite Getter und Setter für alle öffentlichen Instanzvariablen. Sie müssen Ihre eigenen Getter oder Setter nicht definieren, es sei denn, Sie möchten schreibgeschützte oder schreibgeschützte Variablen erzwingen, einen Wert berechnen oder bestätigen oder einen Wert an einer anderen Stelle aktualisieren.
  • Die Java-Originalprobe enthält Getter und Setter für cadence und gear. Für diese Dart-Stichprobe sind keine expliziten Getter und Setter erforderlich, weshalb nur Instanzvariablen verwendet werden.
  • Sie können mit einem einfachen Feld wie bike.cadence beginnen und es später so ändern, dass Getter und Setter verwendet werden. Die API bleibt unverändert. Mit anderen Worten: Beim Wechsel von einem Feld zum Getter und Setter ist bei Dart keine funktionsgefährdende Änderung möglich.

Implementierung der Geschwindigkeit als schreibgeschützte Instanzvariable abschließen

b2f84ff91b0e1396 Füge der Klasse Bicycle die folgenden Methoden hinzu:

void applyBrake(int decrement) {
  _speed -= decrement;
}

void speedUp(int increment) {
  _speed += increment;
}

Das endgültige Dart-Beispiel ähnelt dem ursprünglichen Java, ist jedoch mit 23 Zeilen kompakter als 40 Zeichen:

class Bicycle {
  int cadence;
  int _speed = 0;
  int get speed => _speed;
  int gear;

  Bicycle(this.cadence, this.gear);

  void applyBrake(int decrement) {
    _speed -= decrement;
  }

  void speedUp(int increment) {
    _speed += increment;
  }

  @override
  String toString() => 'Bicycle: $_speed mph';
}

void main() {
  var bike = Bicycle(2, 1);
  print(bike);
}

Probleme?Überprüfe deinen Code.

3. Optionale Parameter verwenden (statt Überlastung)

In der nächsten Übung wird eine Rectangle-Klasse definiert, ein weiteres Beispiel aus der Java-Anleitung.

Der Java-Code zeigt überlastende Konstruktoren. Dies ist eine gängige Methode in Java, bei der Konstruktoren denselben Namen haben, sich aber in der Anzahl oder Art der Parameter unterscheiden. Dart unterstützt keine Überlastung von Konstruktoren und behandelt diese Situation anders, wie Sie in diesem Abschnitt sehen.

b2f84ff91b0e1396 Öffnen Sie das Rectangle-Beispiel in DartPad.

Rechteck-Konstruktor hinzufügen

b2f84ff91b0e1396 Fügen Sie einen einzigen leeren Konstruktor hinzu, der alle vier Konstruktoren im Java-Beispiel ersetzt:

Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});

Dieser Konstruktor verwendet optionale benannte Parameter.

konf1e10b838bf60ee.png Beobachtungen

  • this.origin, this.width und this.height nutzen den Kurzbefehl zum Zuweisen von Instanzvariablen innerhalb einer Konstruktordeklaration.
  • this.origin, this.width und this.height sind optionale benannte Parameter. Benannte Parameter werden in geschweifte Klammern ({}) gesetzt.
  • Die Syntax this.origin = const Point(0, 0) gibt den Standardwert Point(0,0) für die Instanzvariable origin an. Der angegebene Standardwert muss eine Konstante für die Kompilierdauer sein. Dieser Konstruktor stellt Standardwerte für alle drei Instanzvariablen bereit.

Ausgabe verbessern

b2f84ff91b0e1396 Fügen Sie der Klasse Rectangle die folgende toString()-Funktion hinzu:

@override
String toString() =>
      'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';

Konstruktor verwenden

b2f84ff91b0e1396 Ersetzen Sie main() durch den folgenden Code, um zu bestätigen, dass Sie Rectangle nur mit den von Ihnen benötigten Parametern instanziieren können:

main() {
  print(Rectangle(origin: const Point(10, 20), width: 100, height: 200));
  print(Rectangle(origin: const Point(10, 10)));
  print(Rectangle(width: 200));
  print(Rectangle());
}

konf1e10b838bf60ee.png Beobachtung

  • Der Dart-Konstruktor für Rectangle ist eine Codezeile, verglichen mit 16 Codezeilen für gleichwertige Konstruktoren in der Java-Version.

Beispiel ausführen

Es sollte folgende Ausgabe angezeigt werden:

Origin: (10, 20), width: 100, height: 200
Origin: (10, 10), width: 0, height: 0
Origin: (0, 0), width: 200, height: 0
Origin: (0, 0), width: 0, height: 0

Probleme?Überprüfe deinen Code.

4. Fabrik erstellen

Factorys haben ein häufig verwendetes Designmuster in Java und bieten mehrere Vorteile gegenüber einer direkten Objektinstanz. Sie können zum Beispiel die Details der Instanziierung ausblenden und den Untertyp des Factory-Objekts zurückgeben und optional ein vorhandenes Objekt statt eines neuen Objekts zurückgeben.

In diesem Schritt werden zwei Möglichkeiten zum Implementieren einer Factory zum Erstellen von Formen gezeigt:

  • Option 1: Funktion auf oberster Ebene erstellen
  • Option 2: Factory-Konstruktor erstellen.

Für diese Übung verwenden Sie das Shapes-Beispiel, bei dem Formen instanziiert und der berechnete Bereich gedruckt wird:

import 'dart:math';

abstract class Shape {
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}

main() {
  final circle = Circle(2);
  final square = Square(2);
  print(circle.area);
  print(square.area);
}

b2f84ff91b0e1396 Beispiel für Formen in DartPad öffnen

Im Konsolenbereich sollten Sie die berechneten Bereiche eines Kreises und eines Quadrats sehen:

12.566370614359172
4

konf1e10b838bf60ee.png Beobachtungen

  • Dart unterstützt abstrakte Klassen.
  • Sie können in einer Datei mehrere Klassen definieren.
  • dart:math ist eine der Hauptbibliotheken von Dart. Zu den weiteren Bibliotheken gehören dart:core, dart:async, dart:convert und dart:collection.
  • Konventioniert wird die Konstante einer Dartbibliothek mit lowerCamelCase (z. B. pi statt PI)). Die Hintergründe können Sie auch nachlesen, wenn Sie sich für die Begründung interessieren: PREFER bei Verwendung von konstanten Namen für Kleinschreibung
  • Der folgende Code zeigt zwei Getter, die einen Wert berechnen: num get area => pi * pow(radius, 2); // Circle num get area => pow(side, 2); // Square

Option 1: Funktion auf oberster Ebene erstellen

b2f84ff91b0e1396 Implementieren Sie eine Factory als Top-Level-Funktion, indem Sie die folgende Funktion auf der höchsten Ebene (außerhalb der Klasse) hinzufügen:

Shape shapeFactory(String type) {
  if (type == 'circle') return Circle(2);
  if (type == 'square') return Square(2);
  throw 'Can\'t create $type.';
}

b2f84ff91b0e1396 Rufen Sie die Factory-Funktion auf, indem Sie die ersten beiden Zeilen in der main()-Methode ersetzen:

  final circle = shapeFactory('circle');
  final square = shapeFactory('square');

Beispiel ausführen

Die Ausgabe sollte wie gewohnt aussehen.

konf1e10b838bf60ee.png Beobachtungen

  • Wenn die Funktion mit einem anderen String als 'circle' oder 'square' aufgerufen wird, wird eine Ausnahme ausgelöst.
  • Im Dart SDK werden Klassen für viele gängige Ausnahmen definiert. Sie können die Klasse Exception aber auch implementieren, um spezifischere Ausnahmen zu erstellen. Alternativ können Sie einen String ausgeben, der das Problem beschreibt.
  • Wenn eine Ausnahme auftritt, meldet DartPad Uncaught. Sie können sich hilfreiche Informationen anzeigen lassen, indem Sie den Code in einer try-catch-Anweisung zusammenfassen und die Ausnahme drucken. Optional können Sie sich das Beispiel für DartPad ansehen.
  • Wenn Sie ein einzelnes Anführungszeichen in einem String verwenden möchten, maskieren Sie es entweder mit dem Schrägstrich ('Can\'t create $type.') oder geben Sie den String mit doppelten Anführungszeichen ("Can't create $type.") an.

Probleme?Überprüfe deinen Code.

Option 2: Factory-Konstruktor erstellen

Verwenden Sie das Keyword factory von Dart, um einen Factory-Konstruktor zu erstellen.

b2f84ff91b0e1396 Füge der abstrakten Klasse Shape einen Factory-Konstruktor hinzu:

abstract class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\'t create $type.';
  }
  num get area;
}

b2f84ff91b0e1396 Ersetzen Sie die ersten beiden Zeilen von main() durch den folgenden Code zum Instanziieren der Formen:

  final circle = Shape('circle');
  final square = Shape('square');

b2f84ff91b0e1396 Löschen Sie die zuvor hinzugefügte shapeFactory()-Funktion.

konf1e10b838bf60ee.png Beobachtung

  • Der Code im Factory-Konstruktor ist mit dem in der Funktion shapeFactory() verwendeten Code identisch.

Probleme?Überprüfe deinen Code.

5. Benutzeroberfläche implementieren

Die Dart-Sprache enthält kein interface-Keyword, da jede Klasse eine Schnittstelle definiert.

b2f84ff91b0e1396 Öffnen Sie das Formenbeispiel in DartPad (oder verwenden Sie die Kopie weiter).

b2f84ff91b0e1396 Füge eine CircleMock-Klasse hinzu, mit der die Schnittstelle Circle implementiert wird:

class CircleMock implements Circle {}

b2f84ff91b0e1396 Es sollte der Fehler „Fehlende konkrete Implementierung“ angezeigt werden, da CircleMock die Implementierung von Circle nicht übernimmt – sie verwendet nur ihre Schnittstelle. Definieren Sie die Instanzvariablen area und radius, um diesen Fehler zu beheben:

class CircleMock implements Circle {
  num area = 0;
  num radius = 0;
}

konf1e10b838bf60ee.png Beobachtung

  • Obwohl die Klasse CircleMock keine Verhaltensweisen definiert, ist sie doch ein gültiger Dart – der Analysetools gibt keine Fehler aus.
  • Die areaInstanzvariable CircleMock implementiert den area Getter von Circle.

Probleme?Überprüfe deinen Code.

6. Dart für funktionale Programmierung verwenden

In der funktionalen Programmierung können Sie zum Beispiel Folgendes tun:

  • Funktionen als Argumente übergeben
  • Weisen Sie einer Variablen eine Funktion zu.
  • Rekonstruieren Sie eine Funktion, die mehrere Argumente in eine Sequenz von Funktionen einnimmt, die jeweils ein einzelnes Argument (auch als curry bezeichnet) annehmen.
  • Erstellen Sie eine namenlose Funktion, die als Konstante verwendet werden kann (auch als Lambda-Ausdruck bezeichnet). Lambda-Ausdrücke wurden in der Version Release 8 zu Java hinzugefügt.

Dart unterstützt all diese Funktionen. In Dart sind auch Funktionen Objekte und der Typ Function. Das bedeutet, dass Funktionen Variablen zugewiesen oder als Argumente an andere Funktionen übergeben werden können. Sie können auch eine Instanz einer Dart-Klasse aufrufen, als wäre es eine Funktion, wie in diesem Beispiel.

Im folgenden Beispiel wird ein imperativer Code (nicht der funktionale Stil) verwendet:

String scream(int length) => "A${'a' * length}h!";

main() {
  final values = [1, 2, 3, 5, 10, 50];
  for (var length in values) {
    print(scream(length));
  }
}

b2f84ff91b0e1396 „Scream“-Beispiel in DartPad öffnen:

Die Ausgabe sollte in etwa so aussehen:

Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!

konf1e10b838bf60ee.png Beobachtung

  • Bei der Verwendung von String-Interpolation wird der String ${'a' * length} mit &das Zeichen 'a' wiederholt length Mal ausgewertet.

Impliziten Code in funktionale Funktionsweise konvertieren

b2f84ff91b0e1396 Entfernen Sie die imperative for() {...}-Schleife in main() und ersetzen Sie sie durch eine einzelne Codezeile, die die Methodenverkettung verwendet:

  values.map(scream).forEach(print);

Beispiel ausführen

Der funktionale Ansatz druckt dieselben sechs Schreie aus wie das Imperativbeispiel.

Probleme?Überprüfe deinen Code.

Weitere Iterationsfunktionen verwenden

Die Kernklassen List und Iterable unterstützen fold(), where(), join(), skip() und mehr. Dart bietet außerdem Unterstützung für Karten und Sets.

b2f84ff91b0e1396 Ersetzen Sie die Zeile values.map() in main() folgendermaßen:

  values.skip(1).take(3).map(scream).forEach(print);

Beispiel ausführen

Die Ausgabe sollte in etwa so aussehen:

Aaah!
Aaaah!
Aaaaaah!

konf1e10b838bf60ee.png Beobachtungen

  • skip(1)überspringt den ersten Wert 1 im Listenliteral values.
  • take(3) Ruft die nächsten 3 Werte (2, 3 und 5) im Listenliteral values ab.
  • Die restlichen Werte werden übersprungen.

Probleme?Überprüfe deinen Code.

7. Glückwunsch!

Mithilfe dieses Codelabs hast du einige Unterschiede in Java und Dart gelernt. Dart ist einfach zu erlernen. Außerdem sorgen die Kernbibliotheken und das umfassende verfügbare Paket dafür, dass du noch produktiver bist. Dart lässt sich problemlos in große Apps skalieren. Hunderte von Google-Entwicklern nutzen Dart, um geschäftskritische Apps zu entwickeln, die den Großteil der Umsätze von Google generieren.

Weitere Informationen

Ein 20-minütiges Codelab ist nicht lang genug, um alle Unterschiede zwischen Java und Dart zu zeigen. In diesem Codelab wurden beispielsweise folgende Themen behandelt:

Wenn Sie Dart-Technologien in Aktion sehen möchten, probieren Sie die Flutter-Codelabs aus.

Weitere Informationen

In den folgenden Artikeln, Ressourcen und Websites erfahren Sie mehr über Dart.

Artikel

Ressourcen

Websites