Dart-Programmierung - Kurzanleitung

Dart ist eine objektorientierte Sprache mit C-Syntax, die optional in JavaScript kompiliert werden kann. Es unterstützt eine Vielzahl von Programmierhilfen wie Schnittstellen, Klassen, Sammlungen, Generika und optionale Eingabe.

Dart kann häufig zum Erstellen von Anwendungen mit nur einer Seite verwendet werden. Einseitige Anwendungen gelten nur für Websites und Webanwendungen. Einseitige Anwendungen ermöglichen die Navigation zwischen verschiedenen Bildschirmen der Website, ohne dass eine andere Webseite in den Browser geladen werden muss. Ein klassisches Beispiel istGMail ─ Wenn Sie auf eine Nachricht in Ihrem Posteingang klicken, bleibt der Browser auf derselben Webseite, aber JavaScript-Code verbirgt den Posteingang und bringt den Nachrichtentext auf den Bildschirm.

Google hat einen speziellen Build von veröffentlicht Chromium - das Dart VM. Die Verwendung von Dartium bedeutet, dass Sie Ihren Code erst dann in JavaScript kompilieren müssen, wenn Sie bereit sind, ihn in anderen Browsern zu testen.

In der folgenden Tabelle werden die Funktionen von Dart und JavaScript verglichen.

Merkmal Pfeil JavaScript
Typ System Optional, dynamisch Schwach, dynamisch
Klassen Ja, Einzelvererbung Prototypisch
Schnittstellen Ja, mehrere Schnittstellen Nein
Parallelität Ja, mit Isolaten Ja, mit HTML5-Webarbeitern

Dieses Tutorial vermittelt ein grundlegendes Verständnis der Programmiersprache Dart.

In diesem Kapitel wird das Einrichten der Ausführungsumgebung für Dart auf der Windows-Plattform erläutert.

Skript online mit DartPad ausführen

Sie können Ihre Skripte online testen, indem Sie den Online-Editor unter verwenden https://dartpad.dartlang.org/. Der Dart-Editor führt das Skript aus und zeigt sowohl HTML- als auch Konsolenausgabe an. Der Online-Editor wird mit einer Reihe voreingestellter Codebeispiele geliefert.

Ein Screenshot der Dartpad Editor ist unten angegeben -

Dartpad ermöglicht auch eine restriktivere Codierung. Dies kann durch Aktivieren der Option Starker Modus unten rechts im Editor erreicht werden. Starker Modus hilft bei -

  • Stärkere statische und dynamische Prüfung
  • Idiomatische JavaScript-Codegenerierung für bessere Interoperabilität.

Sie können das folgende Beispiel mit Dartpad ausprobieren

void main() { 
   print('hello world'); 
}

Der Code zeigt die folgende Ausgabe an

hello world

Einrichten der lokalen Umgebung

In diesem Abschnitt erfahren Sie, wie Sie die lokale Umgebung einrichten.

Verwenden des Texteditors

Beispiele für einige Editoren sind Windows Notepad, Notepad ++, Emacs, vim oder vi usw. Die Editoren können von Betriebssystem zu Betriebssystem unterschiedlich sein. Die Quelldateien werden normalerweise mit der Erweiterung ".dart" benannt.

Installieren des Dart SDK

Die aktuelle stabile Version von Dart ist 1.21.0. Dasdart sdk kann heruntergeladen werden von -

  • https://www.dartlang.org/install/archive

  • http://www.gekorm.com/dart-windows/

Ein Screenshot der Dart SDK-Installation ist unten angegeben -

Setzen Sie nach Abschluss der SDK-Installation die Umgebungsvariable PATH auf -

<dart-sdk-path>\bin

Überprüfen der Installation

Um zu überprüfen, ob Dart erfolgreich installiert wurde, öffnen Sie die Eingabeaufforderung und geben Sie den folgenden Befehl ein:

Dart

Wenn die Installation erfolgreich ist, wird die Dart-Laufzeit angezeigt.

IDE-Unterstützung

Eine Vielzahl von IDEs unterstützen Skripte in Dart. Beispiele beinhaltenEclipse, IntelliJ, und WebStorm von Jet Gehirnen.

Im Folgenden sind die Schritte zum Konfigurieren der Dart-Umgebung mit aufgeführt WebStrom IDE.

WebStorm installieren

Die Installationsdatei für WebStorm kann von heruntergeladen werden https://www.jetbrains.com/webstorm/download/#section=windows-version.

Die WebStorm-Installationsdatei ist für Mac OS, Windows und Linux verfügbar.

Führen Sie nach dem Herunterladen der Installationsdateien die folgenden Schritte aus:

  • Installieren Sie das Dart SDK: Befolgen Sie die oben aufgeführten Schritte

  • Erstellen Sie ein neues Dart-Projekt und konfigurieren Sie die Dart-Unterstützung

  • Um ein neues Dart-Projekt zu erstellen,

    • Klicken Create New Project vom Begrüßungsbildschirm

    • Klicken Sie im nächsten Dialogfeld auf Dart

  • Wenn für das kein Wert angegeben ist Dart SDKPfad, und geben Sie dann den SDK-Pfad an. Beispielsweise kann der SDK-Pfad sein<dart installation directory>/dart/dartsdk.

Fügen Sie dem Projekt eine Dartdatei hinzu

So fügen Sie dem Projekt eine Dart-Datei hinzu:

  • Klicken Sie mit der rechten Maustaste auf das Projekt
  • Neu → Dartdatei
  • Geben Sie den Namen des Dart-Skripts ein

Ein Screenshot des WebStorm-Editors ist unten dargestellt -

Das dart2js Tool

Das dart2jsTool kompiliert Dart-Code in JavaScript. Durch das Kompilieren von Dart-Code in JS kann das Dart-Skript in Browsern ausgeführt werden, die die Dart-VM nicht unterstützen.

Das Tool dart2js wird als Teil des Dart SDK ausgeliefert und befindet sich im /dartsdk/bin folder.

Geben Sie den folgenden Befehl in das Terminal ein, um Dart in JavaScript zu kompilieren

dart2js - - out = <output_file>.js  <dart_script>.dart

Dieser Befehl erzeugt eine Datei, die das JavaScript-Äquivalent Ihres Dart-Codes enthält. Ein vollständiges Tutorial zur Verwendung dieses Dienstprogramms finden Sie auf der offiziellen Dart-Website.

Die Syntax definiert eine Reihe von Regeln zum Schreiben von Programmen. Jede Sprachspezifikation definiert ihre eigene Syntax. Ein Dart-Programm besteht aus -

  • Variablen und Operatoren
  • Classes
  • Functions
  • Ausdrücke und Programmierkonstrukte
  • Entscheidungsfindungs- und Schleifenkonstrukte
  • Comments
  • Bibliotheken und Pakete
  • Typedefs
  • Datenstrukturen als Sammlungen / Generika dargestellt

Dein erster Dartcode

Beginnen wir mit dem traditionellen Beispiel „Hallo Welt“ -

main() { 
   print("Hello World!"); 
}

Das main()Funktion ist eine vordefinierte Methode in Dart. Diese Methode fungiert als Einstiegspunkt für die Anwendung. Ein Dart-Skript benötigt diemain() Methode zur Ausführung. print() ist eine vordefinierte Funktion, die die angegebene Zeichenfolge oder den angegebenen Wert an die Standardausgabe, dh das Terminal, druckt.

Die Ausgabe des obigen Codes lautet -

Hello World!

Führen Sie ein Dart-Programm aus

Sie können ein Dart-Programm auf zwei Arten ausführen:

  • Über das Terminal
  • Über die WebStorm-IDE

Über das Terminal

So führen Sie ein Dart-Programm über das Terminal aus:

  • Navigieren Sie zum Pfad des aktuellen Projekts
  • Geben Sie den folgenden Befehl in das Terminalfenster ein
dart file_name.dart

Über die WebStorm-IDE

So führen Sie ein Dart-Programm über die WebStorm-IDE aus:

  • Klicken Sie in der IDE mit der rechten Maustaste auf die Dart-Skriptdatei. (Die Datei sollte die enthaltenmain() Funktion zur Aktivierung der Ausführung)

  • Klick auf das ‘Run <file_name>’Möglichkeit. Ein Screenshot davon ist unten angegeben -

Sie können alternativ auf die

Schaltfläche klicken oder die Verknüpfung verwendenCtrl+Shift+F10 um das Dart-Skript auszuführen.

Dart-Befehlszeilenoptionen

Dart-Befehlszeilenoptionen werden verwendet, um die Ausführung des Dart-Skripts zu ändern. Zu den allgemeinen Befehlszeilenoptionen für Dart gehören:

Sr.Nr. Befehlszeilenoption & Beschreibung
1 -c or --c

Aktiviert sowohl Zusicherungen als auch Typprüfungen (aktivierter Modus).

2 --version

Zeigt Informationen zur VM-Version an.

3 --packages <path>

Gibt den Pfad zur Konfigurationsdatei für die Paketauflösung an.

4 -p <path>

Gibt an, wo importierte Bibliotheken zu finden sind. Diese Option kann nicht mit --packages verwendet werden.

5 -h or --help

Zeigt Hilfe an.

Aktivierten Modus aktivieren

Dart-Programme laufen in zwei Modi, nämlich -

  • Überprüfter Modus
  • Produktionsmodus (Standard)

Es wird empfohlen, die Dart-VM in auszuführen checked modewährend der Entwicklung und des Testens, da es Warnungen und Fehler hinzufügt, um den Entwicklungs- und Debugging-Prozess zu unterstützen. Der aktivierte Modus erzwingt verschiedene Überprüfungen wie Typprüfung usw. Um den aktivierten Modus zu aktivieren, fügen Sie beim Ausführen des Skripts vor dem Namen der Skriptdatei die Option -c oder –-checked hinzu.

Um jedoch einen Leistungsvorteil beim Ausführen des Skripts sicherzustellen, wird empfohlen, das Skript im auszuführen production mode.

Folgendes berücksichtigen Test.dart Skriptdatei -

void main() { 
   int n = "hello"; 
   print(n); 
}

Führen Sie das Skript aus, indem Sie - eingeben

dart Test.dart

Obwohl eine Typinkongruenz vorliegt, wird das Skript erfolgreich ausgeführt, wenn der aktivierte Modus deaktiviert wird. Das Skript führt zu folgender Ausgabe:

hello

Versuchen Sie nun, das Skript mit der Option "- - markiert" oder "-c" auszuführen.

dart -c Test.dart

Oder,

dart - - checked Test.dart

Die Dart-VM gibt einen Fehler aus, der besagt, dass eine Typinkongruenz vorliegt.

Unhandled exception: 
type 'String' is not a subtype of type 'int' of 'n' where 
   String is from dart:core 
   int is from dart:core 
#0  main (file:///C:/Users/Administrator/Desktop/test.dart:3:9) 
#1  _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart :261) 
#2  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

Kennungen in Dart

Bezeichner sind Namen, die Elementen in einem Programm wie Variablen, Funktionen usw. gegeben werden. Die Regeln für Bezeichner sind -

Bezeichner können sowohl Zeichen als auch Ziffern enthalten. Die Kennung kann jedoch nicht mit einer Ziffer beginnen.

  • Bezeichner dürfen keine speziellen Symbole enthalten, außer Unterstrich (_) oder Dollarzeichen ($).

  • Bezeichner können keine Schlüsselwörter sein.

  • Sie müssen einzigartig sein.

  • Bezeichner unterscheiden zwischen Groß- und Kleinschreibung.

  • Bezeichner dürfen keine Leerzeichen enthalten.

In den folgenden Tabellen sind einige Beispiele für gültige und ungültige Bezeichner aufgeführt.

Gültige Bezeichner Ungültige Bezeichner
Vorname Var
Vorname Vorname
num1 Vorname
$ Ergebnis 1Nummer

Schlüsselwörter in Dart

Schlüsselwörter haben im Kontext einer Sprache eine besondere Bedeutung. In der folgenden Tabelle sind einige Schlüsselwörter in Dart aufgeführt.

Zusammenfassung 1 fortsetzen falsch Neu diese
als 1 Standard Finale Null werfen
behaupten aufgeschoben 1 schließlich Betreiber 1 wahr
asynchron 2 tun zum Teil 1 Versuchen
asynchron * 2 dynamisch 1 bekomme 1 neu werfen typedef 1
warte 2 sonst wenn Rückkehr var
Unterbrechung Aufzählung implementiert 1 Set 1 Leere
Fall Export 1 Import 1 statisch 1 während
Fang extern 1 im Super mit
Klasse erweitert ist Schalter Ausbeute 2
const Fabrik 1 Bibliothek 1 synchronisieren * 2 Ausbeute * 2

Leerzeichen und Zeilenumbrüche

Dart ignoriert Leerzeichen, Tabulatoren und Zeilenumbrüche, die in Programmen angezeigt werden. Sie können Leerzeichen, Tabulatoren und Zeilenumbrüche in Ihrem Programm frei verwenden und Ihre Programme frei und ordentlich formatieren und einrücken, sodass der Code leicht zu lesen und zu verstehen ist.

Dart unterscheidet zwischen Groß- und Kleinschreibung

Dart unterscheidet zwischen Groß- und Kleinschreibung. Dies bedeutet, dass Dart zwischen Groß- und Kleinbuchstaben unterscheidet.

Anweisungen enden mit einem Semikolon

Jede Anweisungszeile wird als Anweisung bezeichnet. Jede Dart-Anweisung muss mit einem Semikolon (;) enden. Eine einzelne Zeile kann mehrere Anweisungen enthalten. Diese Anweisungen müssen jedoch durch ein Semikolon getrennt werden.

Kommentare in Dart

Kommentare sind eine Möglichkeit, die Lesbarkeit eines Programms zu verbessern. Kommentare können verwendet werden, um zusätzliche Informationen zu einem Programm wie den Autor des Codes, Hinweise zu einer Funktion / einem Konstrukt usw. aufzunehmen. Kommentare werden vom Compiler ignoriert.

Dart unterstützt die folgenden Arten von Kommentaren:

  • Single-line comments ( // ) - Jeder Text zwischen einem "//" und dem Ende einer Zeile wird als Kommentar behandelt

  • Multi-line comments (/* */) - Diese Kommentare können mehrere Zeilen umfassen.

Beispiel

// this is single line comment  
  
/* This is a   
   Multi-line comment  
*/

Objektorientierte Programmierung in Dart

Dart ist eine objektorientierte Sprache. Objektorientierung ist ein Softwareentwicklungsparadigma, das der realen Modellierung folgt. Die Objektorientierung betrachtet ein Programm als eine Sammlung von Objekten, die über einen als Methoden bezeichneten Mechanismus miteinander kommunizieren.

  • Object- Ein Objekt ist eine Echtzeitdarstellung einer Entität. Gemäß Grady Brooch muss jedes Objekt drei Merkmale aufweisen -

    • State - beschrieben durch die Attribute eines Objekts.

    • Behavior - beschreibt, wie sich das Objekt verhält.

    • Identity - Ein eindeutiger Wert, der ein Objekt von einer Reihe ähnlicher solcher Objekte unterscheidet.

  • Class- Eine Klasse in Bezug auf OOP ist eine Blaupause zum Erstellen von Objekten. Eine Klasse kapselt Daten für das Objekt.

  • Method - Methoden erleichtern die Kommunikation zwischen Objekten.

Beispiel: Pfeil- und Objektorientierung

class TestClass {   
   void disp() {     
      print("Hello World"); 
   } 
}  
void main() {   
   TestClass c = new TestClass();   
   c.disp();  
}

Das obige Beispiel definiert eine Klasse TestClass. Die Klasse hat eine Methodedisp(). Die Methode druckt die Zeichenfolge "Hello World" auf dem Terminal. Das neue Schlüsselwort erstellt ein Objekt der Klasse. Das Objekt ruft die Methode aufdisp().

Der Code sollte Folgendes erzeugen output - -

Hello World

Eine der grundlegendsten Eigenschaften einer Programmiersprache ist der Satz von Datentypen, die sie unterstützt. Dies sind die Arten von Werten, die in einer Programmiersprache dargestellt und bearbeitet werden können.

Die Dart-Sprache unterstützt die folgenden Typen

  • Numbers
  • Strings
  • Booleans
  • Lists
  • Maps

Zahlen

Zahlen in Dart werden verwendet, um numerische Literale darzustellen. Der Number Dart gibt es in zwei Geschmacksrichtungen -

  • Integer- Ganzzahlige Werte stellen nicht gebrochene Werte dar, dh numerische Werte ohne Dezimalpunkt. Beispielsweise ist der Wert "10" eine Ganzzahl. Ganzzahlige Literale werden mit dem dargestelltint Stichwort.

  • Double- Dart unterstützt auch numerische Bruchwerte, dh Werte mit Dezimalstellen. Der Datentyp Double in Dart repräsentiert eine 64-Bit-Gleitkommazahl (doppelte Genauigkeit). Zum Beispiel der Wert "10.10". Das Schlüsselwortdouble wird zur Darstellung von Gleitkomma-Literalen verwendet.

Saiten

Zeichenfolgen repräsentieren eine Folge von Zeichen. Wenn Sie beispielsweise Daten wie Name, Adresse usw. speichern möchten, sollte der Zeichenfolgendatentyp verwendet werden. Eine Dart-Zeichenfolge ist eine Folge von UTF-16-Codeeinheiten.Runes werden verwendet, um eine Folge von UTF-32-Codeeinheiten darzustellen.

Das Schlüsselwort Stringwird verwendet, um Zeichenfolgenliterale darzustellen. Zeichenfolgenwerte werden entweder in einfache oder doppelte Anführungszeichen eingebettet.

Boolescher Wert

Der Boolesche Datentyp repräsentiert die Booleschen Werte true und false. Dart benutzt diebool Schlüsselwort zur Darstellung eines booleschen Werts.

Liste und Karte

Die Datentypliste und die Karte werden verwendet, um eine Sammlung von Objekten darzustellen. EINListist eine geordnete Gruppe von Objekten. Der List-Datentyp in Dart ist gleichbedeutend mit dem Konzept eines Arrays in anderen Programmiersprachen. DasMapDer Datentyp repräsentiert eine Reihe von Werten als Schlüssel-Wert-Paare. Dasdart: core Die Bibliothek ermöglicht die Erstellung und Bearbeitung dieser Sammlungen über die vordefinierten Listen- bzw. Kartenklassen.

Der dynamische Typ

Dart ist eine optional eingegebene Sprache. Wenn der Typ einer Variablen nicht explizit angegeben wird, lautet der Typ der Variablendynamic. Dasdynamic Das Schlüsselwort kann auch explizit als Typanmerkung verwendet werden.

Eine Variable ist „ein benannter Bereich im Speicher“, in dem Werte gespeichert werden. Mit anderen Worten, es fungiert als Container für Werte in einem Programm. Variablennamen werden als Bezeichner bezeichnet. Im Folgenden sind die Namensregeln für einen Bezeichner aufgeführt:

  • Bezeichner können keine Schlüsselwörter sein.

  • Bezeichner können Alphabete und Zahlen enthalten.

  • Bezeichner dürfen keine Leerzeichen und Sonderzeichen enthalten, außer dem Unterstrich (_) und dem Dollarzeichen ($).

  • Variablennamen können nicht mit einer Zahl beginnen.

Geben Sie Syntax ein

Eine Variable muss deklariert werden, bevor sie verwendet wird. Dart verwendet das Schlüsselwort var, um dasselbe zu erreichen. Die Syntax zum Deklarieren einer Variablen lautet wie folgt:

var name = 'Smith';

Alle Variablen in Dart speichern einen Verweis auf den Wert, anstatt den Wert zu enthalten. Die Variable namens name enthält einen Verweis auf ein String-Objekt mit dem Wert "Smith".

Dart unterstützt type-checkingindem dem Variablennamen der Datentyp vorangestellt wird. Durch die Typprüfung wird sichergestellt, dass eine Variable nur Daten enthält, die für einen Datentyp spezifisch sind. Die Syntax dafür ist unten angegeben -

String name = 'Smith'; 
int num = 10;

Betrachten Sie das folgende Beispiel -

void main() { 
   String name = 1; 
}

Das obige Snippet führt zu einer Warnung, da der der Variablen zugewiesene Wert nicht mit dem Datentyp der Variablen übereinstimmt.

Ausgabe

Warning: A value of type 'String' cannot be assigned to a variable of type 'int'

Alle nicht initialisierten Variablen haben den Anfangswert null. Dies liegt daran, dass Dart alle Werte als Objekte betrachtet. Das folgende Beispiel zeigt dasselbe -

void main() { 
   int num; 
   print(num); 
}

Ausgabe

Null

Das dynamische Schlüsselwort

Variablen, die ohne statischen Typ deklariert wurden, werden implizit als dynamisch deklariert. Variablen können auch mit dem dynamischen Schlüsselwort anstelle des var-Schlüsselworts deklariert werden.

Das folgende Beispiel zeigt dasselbe.

void main() { 
   dynamic x = "tom"; 
   print(x);  
}

Ausgabe

tom

Final und Const

Das final und constSchlüsselwörter werden verwendet, um Konstanten zu deklarieren. Dart verhindert, dass die Werte einer Variablen geändert werden, die mit dem Schlüsselwort final oder const deklariert wurde. Diese Schlüsselwörter können in Verbindung mit dem Datentyp der Variablen oder anstelle von verwendet werdenvar Stichwort.

Das constDas Schlüsselwort wird verwendet, um eine Konstante zur Kompilierungszeit darzustellen. Variablen, die mit dem deklariert wurdenconst Schlüsselwort sind implizit endgültig.

Syntax: endgültiges Schlüsselwort

final variable_name

ODER

final data_type  variable_name

Syntax: const Schlüsselwort

const variable_name

ODER

const data_type variable_name

Beispiel - endgültiges Schlüsselwort

void main() { 
   final val1 = 12; 
   print(val1); 
}

Ausgabe

12

Beispiel - const Schlüsselwort

void main() { 
   const pi = 3.14; 
   const area = pi*12*12; 
   print("The output is ${area}"); 
}

Das obige Beispiel deklariert zwei Konstanten: pi und area, Verwendung der constStichwort. Dasarea Der Wert der Variablen ist eine Konstante zur Kompilierungszeit.

Ausgabe

The output is 452.15999999999997

Note - Nur constVariablen können verwendet werden, um eine Kompilierungszeitkonstante zu berechnen. Konstanten zur Kompilierungszeit sind Konstanten, deren Werte zur Kompilierungszeit bestimmt werden

Beispiel

Dart löst eine Ausnahme aus, wenn versucht wird, mit dem deklarierte Variablen zu ändern finaloder const Schlüsselwort. Das folgende Beispiel zeigt dasselbe -

void main() { 
   final v1 = 12; 
   const v2 = 13; 
   v2 = 12; 
}

Der oben angegebene Code löst den folgenden Fehler aus als output - -

Unhandled exception: 
cannot assign to final variable 'v2='.  
NoSuchMethodError: cannot assign to final variable 'v2=' 
#0  NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:178) 
#1      main (file: Test.dart:5:3) 
#2    _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) 
#3    _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

Ein Ausdruck ist eine spezielle Art von Anweisung, die einen Wert ergibt. Jeder Ausdruck besteht aus -

  • Operands - Repräsentiert die Daten

  • Operator - Definiert, wie die Operanden verarbeitet werden, um einen Wert zu erzeugen.

Betrachten Sie den folgenden Ausdruck - "2 + 3". In diesem Ausdruck sind 2 und 3operands und das Symbol "+" (plus) ist das operator.

In diesem Kapitel werden die in Dart verfügbaren Operatoren erläutert.

  • Rechenzeichen
  • Gleichstellungs- und Vergleichsoperatoren
  • Typprüfoperatoren
  • Bitweise Operatoren
  • Zuweisungsoperatoren
  • Logische Operatoren

Rechenzeichen

Die folgende Tabelle zeigt die von Dart unterstützten arithmetischen Operatoren.

Beispiele anzeigen

Sr.Nr. Operatoren & Bedeutung
1 +

Hinzufügen

2

Subtrahieren

3 -expr

Unäres Minus, auch Negation genannt (das Vorzeichen des Ausdrucks umkehren)

4 *

Multiplizieren

5 /

Teilen

6 ~/

Teilen Sie und geben Sie ein ganzzahliges Ergebnis zurück

7 %

Holen Sie sich den Rest einer Ganzzahldivision (Modulo)

8 ++

Zuwachs

9 --

Dekrement

Gleichstellungs- und Vergleichsoperatoren

Relationale Operatoren testen oder definieren die Art der Beziehung zwischen zwei Entitäten. Vergleichsoperatoren geben einen booleschen Wert zurück, dh true / false.

Angenommen, der Wert von A ist 10 und B ist 20.

Beispiele anzeigen

Operator Beschreibung Beispiel
> Größer als (A> B) ist falsch
< Weniger als (A <B) ist wahr
> = Größer als oder gleich wie (A> = B) ist falsch
<= Kleiner als oder gleich (A <= B) ist wahr
== Gleichberechtigung (A == B) ist falsch
! = Nicht gleich (A! = B) ist wahr

Typprüfoperatoren

Diese Operatoren sind praktisch, um Typen zur Laufzeit zu überprüfen.

Beispiele anzeigen

Operator Bedeutung
ist True, wenn das Objekt den angegebenen Typ hat
ist! False, wenn das Objekt den angegebenen Typ hat

Bitweise Operatoren

In der folgenden Tabelle sind die in Dart verfügbaren bitweisen Operatoren und ihre Rolle aufgeführt.

Beispiele anzeigen

Operator Beschreibung Beispiel
Bitweises UND a & b Gibt an jeder Bitposition eine Eins zurück, für die die entsprechenden Bits beider Operanden Einsen sind.
Bitweises ODER a | b Gibt an jeder Bitposition eine Eins zurück, für die die entsprechenden Bits eines oder beider Operanden Einsen sind.
Bitweises XOR a ^ b Gibt an jeder Bitposition eine Eins zurück, für die die entsprechenden Bits eines oder beider Operanden Eins sind.
Bitweise NICHT ~ a Invertiert die Bits seines Operanden.
Linksverschiebung a ≪ b Verschiebt a in der binären Darstellung b (<32) Bits nach links und verschiebt sich in Nullen von rechts.
Signpropagating Rechtsverschiebung a ≫ b Verschiebt a in der binären Darstellung b (<32) Bits nach rechts und verwirft verworfene Bits.

Zuweisungsoperatoren

In der folgenden Tabelle sind die in Dart verfügbaren Zuweisungsoperatoren aufgeführt.

Beispiele anzeigen

Sr.Nr. Betreiber & Beschreibung
1 =(Simple Assignment )

Weist dem linken Operanden Werte vom rechten Operanden zu

Ex: C = A + B weist C den Wert von A + B zu

2 ??=

Weisen Sie den Wert nur zu, wenn die Variable null ist

3 +=(Add and Assignment)

Es fügt dem linken Operanden den rechten Operanden hinzu und weist das Ergebnis dem linken Operanden zu.

Ex: C + = A entspricht C = C + A.

4 ─=(Subtract and Assignment)

Es subtrahiert den rechten Operanden vom linken Operanden und weist das Ergebnis dem linken Operanden zu.

Ex: C - = A entspricht C = C - A.

5 *=(Multiply and Assignment)

Es multipliziert den rechten Operanden mit dem linken Operanden und weist das Ergebnis dem linken Operanden zu.

Ex: C * = A entspricht C = C * A.

6 /=(Divide and Assignment)

Es teilt den linken Operanden mit dem rechten Operanden und weist das Ergebnis dem linken Operanden zu.

Note - Die gleiche Logik gilt für bitweise Operatoren, daher werden sie zu ≪ =, ≫ =, ≫ =, ≫ =, | = und ^ =.

Logische Operatoren

Logische Operatoren werden verwendet, um zwei oder mehr Bedingungen zu kombinieren. Logische Operatoren geben einen booleschen Wert zurück. Angenommen, der Wert der Variablen A ist 10 und B ist 20.

Beispiele anzeigen

Operator Beschreibung Beispiel
&&

And - Der Operator gibt nur dann true zurück, wenn alle angegebenen Ausdrücke true zurückgeben

(A> 10 && B> 10) ist falsch.
||

OR - Der Operator gibt true zurück, wenn mindestens einer der angegebenen Ausdrücke true zurückgibt

(A> 10 || B> 10) ist wahr.
!

NOT- Der Operator gibt die Umkehrung des Ergebnisses des Ausdrucks zurück. Zum Beispiel :! (7> 5) gibt false zurück

! (A> 10) ist wahr.

Bedingte Ausdrücke

Dart verfügt über zwei Operatoren, mit denen Sie Ausdrücke auswerten können, für die andernfalls möglicherweise ifelse-Anweisungen erforderlich sind.

Bedingung ? Ausdruck1: Ausdruck2

Wenn die Bedingung erfüllt ist, wird der Ausdruck ausgewertet expr1(und gibt seinen Wert zurück); Andernfalls wird der Wert von ausgewertet und zurückgegebenexpr2.

Ausdruck1 ?? Ausdruck2

Wenn expr1ist nicht null, gibt seinen Wert zurück; Andernfalls wird der Wert von ausgewertet und zurückgegebenexpr2

Beispiel

Das folgende Beispiel zeigt, wie Sie bedingte Ausdrücke in Dart verwenden können -

void main() { 
   var a = 10; 
   var res = a > 12 ? "value greater than 10":"value lesser than or equal to 10"; 
   print(res); 
}

Es wird die folgende Ausgabe erzeugt -

value lesser than or equal to 10

Beispiel

Nehmen wir ein anderes Beispiel -

void main() { 
   var a = null; 
   var b = 12; 
   var res = a ?? b; 
   print(res); 
}

Es wird die folgende Ausgabe erzeugt -

12

Manchmal erfordern bestimmte Anweisungen eine wiederholte Ausführung. Loops sind ein idealer Weg, um dasselbe zu tun. Eine Schleife stellt eine Reihe von Anweisungen dar, die wiederholt werden müssen. Im Kontext einer Schleife wird eine Wiederholung als bezeichnetiteration.

Die folgende Abbildung zeigt die Klassifizierung von Schleifen -

Beginnen wir die Diskussion mit Definite Loops. Eine Schleife, deren Anzahl von Iterationen definitiv / fest ist, wird als a bezeichnetdefinite loop.

Sr.Nr. Schleife & Beschreibung
1 für Schleife

Das forSchleife ist eine Implementierung einer bestimmten Schleife. Die for-Schleife führt den Codeblock für eine bestimmte Anzahl von Malen aus. Es kann verwendet werden, um einen festen Satz von Werten zu durchlaufen, z. B. ein Array

2 für… in Loop

Die for ... in-Schleife wird verwendet, um die Eigenschaften eines Objekts zu durchlaufen.

Lassen Sie uns nun die unbestimmten Schleifen diskutieren. Eine unbestimmte Schleife wird verwendet, wenn die Anzahl der Iterationen in einer Schleife unbestimmt oder unbekannt ist. Unbestimmte Schleifen können implementiert werden mit -

Sr.Nr. Schleife & Beschreibung
1 while-Schleife

Die while-Schleife führt die Anweisungen jedes Mal aus, wenn die angegebene Bedingung als wahr ausgewertet wird. Mit anderen Worten, die Schleife wertet die Bedingung aus, bevor der Codeblock ausgeführt wird.

2 mach ... während Loop

Die do… while-Schleife ähnelt der while-Schleife, außer dass die do ... while-Schleife die Bedingung nicht zum ersten Mal auswertet, wenn die Schleife ausgeführt wird.

Lassen Sie uns nun weitermachen und das diskutieren Loop Control Statements von Dart.

Sr.Nr. Steueranweisung & Beschreibung
1 break Statement

Das breakAnweisung wird verwendet, um die Kontrolle aus einem Konstrukt zu entfernen. Verwenden vonbreakIn einer Schleife verlässt das Programm die Schleife. Das Folgende ist ein Beispiel für diebreak Erklärung.

2 Fortsetzung Statement

Das continue Die Anweisung überspringt die nachfolgenden Anweisungen in der aktuellen Iteration und bringt die Steuerung zurück zum Anfang der Schleife.

Verwenden von Beschriftungen zur Steuerung des Flusses

EIN labelist einfach ein Bezeichner, gefolgt von einem Doppelpunkt (:), der auf eine Anweisung oder einen Codeblock angewendet wird. Ein Etikett kann mit verwendet werdenbreak und continue um den Durchfluss genauer zu steuern.

Zeilenumbrüche zwischen den Zeilen sind nicht zulässig ‘continue’ oder ‘break’Anweisung und deren Markenname. Außerdem sollte zwischen einem Labelnamen und einer zugehörigen Schleife keine andere Anweisung stehen.

Beispiel: Beschriftung mit Pause

void main() { 
   outerloop: // This is the label name 
   
   for (var i = 0; i < 5; i++) { 
      print("Innerloop: ${i}"); innerloop: for (var j = 0; j < 5; j++) { if (j > 3 ) break ; // Quit the innermost loop if (i == 2) break innerloop; // Do the same thing if (i == 4) break outerloop; // Quit the outer loop print("Innerloop: ${j}"); 
      } 
   } 
}

Folgende output wird bei erfolgreicher Ausführung des obigen Codes angezeigt.

Innerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 2
Innerloop: 3
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 4

Beispiel: Beschriften mit weiter

void main() { 
   outerloop: // This is the label name 
   
   for (var i = 0; i < 3; i++) { 
      print("Outerloop:${i}"); for (var j = 0; j < 5; j++) { if (j == 3){ continue outerloop; } print("Innerloop:${j}"); 
      } 
   } 
}

Die folgende Ausgabe wird bei erfolgreicher Ausführung des obigen Codes angezeigt.

Outerloop: 0 
Innerloop: 0 
Innerloop: 1 
Innerloop: 2 

Outerloop: 1 
Innerloop: 0 
Innerloop: 1 
Innerloop: 2 

Outerloop: 2 
Innerloop: 0 
Innerloop: 1 
Innerloop: 2

Ein Bedingungs- / Entscheidungskonstrukt wertet eine Bedingung aus, bevor die Anweisungen ausgeführt werden.

Bedingte Konstrukte in Dart sind in der folgenden Tabelle klassifiziert.

Sr.Nr. Aussage & Beschreibung
1 if Erklärung

Ein if Anweisung besteht aus einem Booleschen Ausdruck, gefolgt von einer oder mehreren Anweisungen.

2 Wenn ... sonst Aussage

Ein if kann von einem optionalen gefolgt werden elseBlock. Daselse Block wird ausgeführt, wenn der Boolesche Ausdruck von der getestet wird if Block wird als falsch ausgewertet.

3 sonst ... wenn Leiter

Das else…if ladderist nützlich, um mehrere Bedingungen zu testen. Es folgt die Syntax desselben.

4 switch… case Statement

Die switch-Anweisung wertet einen Ausdruck aus, ordnet den Wert des Ausdrucks einer case-Klausel zu und führt die diesem case zugeordneten Anweisungen aus.

Pfeilnummern können klassifiziert werden als -

  • int- Ganzzahl beliebiger Größe. Dasint Der Datentyp wird verwendet, um ganze Zahlen darzustellen.

  • double- 64-Bit-Gleitkommazahlen (doppelte Genauigkeit) gemäß IEEE 754-Standard. Dasdouble Der Datentyp wird zur Darstellung von Bruchzahlen verwendet

Das num Typ wird von der geerbt int und doubleTypen. Dasdart core library ermöglicht zahlreiche Operationen mit numerischen Werten.

Die Syntax zum Deklarieren einer Zahl lautet wie folgt:

int var_name;      // declares an integer variable 
double var_name;   // declares a double variable

Beispiel

void main() {
   // declare an integer
   int num1 = 10;             
     
   // declare a double value
   double num2 = 10.50;  

   // print the values
   print(num1);
   print(num2);
}

Es wird die folgende Ausgabe erzeugt -

10 
10.5

Note - Die Dart VM löst eine Ausnahme aus, wenn ganzzahligen Variablen Bruchwerte zugewiesen werden.

Parsing

Das parse()Die statische Funktion ermöglicht das Parsen einer Zeichenfolge, die ein numerisches Literal enthält, in eine Zahl. Die folgende Abbildung zeigt dasselbe -

void main() { 
   print(num.parse('12')); 
   print(num.parse('10.91')); 
}

Der obige Code führt zu folgender Ausgabe:

12 
10.91

Die Analysefunktion löst a aus FormatExceptionwenn ein anderer Wert als Ziffern übergeben wird. Der folgende Code zeigt, wie Sie einen alphanumerischen Wert an die übergebenparse() Funktion.

Beispiel

void main() { 
   print(num.parse('12A')); 
   print(num.parse('AAAA')); 
}

Der obige Code führt zu folgender Ausgabe:

Unhandled exception: 
FormatException: 12A 
#0 num.parse (dart:core/num.dart:446) 
#1 main (file:///D:/Demos/numbers.dart:4:13) 
#2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261) 
#3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)

Zahleneigenschaften

In der folgenden Tabelle sind die Eigenschaften aufgeführt, die von Dartnummern unterstützt werden.

Sr.Nr. Objektbeschreibung
1 Hash-Code

Gibt einen Hash-Code für einen numerischen Wert zurück.

2 isFinite

True, wenn die Zahl endlich ist; sonst falsch.

3 isInfinite

True, wenn die Zahl positiv oder negativ unendlich ist; sonst falsch.

4 isNan

True, wenn die Zahl der doppelte Not-a-Number-Wert ist; sonst falsch.

5 isNegative

True, wenn die Zahl negativ ist; sonst falsch.

6 Zeichen

Gibt je nach Vorzeichen und numerischem Wert der Zahl minus eins, null oder plus eins zurück.

7 isEven

Gibt true zurück, wenn die Zahl eine gerade Zahl ist.

8 ist ungerade

Gibt true zurück, wenn die Zahl eine ungerade Zahl ist.

Zahlenmethoden

Nachstehend finden Sie eine Liste häufig verwendeter Methoden, die von Zahlen unterstützt werden.

Sr.Nr. Methode & Beschreibung
1 Abs

Gibt den absoluten Wert der Zahl zurück.

2 Decke

Gibt die kleinste Ganzzahl zurück, die nicht kleiner als die Zahl ist.

3 vergleichen mit

Vergleicht dies mit einer anderen Zahl.

4 Fußboden

Gibt die größte Ganzzahl zurück, die nicht größer als die aktuelle Zahl ist.

5 Rest

Gibt den abgeschnittenen Rest nach dem Teilen der beiden Zahlen zurück.

6 Runden

Gibt die Ganzzahl zurück, die den aktuellen Zahlen am nächsten kommt.

7 verdoppeln

Gibt das doppelte Äquivalent der Zahl zurück.

8 toInt

Gibt das ganzzahlige Äquivalent der Zahl zurück.

9

Gibt die Zeichenfolgenäquivalentdarstellung der Zahl zurück.

10 kürzen

Gibt eine Ganzzahl zurück, nachdem alle gebrochenen Ziffern verworfen wurden.

Der String-Datentyp repräsentiert eine Folge von Zeichen. Eine Dart-Zeichenfolge ist eine Folge von UTF 16-Codeeinheiten.

Zeichenfolgenwerte in Dart können entweder in einfachen oder doppelten oder dreifachen Anführungszeichen dargestellt werden. Einzeilige Zeichenfolgen werden in einfachen oder doppelten Anführungszeichen dargestellt. Dreifache Anführungszeichen werden verwendet, um mehrzeilige Zeichenfolgen darzustellen.

Die Syntax zur Darstellung von Zeichenfolgenwerten in Dart lautet wie folgt:

Syntax

String  variable_name = 'value'  

OR  

String  variable_name = ''value''  

OR  

String  variable_name = '''line1 
line2'''  

OR  

String  variable_name= ''''''line1 
line2''''''

Das folgende Beispiel veranschaulicht die Verwendung des Datentyps String in Dart.

void main() { 
   String str1 = 'this is a single line string'; 
   String str2 = "this is a single line string"; 
   String str3 = '''this is a multiline line string'''; 
   String str4 = """this is a multiline line string"""; 
   
   print(str1);
   print(str2); 
   print(str3); 
   print(str4); 
}

Es wird Folgendes erzeugt Output - -

this is a single line string 
this is a single line string 
this is a multiline line string 
this is a multiline line string

Saiten sind unveränderlich. Zeichenfolgen können jedoch verschiedenen Operationen unterzogen werden, und die resultierende Zeichenfolge kann als neuer Wert gespeichert werden.

String-Interpolation

Der Vorgang zum Erstellen einer neuen Zeichenfolge durch Anhängen eines Werts an eine statische Zeichenfolge wird als bezeichnet concatenation oder interpolation. Mit anderen Worten, es ist der Prozess des Hinzufügens einer Zeichenfolge zu einer anderen Zeichenfolge.

Der Operator plus (+) ist ein häufig verwendeter Mechanismus zum Verketten / Interpolieren von Zeichenfolgen.

Beispiel 1

void main() { 
   String str1 = "hello"; 
   String str2 = "world"; 
   String res = str1+str2; 
   
   print("The concatenated string : ${res}"); 
}

Es wird Folgendes erzeugt output - -

The concatenated string : Helloworld

Beispiel 2

Mit "$ {}" können Sie den Wert eines Dart-Ausdrucks in Zeichenfolgen interpolieren. Das folgende Beispiel zeigt dasselbe.

void main() { 
   int n=1+1; 
   
   String str1 = "The sum of 1 and 1 is ${n}"; print(str1); String str2 = "The sum of 2 and 2 is ${2+2}"; 
   print(str2); 
}

Es wird Folgendes erzeugt output - -

The sum of 1 and 1 is 2 
The sum of 2 and 2 is 4

String-Eigenschaften

Die in der folgenden Tabelle aufgeführten Eigenschaften sind alle schreibgeschützt.

Sr.Nr. Objektbeschreibung
1 codeUnits

Gibt eine nicht veränderbare Liste der UTF-16-Codeeinheiten dieser Zeichenfolge zurück.

2 ist leer

Gibt true zurück, wenn diese Zeichenfolge leer ist.

3 Länge

Gibt die Länge der Zeichenfolge einschließlich Leerzeichen, Tabulatoren und Zeilenumbrüchen zurück.

Methoden zum Manipulieren von Strings

Die String-Klasse in der dart: core librarybietet auch Methoden zum Bearbeiten von Zeichenfolgen. Einige dieser Methoden sind unten angegeben -

Sr.Nr. Methoden & Beschreibung
1 toLowerCase ()

Konvertiert alle Zeichen in dieser Zeichenfolge in Kleinbuchstaben.

2 toUpperCase ()

Konvertiert alle Zeichen in dieser Zeichenfolge in Großbuchstaben.

3 trimmen()

Gibt die Zeichenfolge ohne führende und nachfolgende Leerzeichen zurück.

4 vergleichen mit()

Vergleicht dieses Objekt mit einem anderen.

5 alles ersetzen()

Ersetzt alle Teilzeichenfolgen, die dem angegebenen Muster entsprechen, durch einen bestimmten Wert.

6 Teilt()

Teilt die Zeichenfolge bei Übereinstimmungen mit dem angegebenen Trennzeichen und gibt eine Liste von Teilzeichenfolgen zurück.

7 Teilzeichenfolge ()

Gibt den Teilstring dieser Zeichenfolge zurück, der sich von startIndex einschließlich bis endIndex exklusiv erstreckt.

8 toString ()

Gibt eine Zeichenfolgendarstellung dieses Objekts zurück.

9 codeUnitAt ()

Gibt die 16-Bit-UTF-16-Codeeinheit am angegebenen Index zurück.

Dart bietet eine integrierte Unterstützung für den Booleschen Datentyp. Der boolesche Datentyp in DART unterstützt nur zwei Werte - true und false. Das Schlüsselwort bool wird verwendet, um ein Boolesches Literal in DART darzustellen.

Die Syntax zum Deklarieren einer Booleschen Variablen in DART lautet wie folgt:

bool var_name = true;  
OR  
bool var_name = false

Beispiel

void main() { 
   bool test; 
   test = 12 > 5; 
   print(test); 
}

Es wird Folgendes erzeugt output - -

true

Beispiel

Im Gegensatz zu JavaScript erkennt der boolesche Datentyp nur das Literal true als true. Jeder andere Wert wird als falsch betrachtet. Betrachten Sie das folgende Beispiel -

var str = 'abc'; 
if(str) { 
   print('String is not empty'); 
} else { 
   print('Empty String'); 
}

Wenn das obige Snippet in JavaScript ausgeführt wird, wird die Meldung "String ist nicht leer" ausgegeben, da das if-Konstrukt true zurückgibt, wenn der String nicht leer ist.

In Dart jedoch strwird als str! = true in false konvertiert . Daher druckt das Snippet die Meldung 'Leere Zeichenfolge' (wenn es im nicht aktivierten Modus ausgeführt wird).

Beispiel

Das obige Snippet wird ausgeführt checkedModus löst eine Ausnahme aus. Das gleiche ist unten dargestellt -

void main() { 
   var str = 'abc'; 
   if(str) { 
      print('String is not empty'); 
   } else { 
      print('Empty String'); 
   } 
}

Es wird Folgendes erzeugt output, im Checked Mode - -

Unhandled exception: 
type 'String' is not a subtype of type 'bool' of 'boolean expression' where 
   String is from dart:core 
   bool is from dart:core  
#0 main (file:///D:/Demos/Boolean.dart:5:6) 
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) 
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

Es wird Folgendes erzeugt output, im Unchecked Mode - -

Empty String

Note - Die WebStorm IDE wird standardmäßig im aktivierten Modus ausgeführt.

Eine sehr häufig verwendete Sammlung in der Programmierung ist eine array. Dart repräsentiert Arrays in Form vonListObjekte. EINListist einfach eine geordnete Gruppe von Objekten. Dasdart:core Die Bibliothek bietet die List-Klasse, mit der Listen erstellt und bearbeitet werden können.

Die logische Darstellung einer Liste in Dart ist unten angegeben -

  • test_list - ist die Kennung, die auf die Sammlung verweist.

  • Die Liste enthält die Werte 12, 13 und 14. Die Speicherblöcke, die diese Werte enthalten, werden als bezeichnet elements.

  • Jedes Element in der Liste wird durch eine eindeutige Nummer namens bezeichnet index. Der Index beginnt beizero und erstreckt sich bis zu n-1 wo nist die Gesamtzahl der Elemente in der Liste. Der Index wird auch als bezeichnetsubscript.

Listen können klassifiziert werden als -

  • Liste mit fester Länge
  • Anbaubare Liste

Lassen Sie uns nun diese beiden Arten von diskutieren lists im Detail.

Liste mit fester Länge

Die Länge einer Liste mit fester Länge kann sich zur Laufzeit nicht ändern. Die Syntax zum Erstellen einer Liste mit fester Länge lautet wie folgt:

Step 1 − Declaring a list

Die Syntax zum Deklarieren einer Liste mit fester Länge ist unten angegeben -

var list_name = new List(initial_size)

Die obige Syntax erstellt eine Liste der angegebenen Größe. Die Liste kann zur Laufzeit nicht vergrößert oder verkleinert werden. Jeder Versuch, die Größe der Liste zu ändern, führt zu einer Ausnahme.

Step 2 − Initializing a list

Die Syntax zum Initialisieren einer Liste lautet wie folgt:

lst_name[index] = value;

Beispiel

void main() { 
   var lst = new List(3); 
   lst[0] = 12; 
   lst[1] = 13; 
   lst[2] = 11; 
   print(lst); 
}

Es wird Folgendes erzeugt output - -

[12, 13, 11]

Anbaubare Liste

Die Länge einer wachsenden Liste kann sich zur Laufzeit ändern. Die Syntax zum Deklarieren und Initialisieren einer erweiterbaren Liste lautet wie folgt:

Step 1 − Declaring a List

var list_name = [val1,val2,val3]   
--- creates a list containing the specified values  
OR  
var list_name = new List() 
--- creates a list of size zero

Step 2 − Initializing a List

Der Index / Index wird verwendet, um auf das Element zu verweisen, das mit einem Wert gefüllt werden soll. Die Syntax zum Initialisieren einer Liste lautet wie folgt:

list_name[index] = value;

Beispiel

Das folgende Beispiel zeigt, wie Sie eine Liste mit 3 Elementen erstellen.

void main() { 
   var num_list = [1,2,3]; 
   print(num_list); 
}

Es wird Folgendes erzeugt output - -

[1, 2, 3]

Beispiel

Im folgenden Beispiel wird eine Liste mit der Länge Null erstellt empty List() constructor. Dasadd() Funktion in der List Klasse wird verwendet, um Elemente dynamisch zur Liste hinzuzufügen.

void main() { 
   var lst = new List(); 
   lst.add(12); 
   lst.add(13); 
   print(lst); 
}

Es wird Folgendes erzeugt output - -

[12, 13]

Listeneigenschaften

In der folgenden Tabelle sind einige häufig verwendete Eigenschaften von aufgeführt List Klasse in der dart:core library.

Sr.Nr. Methoden & Beschreibung
1 zuerst

Gibt den ersten Elementfall zurück.

2 ist leer

Gibt true zurück, wenn die Sammlung keine Elemente enthält.

3 ist nicht leer

Gibt true zurück, wenn die Auflistung mindestens ein Element enthält.

4 Länge

Gibt die Größe der Liste zurück.

5 last

Returns the last element in the list.

6 reversed

Returns an iterable object containing the lists values in the reverse order.

7 Single

Checks if the list has only one element and returns it.

In this chapter, we will discuss how to carry out some basic operations on Lists, such as −

Sr.No Basic Operation & Description
1 Inserting Elements into a List

Mutable Lists can grow dynamically at runtime. The List.add() function appends the specified value to the end of the List and returns a modified List object.

2 Updating a list

Lists in Dart can be updated by −

  • Updating The Index
  • Using the List.replaceRange() function
3 Removing List items

The following functions supported by the List class in the dart:core library can be used to remove the item(s) in a List.

The Map object is a simple key/value pair. Keys and values in a map may be of any type. A Map is a dynamic collection. In other words, Maps can grow and shrink at runtime.

Maps can be declared in two ways −

  • Using Map Literals
  • Using a Map constructor

Declaring a Map using Map Literals

To declare a map using map literals, you need to enclose the key-value pairs within a pair of curly brackets "{ }".

Here is its syntax

var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }

Deklarieren einer Karte mit einem Kartenkonstruktor

Um eine Karte mit einem Kartenkonstruktor zu deklarieren, haben wir zwei Schritte. Deklarieren Sie zuerst die Karte und zweitens initialisieren Sie die Karte.

Das syntax zu declare a map ist wie folgt -

var identifier = new Map()

Verwenden Sie nun die folgende Syntax für initialize the map - -

map_name[key] = value

Beispiel: Kartenliteral

void main() { 
   var details = {'Usrname':'tom','Password':'pass@123'}; 
   print(details); 
}

Es wird Folgendes erzeugt output - -

{Usrname: tom, Password: pass@123}

Beispiel: Hinzufügen von Werten zu Kartenliteralen zur Laufzeit

void main() { 
   var details = {'Usrname':'tom','Password':'pass@123'}; 
   details['Uid'] = 'U1oo1'; 
   print(details); 
}

Es wird Folgendes erzeugt output - -

{Usrname: tom, Password: pass@123, Uid: U1oo1}

Beispiel: Kartenkonstruktor

void main() { 
   var details = new Map(); 
   details['Usrname'] = 'admin'; 
   details['Password'] = 'admin@123'; 
   print(details); 
}

Es wird Folgendes erzeugt output - -

{Usrname: admin, Password: admin@123}

Note - Ein Kartenwert kann ein beliebiges Objekt sein, einschließlich NULL.

Karte - Eigenschaften

Das Map Klasse im dart: core-Paket definiert die folgenden Eigenschaften:

Sr.Nr. Objektbeschreibung
1 Schlüssel

Gibt ein iterierbares Objekt zurück, das Schlüssel darstellt

2 Werte

Gibt ein iterierbares Objekt zurück, das Werte darstellt

3 Länge

Gibt die Größe der Karte zurück

4 ist leer

Gibt true zurück, wenn die Karte eine leere Karte ist

5 ist nicht leer

Gibt true zurück, wenn die Karte eine leere Karte ist

Karte - Funktionen

Im Folgenden finden Sie die häufig verwendeten Funktionen zum Bearbeiten von Karten in Dart.

Sr.Nr. Funktionsname & Beschreibung
1 füge alle Hinzu()

Fügt dieser Karte alle Schlüssel-Wert-Paare anderer hinzu.

2 klar()

Entfernt alle Paare von der Karte.

3 entfernen()

Entfernt den Schlüssel und den zugehörigen Wert, falls vorhanden, aus der Karte.

4 für jeden()

Wendet f auf jedes Schlüssel-Wert-Paar der Karte an.

Symbole in Dart sind undurchsichtige, dynamische Zeichenfolgennamen, die zum Reflektieren von Metadaten aus einer Bibliothek verwendet werden. Einfach ausgedrückt, Symbole sind eine Möglichkeit, die Beziehung zwischen einer von Menschen lesbaren Zeichenfolge und einer Zeichenfolge zu speichern, die für die Verwendung durch Computer optimiert ist.

Reflection ist ein Mechanismus zum Abrufen von Metadaten eines Typs zur Laufzeit, z. B. die Anzahl der Methoden in einer Klasse, die Anzahl der Konstruktoren oder die Anzahl der Parameter in einer Funktion. Sie können sogar eine Methode des Typs aufrufen, der zur Laufzeit geladen wird.

In Dart Reflection sind bestimmte Klassen in der verfügbar dart:mirrorsPaket. Diese Bibliothek funktioniert sowohl in Webanwendungen als auch in Befehlszeilenanwendungen.

Syntax

Symbol obj = new Symbol('name');  
// expects a name of class or function or library to reflect

Das name muss ein gültiger öffentlicher Dart-Mitgliedsname, öffentlicher Konstruktorname oder Bibliotheksname sein.

Beispiel

Betrachten Sie das folgende Beispiel. Der Code deklariert eine KlasseFoo in einer Bibliothek foo_lib. Die Klasse definiert die Methodenm1, m2, und m3.

Lebensmittelkunst

library foo_lib;   
// libarary name can be a symbol   

class Foo {         
   // class name can be a symbol  
   m1() {        
      // method name can be a symbol 
      print("Inside m1"); 
   } 
   m2() { 
      print("Inside m2"); 
   } 
   m3() { 
      print("Inside m3"); 
   } 
}

Der folgende Code wird geladen Foo.dartBibliothek und sucht nach Foo-Klasse mit Hilfe des Symboltyps. Da wir die Metadaten aus der obigen Bibliothek widerspiegeln, wird der Code importiertdart:mirrors Bibliothek.

FooSymbol.dart

import 'dart:core'; 
import 'dart:mirrors'; 
import 'Foo.dart';  

main() { 
   Symbol lib = new Symbol("foo_lib");   
   //library name stored as Symbol 
   
   Symbol clsToSearch = new Symbol("Foo");  
   // class name stored as Symbol  
   
   if(checkIf_classAvailableInlibrary(lib, clsToSearch))  
   // searches Foo class in foo_lib library 
      print("class found.."); 
}  
   
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) { 
   MirrorSystem mirrorSystem = currentMirrorSystem(); 
   LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName); 
      
   if (libMirror != null) { 
      print("Found Library"); 
      print("checkng...class details.."); 
      print("No of classes found is : ${libMirror.declarations.length}"); 
      libMirror.declarations.forEach((s, d) => print(s));  
         
      if (libMirror.declarations.containsKey(className)) return true; 
      return false; 
   } 
}

Beachten Sie, dass die Zeile libMirror.declarations.forEach ((s, d) => print (s)); iteriert zur Laufzeit über jede Deklaration in der Bibliothek und druckt die Deklarationen als Typ vonSymbol.

Dieser Code sollte Folgendes erzeugen output - -

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") // class name displayed as symbol  
class found.

Beispiel: Zeigen Sie die Anzahl der Instanzmethoden einer Klasse an

Betrachten wir nun die Anzeige der Anzahl der Instanzmethoden in einer Klasse. Die vordefinierte KlasseClassMirror hilft uns, dasselbe zu erreichen.

import 'dart:core'; 
import 'dart:mirrors'; 
import 'Foo.dart';  

main() { 
   Symbol lib = new Symbol("foo_lib"); 
   Symbol clsToSearch = new Symbol("Foo");  
   reflect_InstanceMethods(lib, clsToSearch); 
}  
void reflect_InstanceMethods(Symbol libraryName, Symbol className) { 
   MirrorSystem mirrorSystem = currentMirrorSystem(); 
   LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName); 
   
   if (libMirror != null) { 
      print("Found Library"); 
      print("checkng...class details.."); 
      print("No of classes found is : ${libMirror.declarations.length}"); 
      libMirror.declarations.forEach((s, d) => print(s));  
      
      if (libMirror.declarations.containsKey(className)) print("found class");
      ClassMirror classMirror = libMirror.declarations[className]; 
      
      print("No of instance methods found is ${classMirror.instanceMembers.length}");
      classMirror.instanceMembers.forEach((s, v) => print(s)); 
   } 
}

Dieser Code sollte Folgendes erzeugen output - -

Found Library 
checkng...class details.. 
No of classes found is : 1 
Symbol("Foo") 
found class 
No of instance methods found is 8 
Symbol("==") 
Symbol("hashCode") 
Symbol("toString") 
Symbol("noSuchMethod") 
Symbol("runtimeType") 
Symbol("m1") 
Symbol("m2") 
Symbol("m3")

Symbol in Zeichenfolge konvertieren

Sie können den Namen eines Typs wie einer in einem Symbol gespeicherten Klasse oder Bibliothek mithilfe von in einen String zurückkonvertieren MirrorSystemKlasse. Der folgende Code zeigt, wie Sie ein Symbol in eine Zeichenfolge konvertieren können.

import 'dart:mirrors'; 
void main(){ 
   Symbol lib = new Symbol("foo_lib"); 
   String name_of_lib = MirrorSystem.getName(lib); 
   
   print(lib); 
   print(name_of_lib); 
}

Es sollte Folgendes erzeugen output - -

Symbol("foo_lib")   

foo_lib

Zeichenfolgen sind eine Folge von Zeichen. Dart repräsentiert Zeichenfolgen als eine Folge von Unicode UTF-16-Codeeinheiten. Unicode ist ein Format, das einen eindeutigen numerischen Wert für jeden Buchstaben, jede Ziffer und jedes Symbol definiert.

Da eine Dart-Zeichenfolge eine Folge von UTF-16-Codeeinheiten ist, werden 32-Bit-Unicode-Werte innerhalb einer Zeichenfolge mithilfe einer speziellen Syntax dargestellt. EINrune ist eine Ganzzahl, die einen Unicode-Codepunkt darstellt.

Die String-Klasse in der dart:core Bibliothek bietet Mechanismen für den Zugriff runes. Auf String-Code-Einheiten / Runen kann auf drei Arten zugegriffen werden:

  • Verwenden der Funktion String.codeUnitAt ()
  • Verwenden der String.codeUnits-Eigenschaft
  • Verwenden der String.runes-Eigenschaft

String.codeUnitAt () Funktion

Auf Codeeinheiten in einer Zeichenfolge kann über ihre Indizes zugegriffen werden. Gibt die 16-Bit-UTF-16-Codeeinheit am angegebenen Index zurück.

Syntax

String.codeUnitAt(int index);

Beispiel

import 'dart:core'; 
void main(){ 
   f1(); 
} 
f1() { 
   String x = 'Runes'; 
   print(x.codeUnitAt(0)); 
}

Es wird Folgendes erzeugt output - -

82

String.codeUnits-Eigenschaft

Diese Eigenschaft gibt eine nicht veränderbare Liste der UTF-16-Codeeinheiten der angegebenen Zeichenfolge zurück.

Syntax

String. codeUnits;

Beispiel

import 'dart:core';  
void main(){ 
   f1(); 
}  
f1() { 
   String x = 'Runes'; 
   print(x.codeUnits); 
}

Es wird Folgendes erzeugt output - -

[82, 117, 110, 101, 115]

String.runes-Eigenschaft

Diese Eigenschaft gibt eine Iterable von Unicode-Codepunkten davon zurück string.Runes erweitert iterable.

Syntax

String.runes

Beispiel

void main(){ 
   "A string".runes.forEach((int rune) { 
      var character=new String.fromCharCode(rune); 
      print(character); 
   });  
}

Es wird Folgendes erzeugt output - -

A 
s 
t 
r 
i 
n 
g

Unicode-Codepunkte werden normalerweise als ausgedrückt \uXXXX, wobei XXXX ein 4-stelliger Hexadezimalwert ist. Um mehr oder weniger als 4 hexadezimale Ziffern anzugeben, setzen Sie den Wert in geschweifte Klammern. Man kann den Konstruktor der Runes-Klasse in der dart: core-Bibliothek dafür verwenden.

Beispiel

main() { 
   Runes input = new Runes(' \u{1f605} '); 
   print(new String.fromCharCodes(input)); 
}

Es wird Folgendes erzeugt output - -

Eine Aufzählung wird zum Definieren benannter konstanter Werte verwendet. Ein Aufzählungstyp wird mit dem deklariertenum Stichwort.

Syntax

enum enum_name {  
   enumeration list 
}

Wo,

  • Der enum_name gibt den Namen des Aufzählungstyps an
  • Die Aufzählungsliste ist eine durch Kommas getrennte Liste von Bezeichnern

Jedes der Symbole in der Aufzählungsliste steht für einen ganzzahligen Wert, der größer ist als das vorangegangene Symbol. Standardmäßig ist der Wert des ersten Aufzählungssymbols 0.

Zum Beispiel

enum Status { 
   none, 
   running, 
   stopped, 
   paused 
}

Beispiel

enum Status { 
   none, 
   running, 
   stopped, 
   paused 
}  
void main() { 
   print(Status.values); 
   Status.values.forEach((v) => print('value: $v, index: ${v.index}')); print('running: ${Status.running}, ${Status.running.index}'); print('running index: ${Status.values[1]}'); 
}

Es wird Folgendes erzeugt output - -

[Status.none, Status.running, Status.stopped, Status.paused] 
value: Status.none, index: 0 
value: Status.running, index: 1 
value: Status.stopped, index: 2 
value: Status.paused, index: 3 
running: Status.running, 1 
running index: Status.running

Funktionen sind die Bausteine ​​für lesbaren, wartbaren und wiederverwendbaren Code. Eine Funktion ist eine Reihe von Anweisungen zum Ausführen einer bestimmten Aufgabe. Funktionen organisieren das Programm in logischen Codeblöcken. Einmal definiert, können Funktionen aufgerufen werden, um auf Code zuzugreifen. Dies macht den Code wiederverwendbar. Darüber hinaus erleichtern Funktionen das Lesen und Verwalten des Programmcodes.

Eine Funktionsdeklaration informiert den Compiler über den Namen, den Rückgabetyp und die Parameter einer Funktion. Eine Funktionsdefinition liefert den tatsächlichen Hauptteil der Funktion.

Sr.Nr. Funktionen & Beschreibung
1 Funktion definieren

Eine Funktionsdefinition gibt an, was und wie eine bestimmte Aufgabe ausgeführt werden soll.

2 Eine Funktion aufrufen

Eine Funktion muss aufgerufen werden, um sie auszuführen.

3 Rückgabe von Funktionen

Funktionen können zusammen mit der Steuerung auch einen Wert an den Anrufer zurückgeben.

4 Parametrierte Funktion

Parameter sind ein Mechanismus zum Übergeben von Werten an Funktionen.

Optionale Parameter

Optionale Parameter können verwendet werden, wenn Argumente für die Ausführung einer Funktion nicht zwangsweise übergeben werden müssen. Ein Parameter kann optional markiert werden, indem ein Fragezeichen an seinen Namen angehängt wird. Der optionale Parameter sollte als letztes Argument in einer Funktion festgelegt werden.

Wir haben drei Arten von optionalen Parametern in Dart -

Sr.Nr. Parameter & Beschreibung
1 Optionaler Positionsparameter

Verwenden Sie eckige [] Klammern, um optionale Positionsparameter anzugeben.

2 Optional benannter Parameter

Im Gegensatz zu Positionsparametern muss der Name des Parameters angegeben werden, während der Wert übergeben wird. Die geschweifte Klammer {} kann verwendet werden, um optionale benannte Parameter anzugeben.

3 Optionale Parameter mit Standardwerten

Funktionsparametern können standardmäßig auch Werte zugewiesen werden. Solche Parameter können jedoch auch explizit übergeben werden.

Rekursive Dartfunktionen

Rekursion ist eine Technik zum Durchlaufen einer Operation, indem ein Funktionsaufruf wiederholt ausgeführt wird, bis ein Ergebnis erzielt wird. Die Rekursion wird am besten angewendet, wenn Sie dieselbe Funktion wiederholt mit unterschiedlichen Parametern innerhalb einer Schleife aufrufen müssen.

Beispiel

void main() { 
   print(factorial(6));
}  
factorial(number) { 
   if (number <= 0) {         
      // termination case 
      return 1; 
   } else { 
      return (number * factorial(number - 1));    
      // function invokes itself 
   } 
}

Es sollte Folgendes erzeugen output - -

720

Lambda-Funktionen

Lambda-Funktionen sind ein prägnanter Mechanismus zur Darstellung von Funktionen. Diese Funktionen werden auch als Pfeilfunktionen bezeichnet.

Syntax

[return_type]function_name(parameters)=>expression;

Beispiel

void main() { 
   printMsg(); 
   print(test()); 
}  
printMsg()=>
print("hello"); 

int test()=>123;                       
// returning function

Es sollte Folgendes erzeugen output - -

hello 123

Ein interfaceDefiniert die Syntax, die eine Entität einhalten muss. Schnittstellen definieren eine Reihe von Methoden, die für ein Objekt verfügbar sind. Dart hat keine Syntax zum Deklarieren von Schnittstellen. Klassendeklarationen sind selbst Schnittstellen in Dart.

Classessollte das Schlüsselwort implements verwenden, um eine Schnittstelle verwenden zu können. Die implementierende Klasse muss eine konkrete Implementierung aller Funktionen der implementierten Schnittstelle bereitstellen. Mit anderen Worten, eine Klasse muss jede Funktion in der Schnittstelle, die sie implementieren möchte, neu definieren.

Syntax: Implementierung einer Schnittstelle

class identifier implements interface_name

Beispiel

Im folgenden Programm deklarieren wir eine Klasse Printer. DasConsolePrinter Klasse implementiert die implizite Schnittstellendeklaration für die PrinterKlasse. Dasmain Funktion erstellt ein Objekt der ConsolePrinter Klasse mit der newStichwort. Mit diesem Objekt wird die Funktion aufgerufenprint_data definiert in der ConsolePrinter Klasse.

void main() { 
   ConsolePrinter cp= new ConsolePrinter(); 
   cp.print_data(); 
}  
class Printer { 
   void print_data() { 
      print("__________Printing Data__________"); 
   } 
}  
class ConsolePrinter implements Printer { 
   void print_data() {  
      print("__________Printing to Console__________"); 
   } 
}

Es sollte Folgendes erzeugen output - -

__________Printing to Console__________

Implementieren mehrerer Schnittstellen

Eine Klasse kann mehrere Schnittstellen implementieren. Die Schnittstellen sind durch ein Komma getrennt. Dassyntax für das gleiche ist unten angegeben -

class identifier implements interface-1,interface_2,interface_4…….

Folgende example zeigt, wie Sie mehrere Schnittstellen in Dart implementieren können -

void main() { 
   Calculator c = new Calculator(); 
   print("The gross total : ${c.ret_tot()}"); print("Discount :${c.ret_dis()}"); 
}  
class Calculate_Total { 
   int ret_tot() {} 
}  
class Calculate_Discount { 
   int ret_dis() {} 
}
class Calculator  implements Calculate_Total,Calculate_Discount { 
   int ret_tot() { 
      return 1000; 
   } 
   int ret_dis() { 
      return 50; 
   } 
}

Es sollte Folgendes erzeugen output - -

The gross total: 1000 
Discount:50

Dart ist eine objektorientierte Sprache. Es unterstützt objektorientierte Programmierfunktionen wie Klassen, Schnittstellen usw. A.classIn Bezug auf OOP ist eine Blaupause zum Erstellen von Objekten. EINclasskapselt Daten für das Objekt. Dart bietet integrierte Unterstützung für dieses Konzept namensclass.

Eine Klasse deklarieren

Verwenden Sie die class Schlüsselwort zum Deklarieren von a classin Dart. Eine Klassendefinition beginnt mit der Schlüsselwortklasse, gefolgt von derclass name;; und der Klassenkörper, der von einem Paar geschweifter Klammern umschlossen ist. Die Syntax dafür ist unten angegeben -

Syntax

class class_name {  
   <fields> 
   <getters/setters> 
   <constructors> 
   <functions> 
}

Das classAuf das Schlüsselwort folgt der Klassenname. Die Regeln für Bezeichner müssen beim Benennen einer Klasse berücksichtigt werden.

Eine Klassendefinition kann Folgendes umfassen:

  • Fields- Ein Feld ist eine Variable, die in einer Klasse deklariert ist. Felder repräsentieren Daten, die sich auf Objekte beziehen.

  • Setters and Getters- Ermöglicht dem Programm das Initialisieren und Abrufen der Werte der Felder einer Klasse. Jeder Klasse ist ein Standard-Getter / Setter zugeordnet. Die Standardwerte können jedoch überschrieben werden, indem ein Setter / Getter explizit definiert wird.

  • Constructors - verantwortlich für die Zuweisung von Speicher für die Objekte der Klasse.

  • Functions- Funktionen stellen Aktionen dar, die ein Objekt ausführen kann. Sie werden manchmal auch als Methoden bezeichnet.

Diese Komponenten zusammen werden als bezeichnet data members der Klasse.

Beispiel: Deklarieren einer Klasse

class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

Das Beispiel deklariert eine Klasse Car. Die Klasse hat ein Feld mit dem Namenengine. Dasdisp() ist eine einfache Funktion, die den Wert des Feldes druckt engine.

Instanz der Klasse erstellen

Verwenden Sie zum Erstellen einer Instanz der Klasse die newSchlüsselwort gefolgt vom Klassennamen. Die Syntax dafür ist unten angegeben -

Syntax

var object_name = new class_name([ arguments ])
  • Das new Das Schlüsselwort ist für die Instanziierung verantwortlich.

  • Die rechte Seite des Ausdrucks ruft den Konstruktor auf. Dem Konstruktor sollten Werte übergeben werden, wenn er parametrisiert ist.

Beispiel: Instanziieren einer Klasse

var obj = new Car("Engine 1")

Zugriff auf Attribute und Funktionen

Auf die Attribute und Funktionen einer Klasse kann über das Objekt zugegriffen werden. Verwenden Sie das '.' Punktnotation (genannt alsperiod), um auf die Datenelemente einer Klasse zuzugreifen.

//accessing an attribute 
obj.field_name  

//accessing a function 
obj.function_name()

Beispiel

Schauen Sie sich das folgende Beispiel an, um zu verstehen, wie Sie auf Attribute und Funktionen in Dart zugreifen können -

void main() { 
   Car c= new Car(); 
   c.disp(); 
}  
class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

Das output des obigen Codes ist wie folgt -

E1001

Dartkonstruktoren

Ein Konstruktor ist eine spezielle Funktion der Klasse, die für die Initialisierung der Variablen der Klasse verantwortlich ist. Dart definiert einen Konstruktor mit demselben Namen wie der der Klasse. Ein Konstruktor ist eine Funktion und kann daher parametrisiert werden. Im Gegensatz zu einer Funktion können Konstruktoren jedoch keinen Rückgabetyp haben. Wenn Sie keinen Konstruktor deklarieren, wird ein Standardwert festgelegtno-argument constructor wird für Sie bereitgestellt.

Syntax

Class_name(parameter_list) { 
   //constructor body 
}

Beispiel

Das folgende Beispiel zeigt, wie Konstruktoren in Dart verwendet werden -

void main() { 
   Car c = new Car('E1001'); 
} 
class Car { 
   Car(String engine) { 
      print(engine); 
   } 
}

Es sollte Folgendes erzeugen output - -

E1001

Benannte Konstruktoren

Dart bietet named constructors um eine Klassendefinition zu aktivieren multiple constructors. Die Syntax der benannten Konstruktoren ist wie folgt:

Syntax: Definieren des Konstruktors

Class_name.constructor_name(param_list)

Beispiel

Das folgende Beispiel zeigt, wie Sie benannte Konstruktoren in Dart verwenden können -

void main() {           
   Car c1 = new Car.namedConst('E1001');                                       
   Car c2 = new Car(); 
}           
class Car {                   
   Car() {                           
      print("Non-parameterized constructor invoked");
   }                                   
   Car.namedConst(String engine) { 
      print("The engine is : ${engine}");    
   }                               
}

Es sollte Folgendes erzeugen output - -

The engine is : E1001 
Non-parameterized constructor invoked

Das dieses Schlüsselwort

Das thisDas Schlüsselwort bezieht sich auf die aktuelle Instanz der Klasse. Hier sind der Parametername und der Name des Klassenfelds identisch. Um Mehrdeutigkeiten zu vermeiden, wird dem Feld der Klasse das vorangestelltthisStichwort. Das folgende Beispiel erklärt dasselbe -

Beispiel

Das folgende Beispiel erläutert die Verwendung von this Schlüsselwort in Dart -

void main() { 
   Car c1 = new Car('E1001'); 
}  
class Car { 
   String engine; 
   Car(String engine) { 
      this.engine = engine; 
      print("The engine is : ${engine}"); 
   } 
}

Es sollte Folgendes erzeugen output - -

The engine is : E1001

Dart Class ─ Getter und Setter

Getters und Setters, auch genannt als accessors und mutatorsErmöglichen Sie dem Programm, die Werte von Klassenfeldern zu initialisieren bzw. abzurufen. Getter oder Accessoren werden mit dem definiertgetStichwort. Setter oder Mutatoren werden mit dem definiertset Stichwort.

Jeder Klasse ist ein Standard-Getter / Setter zugeordnet. Die Standardwerte können jedoch überschrieben werden, indem ein Setter / Getter explizit definiert wird. Ein Getter hat keine Parameter und gibt einen Wert zurück, und der Setter hat einen Parameter und gibt keinen Wert zurück.

Syntax: Definieren eines Getters

Return_type  get identifier 
{ 
}

Syntax: Definieren eines Setzers

set identifier 
{ 
}

Beispiel

Das folgende Beispiel zeigt, wie Sie verwenden können getters und setters in einer Dartklasse -

class Student { 
   String name; 
   int age; 
    
   String get stud_name { 
      return name; 
   } 
    
   void set stud_name(String name) { 
      this.name = name; 
   } 
   
   void set stud_age(int age) { 
      if(age<= 0) { 
        print("Age should be greater than 5"); 
      }  else { 
         this.age = age; 
      } 
   } 
   
   int get stud_age { 
      return age;     
   } 
}  
void main() { 
   Student s1 = new Student(); 
   s1.stud_name = 'MARK'; 
   s1.stud_age = 0; 
   print(s1.stud_name); 
   print(s1.stud_age); 
}

Dieser Programmcode sollte Folgendes erzeugen output - -

Age should be greater than 5 
MARK 
Null

Klassenvererbung

Dart unterstützt das Konzept der Vererbung, dh die Fähigkeit eines Programms, neue Klassen aus einer vorhandenen Klasse zu erstellen. Die Klasse, die erweitert wird, um neuere Klassen zu erstellen, wird als übergeordnete Klasse / Superklasse bezeichnet. Die neu erstellten Klassen werden als untergeordnete Klassen / Unterklassen bezeichnet.

Eine Klasse erbt von einer anderen Klasse mit dem Schlüsselwort 'extended'. Child classes inherit all properties and methods except constructors from the parent class.

Syntax

class child_class_name extends parent_class_name

Note - Dart unterstützt keine Mehrfachvererbung.

Beispiel: Klassenvererbung

Im folgenden Beispiel deklarieren wir eine Klasse Shape. Die Klasse wird um die erweitertCircleKlasse. Da zwischen den Klassen eine Vererbungsbeziehung besteht, ist die untergeordnete Klasse, dh die KlasseCar erhält einen impliziten Zugriff auf das Datenelement der übergeordneten Klasse.

void main() { 
   var obj = new Circle(); 
   obj.cal_area(); 
}  
class Shape { 
   void cal_area() { 
      print("calling calc area defined in the Shape class"); 
   } 
}  
class Circle extends Shape {}

Es sollte Folgendes erzeugen output - -

calling calc area defined in the Shape class

Arten der Vererbung

Es gibt folgende drei Arten der Vererbung:

  • Single - Jede Klasse kann höchstens von einer Elternklasse ausgehen.

  • Multiple- Eine Klasse kann von mehreren Klassen erben. Dart unterstützt keine Mehrfachvererbung.

  • Multi-level - Eine Klasse kann von einer anderen untergeordneten Klasse erben.

Beispiel

Das folgende Beispiel zeigt, wie die mehrstufige Vererbung funktioniert -

void main() { 
   var obj = new Leaf(); 
   obj.str = "hello"; 
   print(obj.str); 
}  
class Root { 
   String str; 
}  
class Child extends Root {}  
class Leaf extends Child {}  
//indirectly inherits from Root by virtue of inheritance

Die Klasse Leafleitet die Attribute aus Root- und Child-Klassen aufgrund der mehrstufigen Vererbung ab. Es istoutput ist wie folgt -

hello

Dart - Klassenvererbung und Methodenüberschreibung

Das Überschreiben von Methoden ist ein Mechanismus, mit dem die untergeordnete Klasse eine Methode in ihrer übergeordneten Klasse neu definiert. Das folgende Beispiel zeigt dasselbe -

Beispiel

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}"); 
   } 
}

Es sollte Folgendes erzeugen output - -

value of b 12

Die Anzahl und der Typ der Funktionsparameter müssen übereinstimmen, während die Methode überschrieben wird. Im Falle einer Nichtübereinstimmung der Anzahl der Parameter oder ihres Datentyps gibt der Dart-Compiler einen Fehler aus. Die folgende Abbildung erklärt dasselbe -

import 'dart:io'; 
void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(String b) { print("value of b ${b}");
   } 
}

Es sollte Folgendes erzeugen output - -

value of b 12

Das statische Schlüsselwort

Das static Schlüsselwort kann auf die Datenelemente einer Klasse angewendet werden, dh fields und methods. Eine statische Variable behält ihre Werte bei, bis das Programm die Ausführung beendet hat. Statische Mitglieder werden durch den Klassennamen referenziert.

Beispiel

class StaticMem { 
   static int num;  
   static disp() { 
      print("The value of num is ${StaticMem.num}")  ; 
   } 
}  
void main() { 
   StaticMem.num = 12;  
   // initialize the static variable } 
   StaticMem.disp();   
   // invoke the static method 
}

Es sollte Folgendes erzeugen output - -

The value of num is 12

Das Super-Keyword

Das superDas Schlüsselwort wird verwendet, um auf das unmittelbare übergeordnete Element einer Klasse zu verweisen. Das Schlüsselwort kann verwendet werden, um auf die Superklassenversion von a zu verweisenvariable, property, oder method. Das folgende Beispiel zeigt dasselbe -

Beispiel

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   String msg = "message variable from the parent class"; 
   void m1(int a){ print("value of a ${a}");} 
} 
class Child extends Parent { 
   @override 
   void m1(int b) { 
      print("value of b ${b}"); super.m1(13); print("${super.msg}")   ; 
   } 
}

Es sollte Folgendes erzeugen output - -

value of b 12 
value of a 13 
message variable from the parent class

Objektorientierte Programmierung definiert ein Objekt als "jede Entität, die eine definierte Grenze hat". Ein Objekt hat Folgendes:

  • State- Beschreibt das Objekt. Die Felder einer Klasse repräsentieren den Status des Objekts.

  • Behavior - Beschreibt, was ein Objekt tun kann.

  • Identity- Ein eindeutiger Wert, der ein Objekt von einer Reihe ähnlicher anderer Objekte unterscheidet. Zwei oder mehr Objekte können den Status und das Verhalten teilen, nicht jedoch die Identität.

Der Periodenoperator (.) wird in Verbindung mit dem Objekt verwendet, um auf die Datenelemente einer Klasse zuzugreifen.

Beispiel

Dart repräsentiert Daten in Form von Objekten. Jede Klasse in Dart erweitert die Object-Klasse. Im Folgenden finden Sie ein einfaches Beispiel für das Erstellen und Verwenden eines Objekts.

class Student { 
   void test_method() { 
      print("This is a  test method"); 
   } 
   
   void test_method1() { 
      print("This is a  test method1"); 
   } 
}  
void main()    { 
   Student s1 = new Student(); 
   s1.test_method(); 
   s1.test_method1(); 
}

Es sollte Folgendes erzeugen output - -

This is a test method 
This is a test method1

Der Kaskadenoperator (..)

Das obige Beispiel ruft die Methoden in der Klasse auf. Bei jedem Aufruf einer Funktion ist jedoch ein Verweis auf das Objekt erforderlich. Dascascade operator kann als Abkürzung in Fällen verwendet werden, in denen eine Folge von Aufrufen vorliegt.

Der Kaskadenoperator (..) kann verwendet werden, um eine Folge von Aufrufen über ein Objekt auszugeben. Das obige Beispiel kann auf folgende Weise umgeschrieben werden.

class Student { 
   void test_method() { 
      print("This is a  test method"); 
   } 
   
   void test_method1() { 
      print("This is a  test method1"); 
   } 
}  
void main() { 
   new Student() 
   ..test_method() 
   ..test_method1(); 
}

Es sollte Folgendes erzeugen output - -

This is a test method 
This is a test method1

Die toString () -Methode

Diese Funktion gibt eine Zeichenfolgendarstellung eines Objekts zurück. Schauen Sie sich das folgende Beispiel an, um zu verstehen, wie Sie das verwendentoString Methode.

void main() { 
   int n = 12; 
   print(n.toString()); 
}

Es sollte Folgendes erzeugen output - -

12

Dart unterstützt im Gegensatz zu anderen Programmiersprachen keine Arrays. Dart-Sammlungen können verwendet werden, um Datenstrukturen wie ein Array zu replizieren. Die dart: core-Bibliothek und andere Klassen aktivieren die Sammlungsunterstützung in Dart-Skripten.

Dart-Sammlungen können grundsätzlich klassifiziert werden als -

Sr.Nr. Dart Sammlung & Beschreibung
1 Liste

Eine Liste ist einfach eine geordnete Gruppe von Objekten. Dasdart:core Die Bibliothek bietet die List-Klasse, mit der Listen erstellt und bearbeitet werden können.

  • Fixed Length List - Die Länge der Liste kann sich zur Laufzeit nicht ändern.

  • Growable List - Die Länge der Liste kann sich zur Laufzeit ändern.

2 einstellen

Set stellt eine Sammlung von Objekten dar, in denen jedes Objekt nur einmal vorkommen kann. Die dart: core-Bibliothek bietet die Set-Klasse, um dasselbe zu implementieren.

3 Karten

Das Map-Objekt ist ein einfaches Schlüssel / Wert-Paar. Schlüssel und Werte in einer Karte können von einem beliebigen Typ sein. Eine Karte ist eine dynamische Sammlung. Mit anderen Worten, Karten können zur Laufzeit wachsen und schrumpfen. Die Map-Klasse in der dart: core-Bibliothek bietet Unterstützung für dieselbe.

4 Warteschlange

Eine Warteschlange ist eine Sammlung, die an beiden Enden bearbeitet werden kann. Warteschlangen sind nützlich, wenn Sie eine First-In- und First-Out-Sammlung erstellen möchten. Einfach ausgedrückt, eine Warteschlange fügt Daten von einem Ende ein und löscht von einem anderen Ende. Die Werte werden in der Reihenfolge ihres Einfügens entfernt / gelesen.

Sammlungen iterieren

Die Iterator-Klasse aus der dart:coreBibliothek ermöglicht einfaches Durchsuchen der Sammlung. Jede Sammlung hat eineiteratorEigentum. Diese Eigenschaft gibt einen Iterator zurück, der auf die Objekte in der Auflistung verweist.

Beispiel

Das folgende Beispiel zeigt das Durchlaufen einer Sammlung mit einem Iteratorobjekt.

import 'dart:collection'; 
void main() { 
   Queue numQ = new Queue(); 
   numQ.addAll([100,200,300]);  
   Iterator i= numQ.iterator; 
   
   while(i.moveNext()) { 
      print(i.current); 
   } 
}

Das moveNext()Die Funktion gibt einen booleschen Wert zurück, der angibt, ob ein nachfolgender Eintrag vorhanden ist. Dascurrent Die Eigenschaft des Iteratorobjekts gibt den Wert des Objekts zurück, auf das der Iterator aktuell zeigt.

Dieses Programm sollte Folgendes erzeugen output - -

100 
200 
300

Dart ist ein optionally typed language. Sammlungen in Dart sind standardmäßig heterogen. Mit anderen Worten, eine einzelne Dart-Sammlung kann Werte verschiedener Typen hosten. Es kann jedoch eine Dart-Sammlung erstellt werden, um homogene Werte zu halten. Das Konzept der Generika kann verwendet werden, um das gleiche zu erreichen.

Die Verwendung von Generics erzwingt eine Einschränkung des Datentyps der Werte, die in der Sammlung enthalten sein können. Solche Sammlungen werden als typsichere Sammlungen bezeichnet. Die Typensicherheit ist eine Programmierfunktion, die sicherstellt, dass ein Speicherblock nur Daten eines bestimmten Datentyps enthalten kann.

Alle Dart-Sammlungen unterstützen die Implementierung der Typensicherheit über Generika. Ein Paar eckiger Klammern, die den Datentyp enthalten, wird verwendet, um eine typsichere Sammlung zu deklarieren. Die Syntax zum Deklarieren einer typsicheren Sammlung lautet wie folgt.

Syntax

Collection_name <data_type> identifier= new Collection_name<data_type>

Die typsicheren Implementierungen von List, Map, Set und Queue sind unten angegeben. Diese Funktion wird auch von allen Implementierungen der oben genannten Sammlungstypen unterstützt.

Beispiel: Generische Liste

void main() { 
   List <String> logTypes = new List <String>(); 
   logTypes.add("WARNING"); 
   logTypes.add("ERROR"); 
   logTypes.add("INFO");  
   
   // iterating across list 
   for (String type in logTypes) { 
      print(type); 
   } 
}

Es sollte Folgendes erzeugen output - -

WARNING 
ERROR 
INFO

Der Versuch, einen anderen Wert als den angegebenen Typ einzufügen, führt zu einem Kompilierungsfehler. Das folgende Beispiel veranschaulicht dies.

Beispiel

void main() { 
   List <String> logTypes = new List <String>(); 
   logTypes.add(1); 
   logTypes.add("ERROR"); 
   logTypes.add("INFO"); 
  
   //iterating across list 
   for (String type in logTypes) { 
      print(type); 
   } 
}

Es sollte Folgendes erzeugen output - -

1                                                                                     
ERROR                                                                             
INFO

Beispiel: Generisches Set

void main() { 
   Set <int>numberSet = new  Set<int>(); 
   numberSet.add(100); 
   numberSet.add(20); 
   numberSet.add(5); 
   numberSet.add(60);
   numberSet.add(70); 
   
   // numberSet.add("Tom"); 
   compilation error; 
   print("Default implementation  :${numberSet.runtimeType}");  
   
   for(var no in numberSet) { 
      print(no); 
   } 
}

Es sollte Folgendes erzeugen output - -

Default implementation :_CompactLinkedHashSet<int> 
100 
20 
5 
60 
70

Beispiel: Generische Warteschlange

import 'dart:collection'; 
void main() { 
   Queue<int> queue = new Queue<int>(); 
   print("Default implementation ${queue.runtimeType}");  
   queue.addLast(10); 
   queue.addLast(20); 
   queue.addLast(30); 
   queue.addLast(40); 
   queue.removeFirst();  
   
   for(int no in queue){ 
      print(no); 
   } 
}

Es sollte Folgendes erzeugen output - -

Default implementation ListQueue<int> 
20 
30 
40

Generische Karte

Eine typsichere Kartendeklaration gibt die Datentypen von - an

  • Der Schlüssel
  • Der Wert

Syntax

Map <Key_type, value_type>

Beispiel

void main() { 
   Map <String,String>m={'name':'Tom','Id':'E1001'}; 
   print('Map :${m}'); 
}

Es sollte Folgendes erzeugen output - -

Map :{name: Tom, Id: E1001}

Ein Paket ist ein Mechanismus zum Einkapseln einer Gruppe von Programmiereinheiten. Anwendungen müssen manchmal einige Bibliotheken oder Plugins von Drittanbietern integrieren. Jede Sprache verfügt über einen Mechanismus zum Verwalten externer Pakete wie Maven oder Gradle für Java, Nuget für .NET, npm für Node.js usw. Der Paketmanager für Dart istpub.

Pub hilft bei der Installation von Paketen im Repository. Das Repository der gehosteten Pakete finden Sie unterhttps://pub.dartlang.org/.

Das package metadata ist in einer Datei definiert, pubsec.yaml. YAML ist das Akronym fürYet Another Markup Language. Daspub Mit dem Tool können alle verschiedenen Bibliotheken heruntergeladen werden, die für eine Anwendung erforderlich sind.

Jede Dart-Anwendung hat eine pubspec.yaml Datei, die die Anwendungsabhängigkeiten zu anderen Bibliotheken und Metadaten von Anwendungen wie Anwendungsname, Autor, Version und Beschreibung enthält.

Der Inhalt von a pubspec.yaml Datei sollte ungefähr so ​​aussehen -

name: 'vector_victor' 
version: 0.0.1 
description: An absolute bare-bones web app. 
... 
dependencies: browser: '>=0.10.0 <0.11.0'

Das Wichtige pub commands sind wie folgt -

Sr.Nr. Befehl & Beschreibung
1

‘pub get’

Hilft, alle Pakete zu erhalten, von denen Ihre Anwendung abhängt.

2

‘pub upgrade’

Aktualisiert alle Ihre Abhängigkeiten auf eine neuere Version.

3

‘pub build’

Dies wird zum Erstellen Ihrer Webanwendung verwendet und erstellt einen Erstellungsordner mit allen zugehörigen Skripten.

4

‘pub help’

Dies gibt Ihnen Hilfe für alle verschiedenen Pub-Befehle.

Wenn Sie eine IDE wie WebStorm verwenden, können Sie mit der rechten Maustaste auf die Datei pubspec.yaml klicken, um alle Befehle direkt abzurufen.

Paket installieren

Stellen Sie sich ein Beispiel vor, in dem eine Anwendung XML analysieren muss. Dart XML ist eine leichtgewichtige Bibliothek, die Open Source ist und zum Parsen, Durchlaufen, Abfragen und Erstellen von XML-Dokumenten stabil ist.

Die Schritte zum Erreichen dieser Aufgabe sind wie folgt:

Step 1 - Fügen Sie der Datei pubsec.yaml Folgendes hinzu.

name: TestApp 
version: 0.0.1 
description: A simple console application. 
#dependencies: 
#  foo_bar: '>=1.0.0 <2.0.0' 
dependencies: https://mail.google.com/mail/u/0/images/cleardot.gif
xml:

Klicken Sie mit der rechten Maustaste auf pubsec.yamlund Abhängigkeiten erhalten. Dadurch wird das intern ausgelöstpub get command Wie nachfolgend dargestellt.

Die heruntergeladenen Pakete und ihre abhängigen Pakete können im Paketordner überprüft werden.

Da die Installation jetzt abgeschlossen ist, müssen wir auf die verweisen dart xmlim Projekt. Die Syntax lautet wie folgt:

import 'package:xml/xml.dart' as xml;

XML-Zeichenfolge lesen

Um die XML-Zeichenfolge zu lesen und die Eingabe zu überprüfen, verwendet Dart XML a parse()Methode. Die Syntax lautet wie folgt:

xml.parse(String input):

Beispiel: Parsing XML String Input

Das folgende Beispiel zeigt, wie die Eingabe von XML-Zeichenfolgen analysiert wird.

import 'package:xml/xml.dart' as xml; 
void main(){ 
   print("xml"); 
   var bookshelfXml = '''<?xml version = "1.0"?> 
   <bookshelf> 
      <book> 
         <title lang = "english">Growing a Language</title> 
         <price>29.99</price> 
      </book> 
      
      <book> 
         <title lang = "english">Learning XML</title> 
         <price>39.95</price> 
      </book> 
      <price>132.00</price> 
   </bookshelf>'''; 
   
   var document = xml.parse(bookshelfXml); 
   print(document.toString()); 
}

Es sollte Folgendes erzeugen output - -

xml 
<?xml version = "1.0"?><bookshelf> 
   <book> 
      <title lang = "english">Growing a Language</title> 
      <price>29.99</price> 
   </book> 

   <book> 
      <title lang = "english">Learning XML</title> 
      <price>39.95</price> 
   </book> 
   <price>132.00</price> 
</bookshelf>

Eine Ausnahme (oder ein außergewöhnliches Ereignis) ist ein Problem, das während der Ausführung eines Programms auftritt. Wenn eine Ausnahme auftritt, wird der normale Programmfluss unterbrochen und das Programm / die Anwendung wird abnormal beendet.

Eingebaute Dart-Ausnahmen umfassen -

Sr.Nr. Ausnahmen & Beschreibung
1

DeferredLoadException

Wird ausgelöst, wenn eine zurückgestellte Bibliothek nicht geladen werden kann.

2

FormatException

Ausnahme ausgelöst, wenn eine Zeichenfolge oder andere Daten kein erwartetes Format haben und nicht analysiert oder verarbeitet werden können.

3

IntegerDivisionByZeroException

Wird geworfen, wenn eine Zahl durch Null geteilt wird.

4

IOException

Basisklasse für alle Inupt-Output-bezogenen Ausnahmen.

5

IsolateSpawnException

Wird ausgelöst, wenn kein Isolat erstellt werden kann.

6

Timeout

Wird ausgelöst, wenn eine geplante Zeitüberschreitung auftritt, während auf ein asynchrones Ergebnis gewartet wird.

Jede Ausnahme in Dart ist ein Subtyp der vordefinierten Klasse Exception. Ausnahmen müssen behandelt werden, um zu verhindern, dass die Anwendung abrupt beendet wird.

Die Try / On / Catch-Blöcke

Das tryBlock bettet Code ein, der möglicherweise zu einer Ausnahme führen kann. Der Ein-Block wird verwendet, wenn der Ausnahmetyp angegeben werden muss. Dascatch Block wird verwendet, wenn der Handler das Ausnahmeobjekt benötigt.

Das try Auf den Block muss entweder genau einer folgen on / catch Block oder eins finallyBlock (oder einer von beiden). Wenn im try-Block eine Ausnahme auftritt, wird das Steuerelement an den übertragencatch.

Das syntax für die Behandlung einer Ausnahme ist wie unten angegeben -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // code for handling exception 
}  
catch Exception2 { 
   // code for handling exception 
}

Im Folgenden sind einige Punkte aufgeführt, an die Sie sich erinnern sollten:

  • Ein Code-Snippet kann mehr als einen Ein / Fang-Block enthalten, um mehrere Ausnahmen zu behandeln.

  • Der Ein-Block und der Catch-Block schließen sich gegenseitig ein, dh ein Try-Block kann sowohl dem On-Block als auch dem Catch-Block zugeordnet werden.

Der folgende Code veranschaulicht die Ausnahmebehandlung in Dart -

Beispiel: Verwenden des ON-Blocks

Das folgende Programm teilt zwei durch die Variablen dargestellte Zahlen x und ybeziehungsweise. Der Code löst eine Ausnahme aus, da er versucht, durch Null zu teilen. Dason block enthält den Code zur Behandlung dieser Ausnahme.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
}

Es sollte Folgendes erzeugen output - -

Cannot divide by zero

Beispiel: Verwenden des catch-Blocks

Im folgenden Beispiel haben wir denselben Code wie oben verwendet. Der einzige Unterschied ist, dass diecatch block(anstelle des ON-Blocks) enthält hier den Code zur Behandlung der Ausnahme. Der Parameter voncatch enthält das zur Laufzeit ausgelöste Ausnahmeobjekt.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {  
      res = x ~/ y; 
   }  
   catch(e) { 
      print(e); 
   } 
}

Es sollte Folgendes erzeugen output - -

IntegerDivisionByZeroException

Beispiel: on… catch

Das folgende Beispiel zeigt die Verwendung von on...catch Block.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   }  
   on IntegerDivisionByZeroException catch(e) { 
      print(e); 
   } 
}

Es sollte Folgendes erzeugen output - -

IntegerDivisionByZeroException

Der endgültige Block

Das finallyDer Block enthält Code, der unabhängig vom Auftreten einer Ausnahme ausgeführt werden soll. Die Wahlfinally Block wird bedingungslos nach ausgeführt try/on/catch.

Die Syntax für die Verwendung von finally Block ist wie folgt -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // exception handling code 
}  
catch Exception2 { 
   //  exception handling 
}  
finally { 
   // code that should always execute; irrespective of the exception 
}

Das folgende Beispiel veranschaulicht die Verwendung von finally Block.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
   finally { 
      print('Finally block executed'); 
   } 
}

Es sollte Folgendes erzeugen output - -

Cannot divide by zero 
Finally block executed

Eine Ausnahme auslösen

Das throwDas Schlüsselwort wird verwendet, um eine Ausnahme explizit auszulösen. Eine ausgelöste Ausnahme sollte behandelt werden, um zu verhindern, dass das Programm abrupt beendet wird.

Das syntax für die explizite Auslösung einer Ausnahme ist -

throw new Exception_name()

Beispiel

Das folgende Beispiel zeigt die Verwendung von throw Schlüsselwort, um eine Ausnahme auszulösen -

main() { 
   try { 
      test_age(-2); 
   } 
   catch(e) { 
      print('Age cannot be negative'); 
   } 
}  
void test_age(int age) { 
   if(age<0) { 
      throw new FormatException(); 
   } 
}

Es sollte Folgendes erzeugen output - -

Age cannot be negative

Benutzerdefinierte Ausnahmen

Wie oben angegeben, ist jeder Ausnahmetyp in Dart ein Subtyp der integrierten Klasse Exception. Mit Dart können Sie benutzerdefinierte Ausnahmen erstellen, indem Sie die vorhandenen erweitern. Die Syntax zum Definieren einer benutzerdefinierten Ausnahme lautet wie folgt:

Syntax: Definition der Ausnahme

class Custom_exception_Name implements Exception { 
   // can contain constructors, variables and methods 
}

Benutzerdefinierte Ausnahmen sollten explizit ausgelöst und im Code behandelt werden.

Beispiel

Das folgende Beispiel zeigt, wie eine benutzerdefinierte Ausnahme definiert und behandelt wird.

class AmtException implements Exception { 
   String errMsg() => 'Amount should be greater than zero'; 
}  
void main() { 
   try { 
      withdraw_amt(-1); 
   } 
   catch(e) { 
      print(e.errMsg()); 
   }  
finally { 
      print('Ending requested operation.....'); 
   } 
}  
void withdraw_amt(int amt) { 
   if (amt <= 0) { 
      throw new AmtException(); 
   } 
}

Im obigen Code definieren wir eine benutzerdefinierte Ausnahme. AmtException. Der Code löst die Ausnahme aus, wenn der übergebene Betrag nicht im Ausnahmebereich liegt. Dasmain Die Funktion enthält den Funktionsaufruf in der try...catch Block.

Der Code sollte Folgendes erzeugen output - -

Amount should be greater than zero 
Ending requested operation....

Von Zeit zu Zeit begehen Entwickler beim Codieren Fehler. Ein Fehler in einem Programm wird als Fehler bezeichnet. Das Auffinden und Beheben von Fehlern wird als Debuggen bezeichnet und ist ein normaler Teil des Entwicklungsprozesses. Dieser Abschnitt behandelt Tools und Techniken, die Ihnen beim Debuggen von Aufgaben helfen können.

Der WebStorm-Editor ermöglicht Haltepunkte und schrittweises Debuggen. Das Programm wird an der Stelle unterbrochen, an der der Haltepunkt angehängt ist. Diese Funktionalität entspricht den Erwartungen, die Sie an die Entwicklung von Java- oder C # -Anwendungen stellen können. Über den WebStorm-Editor können Sie Variablen überwachen, den Stapel durchsuchen, Methoden- und Funktionsaufrufe schrittweise durchgehen.

Haltepunkt hinzufügen

Betrachten Sie das folgende Code-Snippet. (TestString.dart)

void main() { 
   int a = 10, b = 20, c = 5; 
   c = c * c * c; 
   
   print("$a + $b = ${a+b}"); 
   print("$a%$b = ${a%b}"); // Add a break point here print("$a*$b = ${a*b}"); 
   print("$a/$b = ${a/b}"); 
   print(c); 
}

Zu add a breakpointKlicken Sie auf den linken Rand bis. In der folgenden Abbildung hat Zeile 7 einen Haltepunkt.

Run the program in debug mode. Klicken Sie im Projektexplorer mit der rechten Maustaste auf das Dartprogramm in unserem Fall TestString.dart.

Sobald das Programm im Debug-Modus ausgeführt wird, wird das Debugger-Fenster angezeigt, wie im folgenden Screenshot gezeigt. Auf der Registerkarte Variablen werden die Werte von Variablen im aktuellen Kontext angezeigt. Sie können Beobachter für bestimmte Variablen hinzufügen und diese Wertänderungen mithilfe des Überwachungsfensters abhören.

Step IntoDas Pfeilsymbol (F7) im Debug-Menü hilft dabei, den Code einzeln auszuführen. Wenn Hauptmethoden eine Unterroutine aufrufen, wird diese auch in den Unterprogrammcode aufgenommen.

Step over (F8): Es ist ähnlich wie Step Into. Der Unterschied in der Verwendung tritt auf, wenn die aktuelle Anweisung einen Aufruf einer Unterroutine enthält. Wenn die Hauptmethode eine Unterroutine aufruft, wird bei einem Schritt über nicht in die Unterroutine gebohrt. Das Unterprogramm wird übersprungen.

Step Out(Umschalt + F8): Führt die verbleibenden Zeilen einer Funktion aus, in der der aktuelle Ausführungspunkt liegt. Die nächste angezeigte Anweisung ist die Anweisung nach dem Unterprogrammaufruf.

Nach dem Ausführen im Debug-Modus gibt das Programm Folgendes aus output - -

10 + 20 = 30 
10 % 20 = 10 
10 * 20 = 200 
10 / 20 = 0.5 
125

EIN typedefoder ein Alias ​​vom Funktionstyp hilft beim Definieren von Zeigern auf ausführbaren Code im Speicher. Einfach gesagt, atypedef kann als Zeiger verwendet werden, der auf eine Funktion verweist.

Im Folgenden sind die zu implementierenden Schritte aufgeführt typedefs in einem Dart-Programm.

Step 1: Defining a typedef

EIN typedefkann verwendet werden, um eine Funktionssignatur anzugeben, mit der bestimmte Funktionen übereinstimmen sollen. Eine Funktionssignatur wird durch die Parameter einer Funktion (einschließlich ihrer Typen) definiert. Der Rückgabetyp ist nicht Teil der Funktionssignatur. Die Syntax lautet wie folgt.

typedef function_name(parameters)

Step 2: Assigning a Function to a typedef Variable

Eine Variable von typedef kann auf jede Funktion mit derselben Signatur wie verweisen typedef. Mit der folgenden Signatur können Sie a eine Funktion zuweisentypedef Variable.

type_def  var_name = function_name

Step 3: Invoking a Function

Das typedefVariable kann verwendet werden, um Funktionen aufzurufen. So können Sie eine Funktion aufrufen:

var_name(parameters)

Beispiel

Nehmen wir nun ein Beispiel, um mehr darüber zu erfahren typedef in Dart.

Definieren wir zunächst a typedef. Hier definieren wir eine Funktionssignatur. Die Funktion akzeptiert zwei Eingabeparameter des Typsinteger. Der Rückgabetyp ist nicht Teil der Funktionssignatur.

typedef ManyOperation(int firstNo , int secondNo); //function signature

Als nächstes definieren wir die Funktionen. Definieren Sie einige Funktionen mit derselben Funktionssignatur wie die vonManyOperation typedef.

Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); 
}  
Subtract(int firstNo,int second){ 
   print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Add result is ${firstNo/second}"); 
}

Zum Schluss rufen wir die Funktion über auf typedef. Deklarieren Sie eine Variable vom Typ ManyOperations. Weisen Sie der deklarierten Variablen den Funktionsnamen zu.

ManyOperation oper ;  

//can point to any method of same signature 
oper = Add; 
oper(10,20); 
oper = Subtract; 
oper(30,20); 
oper = Divide; 
oper(50,5);

Das operVariable kann auf jede Methode verweisen, die zwei ganzzahlige Parameter akzeptiert. DasAddDie Funktionsreferenz wird der Variablen zugewiesen. Typedefs können zur Laufzeit Funktionsreferenzen wechseln

Lassen Sie uns nun alle Teile zusammenfügen und das komplette Programm sehen.

typedef ManyOperation(int firstNo , int secondNo); 
//function signature  

Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}"); 
}
Divide(int firstNo,int second){ 
   print("Divide result is ${firstNo/second}"); 
}  
Calculator(int a, int b, ManyOperation oper){ 
   print("Inside calculator"); 
   oper(a,b); 
}  
void main(){ 
   ManyOperation oper = Add; 
   oper(10,20); 
   oper = Subtract; 
   oper(30,20); 
   oper = Divide; 
   oper(50,5); 
}

Das Programm sollte Folgendes erzeugen output - -

Add result is 30 
Subtract result is 10 
Divide result is 10.0

Note - Der obige Code führt zu einem Fehler, wenn der typedef Variable versucht, auf eine Funktion mit einer anderen Funktionssignatur zu verweisen.

Beispiel

Typedefskann auch als Parameter an eine Funktion übergeben werden. Betrachten Sie das folgende Beispiel -

typedef ManyOperation(int firstNo , int secondNo);   //function signature 
Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); 
}  
Subtract(int firstNo,int second){
   print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Divide result is ${firstNo/second}"); 
}  
Calculator(int a,int b ,ManyOperation oper){ 
   print("Inside calculator"); 
   oper(a,b); 
}  
main(){ 
   Calculator(5,5,Add); 
   Calculator(5,5,Subtract); 
   Calculator(5,5,Divide); 
}

Es wird Folgendes erzeugt output - -

Inside calculator 
Add result is 10 
Inside calculator 
Subtract result is 0 
Inside calculator 
Divide result is 1.0

Eine Bibliothek in einer Programmiersprache repräsentiert eine Sammlung von Routinen (Satz von Programmieranweisungen). Dart verfügt über eine Reihe integrierter Bibliotheken, mit denen häufig verwendete Routinen gespeichert werden können. Eine Dart-Bibliothek besteht aus einer Reihe von Klassen, Konstanten, Funktionen, Typedefs, Eigenschaften und Ausnahmen.

Bibliothek importieren

Durch den Import werden die Komponenten in einer Bibliothek für den Aufrufercode verfügbar. Das Schlüsselwort import wird verwendet, um dasselbe zu erreichen. Eine Dartdatei kann mehrere Importanweisungen enthalten.

Eingebaute Dart-Bibliotheks-URIs verwenden das dart: -Schema, um auf eine Bibliothek zu verweisen. Andere Bibliotheken können einen Dateisystempfad oder das Paket: Schema verwenden, um den URI anzugeben. Bibliotheken, die von einem Paketmanager wie dem Pub-Tool bereitgestellt werden, verwenden das Paket: Schema .

Die Syntax zum Importieren einer Bibliothek in Dart ist unten angegeben -

import 'URI'

Betrachten Sie das folgende Code-Snippet -

import 'dart:io' 
import 'package:lib1/libfile.dart'

Wenn Sie nur einen Teil einer Bibliothek verwenden möchten, können Sie die Bibliothek selektiv importieren. Die Syntax dafür ist unten angegeben -

import 'package: lib1/lib1.dart' show foo, bar;  
// Import only foo and bar. 

import 'package: mylib/mylib.dart' hide foo;  
// Import all names except foo

Einige häufig verwendete Bibliotheken sind unten angegeben -

Sr.Nr. Bibliothek & Beschreibung
1

dart:io

Datei-, Socket-, HTTP- und andere E / A-Unterstützung für Serveranwendungen. Diese Bibliothek funktioniert nicht in browserbasierten Anwendungen. Diese Bibliothek wird standardmäßig importiert.

2

dart:core

Integrierte Typen, Sammlungen und andere Kernfunktionen für jedes Dart-Programm. Diese Bibliothek wird automatisch importiert.

3

dart: math

Mathematische Konstanten und Funktionen sowie ein Zufallszahlengenerator.

4

dart: convert

Codierer und Decodierer zum Konvertieren zwischen verschiedenen Datendarstellungen, einschließlich JSON und UTF-8.

5

dart: typed_data

Listen, die Daten mit fester Größe effizient verarbeiten (z. B. vorzeichenlose 8-Byte-Ganzzahlen).

Beispiel: Importieren und Verwenden einer Bibliothek

Im folgenden Beispiel wird die integrierte Bibliothek importiert dart: math. Das Snippet ruft das aufsqrt() Funktion von der mathBibliothek. Diese Funktion gibt die Quadratwurzel einer an sie übergebenen Zahl zurück.

import 'dart:math'; 
void main() { 
   print("Square root of 36 is: ${sqrt(36)}"); 
}

Output

Square root of 36 is: 6.0

Kapselung in Bibliotheken

Dart-Skripte können Bezeichnern einen Unterstrich (_) voranstellen, um ihre Komponenten als privat zu markieren. Einfach ausgedrückt, können Dart-Bibliotheken den Zugriff auf ihre Inhalte durch externe Skripte einschränken. Dies wird als bezeichnetencapsulation. Die Syntax dafür ist unten angegeben -

Syntax

_identifier

Beispiel

Definieren Sie zunächst eine Bibliothek mit einer privaten Funktion.

library loggerlib;                            
void _log(msg) {
   print("Log method called in loggerlib msg:$msg");      
}

Importieren Sie als Nächstes die Bibliothek

import 'test.dart' as web; 
void main() { 
   web._log("hello from webloggerlib"); 
}

Der obige Code führt zu einem Fehler.

Unhandled exception: 
No top-level method 'web._log' declared.  
NoSuchMethodError: method not found: 'web._log' 
Receiver: top-level 
Arguments: [...] 
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184) 
#1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3) 
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) 
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

Benutzerdefinierte Bibliotheken erstellen

Mit Dart können Sie auch Ihren eigenen Code als Bibliothek verwenden. Das Erstellen einer benutzerdefinierten Bibliothek umfasst die folgenden Schritte:

Step 1: Declaring a Library

Verwenden Sie die, um eine Bibliothek explizit zu deklarieren library statement. Die Syntax zum Deklarieren einer Bibliothek lautet wie folgt:

library library_name  
// library contents go here

Step 2: Associating a Library

Sie können eine Bibliothek auf zwei Arten zuordnen:

  • Im selben Verzeichnis
import 'library_name'
  • Aus einem anderen Verzeichnis
import 'dir/library_name'

Beispiel: Benutzerdefinierte Bibliothek

Definieren wir zunächst eine benutzerdefinierte Bibliothek. calculator.dart.

library calculator_lib;  
import 'dart:math'; 

//import statement after the libaray statement  
int add(int firstNumber,int secondNumber){ 
   print("inside add method of Calculator Library ") ; 
   return firstNumber+secondNumber; 
}  
int modulus(int firstNumber,int secondNumber){ 
   print("inside modulus method of Calculator Library ") ; 
   return firstNumber%secondNumber; 
}  
int random(int no){ 
   return new Random().nextInt(no); 
}

Als nächstes werden wir die Bibliothek importieren -

import 'calculator.dart';  
void main() {
   var num1 = 10; 
   var num2 = 20; 
   var sum = add(num1,num2); 
   var mod = modulus(num1,num2); 
   var r = random(10);  
   
   print("$num1 + $num2 = $sum"); print("$num1 % $num2= $mod"); 
   print("random no $r"); 
}

Das Programm sollte Folgendes erzeugen output - -

inside add method of Calculator Library  
inside modulus method of Calculator Library  
10 + 20 = 30 
10 % 20= 10 
random no 0

Bibliothekspräfix

Wenn Sie zwei Bibliotheken mit widersprüchlichen Bezeichnern importieren, können Sie ein Präfix für eine oder beide Bibliotheken angeben. Verwenden Sie die'as'Schlüsselwort zur Angabe des Präfixes. Die Syntax dafür ist unten angegeben -

Syntax

import 'library_uri' as prefix

Beispiel

Definieren wir zunächst eine Bibliothek: loggerlib.dart.

library loggerlib;  
void log(msg){ 
   print("Log method called in loggerlib msg:$msg");
}

Als nächstes definieren wir eine andere Bibliothek: webloggerlib.dart.

library webloggerlib; 
void log(msg){ 
   print("Log method called in webloggerlib msg:$msg"); 
}

Schließlich werden wir die Bibliothek mit einem Präfix importieren.

import 'loggerlib.dart'; 
import 'webloggerlib.dart' as web;  

// prefix avoids function name clashes 
void main(){ 
   log("hello from loggerlib"); 
   web.log("hello from webloggerlib"); 
}

Es wird Folgendes erzeugt output - -

Log method called in loggerlib msg:hello from loggerlib 
Log method called in webloggerlib msg:hello from webloggerlib

Ein asynchronous operation wird in einem Thread ausgeführt, der von dem getrennt ist mainAnwendungsthread. Wenn eine Anwendung eine Methode aufruft, um eine Operation asynchron auszuführen, kann die Anwendung die Ausführung fortsetzen, während die asynchrone Methode ihre Aufgabe ausführt.

Beispiel

Nehmen wir ein Beispiel, um dieses Konzept zu verstehen. Hier akzeptiert das Programm Benutzereingaben mit demIO library.

import 'dart:io'; 
void main() { 
   print("Enter your name :");            
   
   // prompt for user input 
   String name = stdin.readLineSync();  
   
   // this is a synchronous method that reads user input 
   print("Hello Mr. ${name}"); 
   print("End of main"); 
}

Das readLineSync()ist eine synchrone Methode. Dies bedeutet, dass die Ausführung aller Anweisungen, die dem folgenreadLineSync() Funktionsaufruf wird bis zum gesperrt readLineSync() Methode beendet die Ausführung.

Das stdin.readLineSyncwartet auf Eingabe. Es stoppt in seinen Spuren und wird nicht weiter ausgeführt, bis es die Eingabe des Benutzers erhält.

Das obige Beispiel führt zu Folgendem output - -

Enter your name :     
Tom                   

// reads user input  
Hello Mr. Tom 
End of main

Beim Rechnen sagen wir, dass etwas ist synchronouswenn es darauf wartet, dass ein Ereignis eintritt, bevor es fortfährt. Ein Nachteil bei diesem Ansatz besteht darin, dass die Ausführung der nachfolgenden Blöcke blockiert wird, obwohl sie nicht miteinander verbunden sind, wenn die Ausführung eines Teils des Codes zu lange dauert. Stellen Sie sich einen Webserver vor, der auf mehrere Anforderungen für eine Ressource antworten muss.

Ein synchrones Ausführungsmodell blockiert die Anforderung jedes anderen Benutzers, bis die Verarbeitung der aktuellen Anforderung abgeschlossen ist. In einem solchen Fall, wie bei einem Webserver, muss jede Anforderung unabhängig von den anderen sein. Dies bedeutet, dass der Webserver nicht warten sollte, bis die aktuelle Anforderung ausgeführt wurde, bevor er auf Anforderungen anderer Benutzer reagiert.

Einfach ausgedrückt, sollte es Anfragen von neuen Benutzern annehmen, bevor die Anfragen früherer Benutzer unbedingt abgeschlossen werden müssen. Dies wird als asynchron bezeichnet. Asynchrone Programmierung bedeutet grundsätzlich kein wartendes oder nicht blockierendes Programmiermodell. Dasdart:async Das Paket erleichtert die Implementierung asynchroner Programmierblöcke in einem Dart-Skript.

Beispiel

Das folgende Beispiel veranschaulicht die Funktionsweise eines asynchronen Blocks besser.

Step 1 - Erstellen Sie eine contact.txt Datei wie unten angegeben and Speichern Sie es im Datenordner des aktuellen Projekts.

1, Tom 
2, John 
3, Tim 
4, Jane

Step 2 - Schreiben Sie ein Programm, das die Datei liest, ohne andere Teile der Anwendung zu blockieren.

import "dart:async"; 
import "dart:io";  

void main(){ 
   File file = new File( Directory.current.path+"\\data\\contact.txt"); 
   Future<String> f = file.readAsString();  
  
   // returns a futrue, this is Async method 
   f.then((data)=>print(data));  
   
   // once file is read , call back method is invoked  
   print("End of main");  
   // this get printed first, showing fileReading is non blocking or async 
}

Das output dieses Programms wird wie folgt sein -

End of main 
1, Tom 
2, John 
3, Tim 
4, Jan

Das "Ende von main" wird zuerst ausgeführt, während das Skript die Datei weiter liest. DasFuture Klasse, Teil von dart:asyncwird verwendet, um das Ergebnis einer Berechnung abzurufen, nachdem eine asynchrone Aufgabe abgeschlossen wurde. DieseFuture value wird dann verwendet, um nach Abschluss der Berechnung etwas zu tun.

Sobald der Lesevorgang abgeschlossen ist, wird die Ausführungssteuerung innerhalb übertragen "then()". Dies liegt daran, dass der Lesevorgang mehr Zeit in Anspruch nehmen kann und daher keinen anderen Teil des Programms blockieren möchte.

Dart Zukunft

Die Dart-Community definiert a Futureals "Mittel, um irgendwann in der Zukunft einen Wert zu erhalten." Einfach gesagt,Future objectssind ein Mechanismus zur Darstellung von Werten, die von einem Ausdruck zurückgegeben werden, dessen Ausführung zu einem späteren Zeitpunkt abgeschlossen sein wird. Mehrere von Darts eingebauten Klassen geben a zurückFuture wenn eine asynchrone Methode aufgerufen wird.

Dart ist eine Single-Threaded-Programmiersprache. Wenn ein Code den Ausführungsthread blockiert (z. B. durch Warten auf eine zeitaufwändige Operation oder Blockieren der E / A), friert das Programm effektiv ein.

Durch asynchrone Vorgänge kann Ihr Programm ausgeführt werden, ohne blockiert zu werden. Dart benutztFuture objects um asynchrone Operationen darzustellen.

Concurrencyist die gleichzeitige Ausführung mehrerer Befehlssequenzen. Dabei werden mehrere Aufgaben gleichzeitig ausgeführt.

Dart benutzt Isolatesals Werkzeug für parallele Arbeiten. Dasdart:isolate Paket ist Darts Lösung, um Single-Threaded-Dart-Code zu verwenden und der Anwendung zu ermöglichen, die verfügbare Hardware besser zu nutzen.

IsolatesWie der Name schon sagt, handelt es sich um isolierte Einheiten des laufenden Codes. Die einzige Möglichkeit, Daten zwischen ihnen zu senden, besteht darin, Nachrichten weiterzuleiten, wie Sie Nachrichten zwischen dem Client und dem Server weitergeben. Einisolate hilft dem Programm, Multicore-Mikroprozessoren sofort zu nutzen.

Beispiel

Nehmen wir ein Beispiel, um dieses Konzept besser zu verstehen.

import 'dart:isolate';  
void foo(var message){ 
   print('execution from foo ... the message is :${message}'); 
}  
void main(){ 
   Isolate.spawn(foo,'Hello!!'); 
   Isolate.spawn(foo,'Greetings!!'); 
   Isolate.spawn(foo,'Welcome!!'); 
   
   print('execution from main1'); 
   print('execution from main2'); 
   print('execution from main3'); 
}

Hier das spawn Methode der Isolate Klasse erleichtert das Ausführen einer Funktion, foo, parallel zum Rest unseres Codes. Dasspawn Funktion nimmt zwei Parameter -

  • die zu erzeugende Funktion und
  • Ein Objekt, das an die erzeugte Funktion übergeben wird.

Falls kein Objekt an die erzeugte Funktion übergeben werden kann, kann ihm ein NULL-Wert übergeben werden.

Die beiden Funktionen (foo and main)wird möglicherweise nicht jedes Mal in derselben Reihenfolge ausgeführt. Es gibt keine Garantie, wannfoo wird ausgeführt und wann main()wird ausgeführt. Die Ausgabe ist bei jeder Ausführung anders.

Ausgabe 1

execution from main1 
execution from main2 
execution from main3 
execution from foo ... the message is :Hello!!

Ausgabe 2

execution from main1 
execution from main2 
execution from main3 
execution from foo ... the message is :Welcome!! 
execution from foo ... the message is :Hello!! 
execution from foo ... the message is :Greetings!!

Aus den Ausgaben können wir schließen, dass der Dart-Code einen neuen erzeugen kann isolate Ausführen von Code wie der Art und Weise, wie Java- oder C # -Code einen neuen Thread starten kann.

Isolates unterscheiden sich von Threads darin, dass ein isolatehat ein eigenes Gedächtnis. Es gibt keine Möglichkeit, eine Variable zwischen ihnen zu teilenisolates- der einzige Weg, um zwischen zu kommunizieren isolates erfolgt über die Nachrichtenübermittlung.

Note - Die obige Ausgabe ist für verschiedene Hardware- und Betriebssystemkonfigurationen unterschiedlich.

V / s-Zukunft isolieren

Das asynchrone Ausführen komplexer Rechenarbeiten ist wichtig, um die Reaktionsfähigkeit von Anwendungen sicherzustellen. Dart Future ist ein Mechanismus zum Abrufen des Werts einer asynchronen Aufgabe, nachdem diese abgeschlossen wurde Dart Isolates sind ein Werkzeug, um Parallelität zu abstrahieren und auf praktischer Ebene umzusetzen.

Beim Testen von Einheiten wird jede einzelne Einheit einer Anwendung getestet. Es hilft dem Entwickler, kleine Funktionen zu testen, ohne die gesamte komplexe Anwendung auszuführen.

Der Pfeil external library Der Name "Test" bietet eine Standardmethode zum Schreiben und Ausführen von Komponententests.

Das Testen der Dart-Einheit umfasst die folgenden Schritte:

Step 1: Installing the "test" package

Um Pakete von Drittanbietern im aktuellen Projekt zu installieren, benötigen Sie die pubspec.yamlDatei. Installierentest packagesMachen Sie zuerst den folgenden Eintrag in der pubspec.yaml Datei -

dependencies: 
test:

Klicken Sie nach der Eingabe mit der rechten Maustaste auf pubspec.yamlDatei und Abhängigkeiten erhalten. Es wird das installieren"test"Paket. Unten ist ein Screenshot für das gleiche in derWebStorm Editor.

Pakete können von der installiert werden command lineauch. Geben Sie Folgendes in das Terminal ein -

pub get

Step 2: Importing the "test" package

import "package:test/test.dart";

Step 3 Writing Tests

Tests werden mit der Funktion der obersten Ebene angegeben test()während test assertions werden mit dem gemacht expect()Funktion. Für die Verwendung dieser Methoden sollten sie als installiert werdenpub Abhängigkeit.

Syntax

test("Description of the test ", () {  
   expect(actualValue , matchingValue) 
});

Das group()Funktion kann verwendet werden, um Tests zu gruppieren. Die Beschreibung jeder Gruppe wird am Anfang der Testbeschreibungen hinzugefügt.

Syntax

group("some_Group_Name", () { 
   test("test_name_1", () { 
      expect(actual, equals(exptected)); 
   });  
   test("test_name_2", () { 
      expect(actual, equals(expected)); 
   }); 
})

Beispiel 1: Ein bestehender Test

Das folgende Beispiel definiert eine Methode Add(). Diese Methode akzeptiert zwei ganzzahlige Werte und gibt eine Ganzzahl zurück, die die darstelltsum. Um dies zu testenadd() Methode -

Step 1 - Importieren Sie die test Paket wie unten angegeben.

Step 2 - Definieren Sie den Test mit dem test()Funktion. Hier dastest() Funktion verwendet die expect() Funktion zum Erzwingen einer Behauptung.

import 'package:test/test.dart';      
// Import the test package 

int Add(int x,int y)                  
// Function to be tested { 
   return x+y; 
}  
void main() { 
   // Define the test 
   test("test to check add method",(){  
      // Arrange 
      var expected = 30; 
      
      // Act 
      var actual = Add(10,20); 
      
      // Asset 
      expect(actual,expected); 
   }); 
}

Es sollte Folgendes erzeugen output - -

00:00 +0: test to check add method 
00:00 +1: All tests passed!

Beispiel 2: Ein fehlgeschlagener Test

Das subtract()Die unten definierte Methode hat einen logischen Fehler. Folgendetest überprüft das gleiche.

import 'package:test/test.dart'; 
int Add(int x,int y){ 
   return x+y; 
}
int Sub(int x,int y){ 
   return x-y-1; 
}  
void main(){ 
   test('test to check sub',(){ 
      var expected = 10;   
      // Arrange 
      
      var actual = Sub(30,20);  
      // Act 
      
      expect(actual,expected);  
      // Assert 
   }); 
   test("test to check add method",(){ 
      var expected = 30;   
      // Arrange 
      
      var actual = Add(10,20);  
      // Act 
      
      expect(actual,expected);  
      // Asset 
   }); 
}

Output - Der Testfall für die Funktion add() besteht aber den Test für subtract() schlägt wie unten gezeigt fehl.

00:00 +0: test to check sub 
00:00 +0 -1: test to check sub 
Expected: <10> 
Actual: <9> 
package:test  expect 
bin\Test123.dart 18:5  main.<fn> 
   
00:00 +0 -1: test to check add method 
00:00 +1 -1: Some tests failed.  
Unhandled exception: 
Dummy exception to set exit code. 
#0  _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:938) 
#1  _microtaskLoop (dart:async/schedule_microtask.dart:41)
#2  _startMicrotaskLoop (dart:async/schedule_microtask.dart:50) 
#3  _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394) 
#4  _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414) 
#5  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

Gruppieren von Testfällen

Sie können die gruppieren test casesdamit es Ihrem Testcode mehr Bedeutung verleiht. Wenn Sie viele habentest cases Dies hilft, viel saubereren Code zu schreiben.

Im angegebenen Code schreiben wir einen Testfall für die split() Funktion und die trimFunktion. Daher gruppieren wir diese Testfälle logisch und nennen sieString.

Beispiel

import "package:test/test.dart"; 
void main() { 
   group("String", () { 
      test("test on split() method of string class", () { 
         var string = "foo,bar,baz"; 
         expect(string.split(","), equals(["foo", "bar", "baz"])); 
      }); 
      test("test on trim() method of string class", () { 
         var string = "  foo "; 
         expect(string.trim(), equals("foo")); 
      }); 
   }); 
}

Output - Die Ausgabe fügt den Gruppennamen für jeden Testfall wie unten angegeben hinzu. -

00:00 +0: String test on split() method of string class 
00:00 +1: String test on trim() method of string class 
00:00 +2: All tests passed

Jede Webseite befindet sich in einem Browserfenster, das als Objekt betrachtet werden kann.

EIN Document objectstellt das HTML-Dokument dar, das in diesem Fenster angezeigt wird. Das Dokumentobjekt verfügt über verschiedene Eigenschaften, die sich auf andere Objekte beziehen, die den Zugriff auf und die Änderung von Dokumentinhalten ermöglichen.

Die Art und Weise, wie auf einen Dokumentinhalt zugegriffen und dieser geändert wird, wird als bezeichnet Document Object Model, oder DOM. Die Objekte sind in einer Hierarchie organisiert. Diese hierarchische Struktur gilt für die Organisation von Objekten in einem Webdokument.

  • Window- Ganz oben auf der Hierarchie. Es ist das äußerste Element der Objekthierarchie.

  • Document- Jedes HTML-Dokument, das in ein Fenster geladen wird, wird zu einem Dokumentobjekt. Das Dokument enthält den Inhalt der Seite.

  • Elements- den Inhalt einer Webseite darstellen. Beispiele sind die Textfelder, der Seitentitel usw.

  • Nodes - sind häufig Elemente, können aber auch Attribute, Text, Kommentare und andere DOM-Typen sein.

Hier ist eine einfache Hierarchie einiger wichtiger DOM-Objekte -

Dart bietet die dart:htmlBibliothek zum Bearbeiten von Objekten und Elementen im DOM. Konsolenbasierte Anwendungen können das nicht verwendendart:htmlBibliothek. Importieren Sie, um die HTML-Bibliothek in den Webanwendungen zu verwendendart:html - -

import 'dart:html';

Weiter werden wir einige diskutieren DOM Operations im nächsten Abschnitt.

DOM-Elemente finden

Das dart:html Bibliothek bietet die querySelector Funktion zum Suchen nach Elementen im DOM.

Element querySelector(String selectors);

Das querySelector() Die Funktion gibt das erste Element zurück, das der angegebenen Gruppe von Selektoren entspricht. "selectors sollte eine Zeichenfolge sein, die die unten angegebene CSS-Auswahlsyntax verwendet

var element1 = document.querySelector('.className'); 
var element2 = document.querySelector('#id');

Beispiel: DOM bearbeiten

Befolgen Sie die unten angegebenen Schritte in der Webstorm-IDE -

Step 1 - Datei NewProject → Geben Sie am Speicherort den Projektnamen als ein DemoWebApp.

Step 1 - Wählen Sie im Abschnitt "Beispielinhalt generieren" SimpleWebApplication.

Es wird ein Beispielprojekt erstellt. DemoWebApp. Da ist einpubspec.yaml Datei mit den Abhängigkeiten, die heruntergeladen werden müssen.

name: 'DemoWebApp' 
version: 0.0.1 
description: An absolute bare-bones web app. 

#author: Your Name <[email protected]> 
#homepage: https://www.example.com  
environment:   
   sdk: '>=1.0.0 <2.0.0'  
dependencies:   
   browser: '>=0.10.0 <0.11.0'   dart_to_js_script_rewriter: '^1.0.1'  
transformers: 
- dart_to_js_script_rewriter

Wenn Sie mit dem Web verbunden sind, werden diese automatisch heruntergeladen. Andernfalls können Sie mit der rechten Maustaste auf klicken pubspec.yaml und Abhängigkeiten erhalten.

Im Webordner finden Sie drei Dateien: Index.html, main.dart, und style.css

Index.html

<!DOCTYPE html>   
<html> 
   <head>     
      <meta charset = "utf-8">     
      <meta http-equiv = "X-UA-Compatible" content = "IE = edge">     
      <meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
      <meta name = "scaffolded-by" content = "https://github.com/google/stagehand">
      <title>DemoWebApp</title>     
      <link rel = "stylesheet" href = "styles.css">     
      <script defer src = "main.dart" type = "application/dart"></script>
      <script defer src = "packages/browser/dart.js"></script> 
   </head>
   
   <body>   
      <h1>
         <div id = "output"></div> 
      </h1>  
   </body> 
</html>

Main.dart

import 'dart:html';  
void main() {   
   querySelector('#output').text = 'Your Dart web dom app is running!!!.'; 
}

Führen Sie die aus index.htmlDatei; Auf Ihrem Bildschirm wird die folgende Ausgabe angezeigt.

Handhabung des Events

Das dart:html Bibliothek bietet die onClickVeranstaltung für DOM Elements. Die Syntax zeigt, wie ein Element mit einem Strom von Klickereignissen umgehen kann.

querySelector('#Id').onClick.listen(eventHanlderFunction);

Das querySelector() Funktion gibt das Element aus dem angegebenen DOM und zurück onClick.listen() wird ein nehmen eventHandlerMethode, die aufgerufen wird, wenn ein Klickereignis ausgelöst wird. Die Syntax voneventHandler ist unten angegeben -

void eventHanlderFunction (MouseEvent event){ }

Nehmen wir nun ein Beispiel, um das Konzept der Ereignisbehandlung in Dart zu verstehen.

TestEvent.html

<!DOCTYPE html> 
<html> 
   <head> 
      <meta charset = "utf-8"> 
      <meta http-equiv = "X-UA-Compatible" content = "IE = edge"> 
      <meta name = "viewport" content = "width = device-width, initial-scale = 1.0"> 
      <meta name = "scaffolded-by" content ="https://github.com/google/stagehand"> 
      <title>DemoWebApp</title> 
      <link rel = "stylesheet" href = "styles.css"> 
      <script defer src = "TestEvent.dart" type="application/dart"></script> 
      <script defer src = "packages/browser/dart.js"></script> 
   </head> 
   
   <body> 
      <div id = "output"></div> 
      <h1> 
         <div> 
            Enter you name : <input type = "text" id = "txtName"> 
            <input type = "button" id = "btnWish" value="Wish"> 
         </div> 
      </h1> 
      <h2 id = "display"></h2> 
   </body>
   
</html>

TestEvent.dart

import 'dart:html'; 
void main() { 
   querySelector('#btnWish').onClick.listen(wishHandler); 
}  
void wishHandler(MouseEvent event){ 
   String name = (querySelector('#txtName')  as InputElement).value; 
   querySelector('#display').text = 'Hello Mr.'+ name; 
}

Ausgabe