Programowanie w rzutki - szybki przewodnik

Dart to język zorientowany obiektowo ze składnią w stylu C, który można opcjonalnie przekształcić w JavaScript. Obsługuje zróżnicowany zakres pomocy programistycznych, takich jak interfejsy, klasy, kolekcje, typy ogólne i opcjonalne wpisywanie.

Dart może być szeroko stosowany do tworzenia aplikacji jednostronicowych. Aplikacje jednostronicowe dotyczą tylko witryn i aplikacji internetowych. Aplikacje jednostronicowe umożliwiają nawigację między różnymi ekranami serwisu bez ładowania innej strony w przeglądarce. Klasycznym przykładem jestGMail ─ po kliknięciu wiadomości w skrzynce odbiorczej przeglądarka pozostaje na tej samej stronie internetowej, ale kod JavaScript ukrywa skrzynkę odbiorczą i wyświetla treść wiadomości na ekranie.

Firma Google wydała specjalną kompilację Chromium - plik Dart VM. Korzystanie z Dartium oznacza, że ​​nie musisz kompilować kodu do JavaScript, dopóki nie będziesz gotowy do testowania w innych przeglądarkach.

Poniższa tabela porównuje funkcje Dart i JavaScript.

Funkcja Strzałka JavaScript
System typów Opcjonalne, dynamiczne Słaby, dynamiczny
Zajęcia Tak, pojedyncze dziedzictwo Prototypowe
Interfejsy Tak, wiele interfejsów Nie
Konkurencja Tak, z izolatami Tak, z pracownikami WWW HTML5

Ten samouczek zapewnia podstawową znajomość języka programowania Dart.

W tym rozdziale omówiono konfigurowanie środowiska wykonawczego dla Dart na platformie Windows.

Wykonywanie skryptu online za pomocą DartPad

Możesz przetestować swoje skrypty online, korzystając z edytora online pod adresem https://dartpad.dartlang.org/. Dart Editor wykonuje skrypt i wyświetla zarówno HTML, jak i dane wyjściowe konsoli. Edytor online jest dostarczany z zestawem wstępnie ustawionych próbek kodu.

Zrzut ekranu z Dartpad redaktor jest podany poniżej -

Dartpad umożliwia także bardziej restrykcyjne kodowanie. Można to osiągnąć, zaznaczając opcję Tryb silny w prawym dolnym rogu edytora. Tryb silny pomaga w -

  • Silniejsze sprawdzanie statyczne i dynamiczne
  • Idiomatyczne generowanie kodu JavaScript dla lepszej interoperacyjności.

Możesz wypróbować następujący przykład za pomocą Dartpad

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

Kod wyświetli następujące dane wyjściowe

hello world

Konfigurowanie środowiska lokalnego

W tej sekcji zobaczmy, jak skonfigurować środowisko lokalne.

Korzystanie z edytora tekstu

Przykładami kilku edytorów są Notatnik Windows, Notepad ++, Emacs, vim lub vi, itp. Edytory mogą się różnić w zależności od systemu operacyjnego. Pliki źródłowe mają zazwyczaj rozszerzenie „.dart”.

Instalowanie zestawu Dart SDK

Obecna stabilna wersja Dart to 1.21.0. Plikdart sdk można pobrać z -

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

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

Zrzut ekranu instalacji Dart SDK znajduje się poniżej -

Po zakończeniu instalacji zestawu SDK ustaw zmienną środowiskową PATH na -

<dart-sdk-path>\bin

Weryfikacja instalacji

Aby sprawdzić, czy Dart został pomyślnie zainstalowany, otwórz wiersz polecenia i wprowadź następujące polecenie -

Dart

Jeśli instalacja się powiedzie, zostanie wyświetlone środowisko wykonawcze rzutek.

Wsparcie IDE

Mnóstwo IDE obsługuje skrypty w Dart. Przykłady zawierająEclipse, IntelliJ, i WebStorm z mózgów Jet.

Poniżej podano kroki konfiguracji środowiska Dart przy użyciu WebStrom IDE.

Instalowanie WebStorm

Plik instalacyjny dla WebStorm można pobrać z https://www.jetbrains.com/webstorm/download/#section=windows-version.

Plik instalacyjny WebStorm jest dostępny dla systemów Mac OS, Windows i Linux.

Po pobraniu plików instalacyjnych wykonaj czynności podane poniżej -

  • Zainstaluj Dart SDK: zapoznaj się z krokami wymienionymi powyżej

  • Utwórz nowy projekt Dart i skonfiguruj obsługę Dart

  • Aby utworzyć nowy projekt Dart,

    • Kliknij Create New Project z ekranu powitalnego

    • W następnym oknie dialogowym kliknij Dart

  • Jeśli nie określono wartości dla Dart SDKścieżka, a następnie podaj ścieżkę do zestawu SDK. Na przykład ścieżka SDK może mieć postać<dart installation directory>/dart/dartsdk.

Dodaj plik Dart do projektu

Aby dodać plik Dart do projektu -

  • Kliknij prawym przyciskiem myszy projekt
  • Nowy → Plik do rzutek
  • Wpisz nazwę skryptu Dart

Zrzut ekranu edytora WebStorm znajduje się poniżej -

Narzędzie dart2js

Plik dart2jsnarzędzie kompiluje kod DART do JavaScript. Kompilowanie kodu Dart do JS umożliwia uruchomienie skryptu Dart w przeglądarkach, które nie obsługują maszyny wirtualnej Dart.

Narzędzie dart2js jest dostarczane jako część zestawu Dart SDK i można je znaleźć w /dartsdk/bin folder.

Aby skompilować Dart do JavaScript, wpisz następujące polecenie w terminalu

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

To polecenie tworzy plik, który zawiera odpowiednik JavaScript twojego kodu Dart. Kompletny samouczek dotyczący korzystania z tego narzędzia można znaleźć na oficjalnej stronie Dart.

Składnia definiuje zestaw reguł dotyczących pisania programów. Każda specyfikacja języka definiuje własną składnię. Program Dart składa się z -

  • Zmienne i operatory
  • Classes
  • Functions
  • Wyrażenia i konstrukcje programistyczne
  • Podejmowanie decyzji i konstrukcje pętlowe
  • Comments
  • Biblioteki i pakiety
  • Typedefs
  • Struktury danych reprezentowane jako kolekcje / typy ogólne

Twój pierwszy kod do rzutek

Zacznijmy od tradycyjnego przykładu „Hello World” -

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

Plik main()funkcja jest predefiniowaną metodą w Dart. Ta metoda działa jako punkt wejścia do aplikacji. Skrypt Dart wymaga rozszerzeniamain() metoda wykonania. print() jest predefiniowaną funkcją, która wypisuje określony łańcuch lub wartość na standardowe wyjście, tj. terminal.

Wynik powyższego kodu będzie -

Hello World!

Wykonaj program do gry w rzutki

Możesz uruchomić program Dart na dwa sposoby -

  • Przez terminal
  • Poprzez WebStorm IDE

Przez terminal

Aby wykonać program Dart za pośrednictwem terminala -

  • Przejdź do ścieżki bieżącego projektu
  • Wpisz następujące polecenie w oknie terminala
dart file_name.dart

Poprzez WebStorm IDE

Aby uruchomić program Dart za pośrednictwem WebStorm IDE -

  • Kliknij prawym przyciskiem myszy plik skryptu Dart w środowisku IDE. (Plik powinien zawierać rozszerzeniemain() funkcja umożliwiająca wykonanie)

  • Kliknij na ‘Run <file_name>’opcja. Zrzut ekranu tego samego znajduje się poniżej -

Alternatywnie można kliknąć

przycisk lub użyć skrótuCtrl+Shift+F10 aby wykonać skrypt Dart.

Opcje wiersza poleceń Dart

Opcje wiersza polecenia Dart służą do modyfikowania wykonywania skryptu Dart. Typowe opcje wiersza poleceń dla Dart obejmują:

Sr.No Opcja i opis wiersza poleceń
1 -c or --c

Włącza zarówno potwierdzenia, jak i sprawdzanie typów (tryb zaznaczenia).

2 --version

Wyświetla informacje o wersji maszyny wirtualnej.

3 --packages <path>

Określa ścieżkę do pliku konfiguracji rozpoznawania pakietów.

4 -p <path>

Określa, gdzie znaleźć zaimportowane biblioteki. Tej opcji nie można używać z --packages.

5 -h or --help

Wyświetla pomoc.

Włączanie trybu zaznaczonego

Programy do darta działają w dwóch trybach, a mianowicie -

  • Tryb zaznaczony
  • Tryb produkcyjny (domyślny)

Zaleca się uruchamianie maszyny wirtualnej Dart w programie checked modepodczas programowania i testowania, ponieważ dodaje ostrzeżenia i błędy, aby wspomóc proces programowania i debugowania. Tryb zaznaczony wymusza różne sprawdzenia, takie jak sprawdzanie typu itp. Aby włączyć tryb zaznaczony, dodaj opcję -c lub –-checked przed nazwą pliku skryptu podczas uruchamiania skryptu.

Jednak aby zapewnić korzyści związane z wydajnością podczas uruchamiania skryptu, zaleca się uruchomienie skryptu w formacie production mode.

Rozważ następujące Test.dart plik skryptu -

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

Uruchom skrypt, wpisując -

dart Test.dart

Chociaż występuje niezgodność typów, skrypt jest wykonywany pomyślnie, ponieważ tryb zaznaczenia jest wyłączony. Skrypt zwróci następujący wynik -

hello

Teraz spróbuj wykonać skrypt z opcją „- - zaznaczone” lub „-c” -

dart -c Test.dart

Lub,

dart - - checked Test.dart

Maszyna wirtualna Dart zgłosi błąd informujący o niezgodności typu.

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)

Identyfikatory w Dart

Identyfikatory to nazwy nadawane elementom w programie, takim jak zmienne, funkcje itp. Reguły dotyczące identyfikatorów to -

Identyfikatory mogą zawierać zarówno znaki, jak i cyfry. Jednak identyfikator nie może zaczynać się od cyfry.

  • Identyfikatory nie mogą zawierać symboli specjalnych z wyjątkiem podkreślenia (_) lub znaku dolara ($).

  • Identyfikatory nie mogą być słowami kluczowymi.

  • Muszą być wyjątkowe.

  • W identyfikatorach jest rozróżniana wielkość liter.

  • Identyfikatory nie mogą zawierać spacji.

W poniższych tabelach przedstawiono kilka przykładów prawidłowych i nieprawidłowych identyfikatorów -

Prawidłowe identyfikatory Nieprawidłowe identyfikatory
Imię Var
Imię Imię
num1 Imię
$ wynik 1liczba

Słowa kluczowe w Dart

Słowa kluczowe mają specjalne znaczenie w kontekście języka. W poniższej tabeli wymieniono niektóre słowa kluczowe w Dart.

streszczenie 1 kontyntynuj fałszywy Nowy to
jak 1 domyślna finał zero rzucać
zapewniać odroczony 1 Wreszcie operator 1 prawdziwe
async 2 zrobić dla Część 1 próbować
async * 2 dynamiczny 1 zdobądź 1 wyrzucić ponownie typedef 1
czekaj 2 jeszcze gdyby powrót var
przerwa enum narzędzia 1 zestaw 1 unieważnić
walizka eksport 1 import 1 statyczne 1 podczas
łapać zewnętrzne 1 w Wspaniały z
klasa rozciąga się jest przełącznik wydajność 2
konst fabryka 1 biblioteka 1 synchronizacja * 2 wydajność * 2

Białe znaki i podziały wierszy

Dart ignoruje spacje, tabulatory i znaki nowej linii, które pojawiają się w programach. Możesz swobodnie używać spacji, tabulatorów i znaków nowej linii w swoim programie i możesz swobodnie formatować i wcinać swoje programy w schludny i spójny sposób, dzięki czemu kod jest łatwy do odczytania i zrozumienia.

Dart rozróżnia wielkość liter

Dart rozróżnia wielkość liter. Oznacza to, że Dart rozróżnia wielkie i małe litery.

Instrukcje kończą się średnikiem

Każdy wiersz instrukcji nazywany jest instrukcją. Każda instrukcja w postaci strzałki musi kończyć się średnikiem (;). Pojedynczy wiersz może zawierać wiele instrukcji. Jednak te instrukcje muszą być oddzielone średnikiem.

Komentarze w Dart

Komentarze są sposobem na poprawę czytelności programu. Komentarze mogą służyć do dołączania dodatkowych informacji o programie, takich jak autor kodu, wskazówki dotyczące funkcji / konstrukcji itp. Komentarze są ignorowane przez kompilator.

Dart obsługuje następujące typy komentarzy -

  • Single-line comments ( // ) - Każdy tekst między „//” a końcem linii jest traktowany jako komentarz

  • Multi-line comments (/* */) - Te komentarze mogą obejmować wiele linii.

Przykład

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

Programowanie obiektowe w Dart

Dart to język zorientowany obiektowo. Object Orientation to paradygmat tworzenia oprogramowania, który jest zgodny z modelowaniem w świecie rzeczywistym. Object Orientation traktuje program jako zbiór obiektów, które komunikują się ze sobą za pomocą mechanizmu zwanego metodami.

  • Object- Obiekt jest reprezentacją dowolnego podmiotu w czasie rzeczywistym. Zgodnie z Grady Brooch, każdy przedmiot musi mieć trzy cechy -

    • State - opisywany atrybutami obiektu.

    • Behavior - opisuje, jak obiekt będzie działał.

    • Identity - unikalna wartość, która odróżnia obiekt od zestawu podobnych takich obiektów.

  • Class- Klasa w zakresie OOP to plan tworzenia obiektów. Klasa hermetyzuje dane dla obiektu.

  • Method - Metody ułatwiają komunikację między obiektami.

Przykład: Dart i Object Orientation

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

Powyższy przykład definiuje klasę TestClass. Klasa ma metodędisp(). Metoda wypisuje ciąg „Hello World” na terminalu. Słowo kluczowe new tworzy obiekt klasy. Obiekt wywołuje metodędisp().

Kod powinien dawać następujące efekty output -

Hello World

Jedną z najbardziej podstawowych cech języka programowania jest zestaw obsługiwanych przez niego typów danych. Są to typy wartości, które mogą być reprezentowane i manipulowane w języku programowania.

Język Dart obsługuje następujące typy:

  • Numbers
  • Strings
  • Booleans
  • Lists
  • Maps

Liczby

Liczby w Dart są używane do reprezentowania literałów liczbowych. Strzałka numeryczna występuje w dwóch wersjach -

  • Integer- Wartości całkowite reprezentują wartości nieułamkowe, tj. Wartości liczbowe bez kropki dziesiętnej. Na przykład wartość „10” jest liczbą całkowitą. Literały całkowite są reprezentowane przy użyciuint słowo kluczowe.

  • Double- Dart obsługuje również ułamkowe wartości liczbowe, tj. Wartości z kropkami dziesiętnymi. Typ danych Double w Dart reprezentuje 64-bitową (podwójnej precyzji) liczbę zmiennoprzecinkową. Na przykład wartość „10,10”. Słowo kluczowedouble służy do reprezentowania literałów zmiennoprzecinkowych.

Smyczki

Ciągi znaków reprezentują ciąg znaków. Na przykład, jeśli chcesz przechowywać pewne dane, takie jak nazwa, adres itp., Powinieneś użyć typu danych łańcuchowych. Ciąg Dart to sekwencja jednostek kodu UTF-16.Runes są używane do reprezentowania sekwencji jednostek kodu UTF-32.

Słowo kluczowe Stringsłuży do reprezentowania literałów ciągów. Wartości ciągów są osadzone w pojedynczych lub podwójnych cudzysłowach.

Boolean

Typ danych Boolean reprezentuje wartości logiczne prawda i fałsz. Dart używabool słowo kluczowe reprezentujące wartość logiczną.

Lista i mapa

Lista typów danych i mapa są używane do reprezentowania kolekcji obiektów. ZAListjest uporządkowaną grupą obiektów. Typ danych List w Dart jest synonimem pojęcia tablicy w innych językach programowania. PlikMaptyp danych reprezentuje zestaw wartości jako pary klucz-wartość. Plikdart: core Library umożliwia tworzenie i manipulowanie tymi kolekcjami za pomocą odpowiednio predefiniowanych klas List i Map.

Typ dynamiczny

Dart jest opcjonalnym językiem maszynopisu. Jeśli typ zmiennej nie jest jawnie określony, jest to typ zmiennejdynamic. Plikdynamic Słowo kluczowe może być również używane jawnie jako adnotacja typu.

Zmienna to „nazwane miejsce w pamięci”, które przechowuje wartości. Innymi słowy, działa jako kontener dla wartości w programie. Nazwy zmiennych nazywane są identyfikatorami. Poniżej przedstawiono zasady nazewnictwa identyfikatora -

  • Identyfikatory nie mogą być słowami kluczowymi.

  • Identyfikatory mogą zawierać litery i cyfry.

  • Identyfikatory nie mogą zawierać spacji ani znaków specjalnych, z wyjątkiem podkreślenia (_) i znaku dolara ($).

  • Nazwy zmiennych nie mogą zaczynać się od liczby.

Składnia typu

Zmienna musi zostać zadeklarowana przed jej użyciem. Dart używa słowa kluczowego var, aby osiągnąć to samo. Składnia deklarowania zmiennej jest taka, jak podano poniżej -

var name = 'Smith';

Wszystkie zmienne w dart przechowują odniesienie do wartości, a nie zawierają wartość. Zmienna o nazwie name zawiera odniesienie do obiektu String o wartości „Smith”.

Wsporniki do rzutek type-checkingpoprzedzając nazwę zmiennej typem danych. Sprawdzanie typu zapewnia, że ​​zmienna zawiera tylko dane specyficzne dla danego typu danych. Składnię tego samego podano poniżej -

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

Rozważmy następujący przykład -

void main() { 
   String name = 1; 
}

Powyższy fragment spowoduje ostrzeżenie, ponieważ wartość przypisana do zmiennej nie pasuje do typu danych zmiennej.

Wynik

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

Wszystkie niezainicjowane zmienne mają początkową wartość null. Dzieje się tak, ponieważ Dart traktuje wszystkie wartości jako obiekty. Poniższy przykład ilustruje to samo -

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

Wynik

Null

Dynamiczne słowo kluczowe

Zmienne zadeklarowane bez typu statycznego są niejawnie deklarowane jako dynamiczne. Zmienne można również deklarować za pomocą dynamicznego słowa kluczowego zamiast słowa kluczowego var.

Poniższy przykład ilustruje to samo.

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

Wynik

tom

Finał i Konst

Plik final i constsłowo kluczowe służy do deklarowania stałych. Dart zapobiega modyfikowaniu wartości zmiennej zadeklarowanej przy użyciu słowa kluczowego final lub const. Tych słów kluczowych można używać w połączeniu z typem danych zmiennej lub zamiastvar słowo kluczowe.

Plik constsłowo kluczowe jest używane do reprezentowania stałej czasu kompilacji. Zmienne zadeklarowane przy użyciuconst słowa kluczowe są niejawnie ostateczne.

Składnia: końcowe słowo kluczowe

final variable_name

LUB

final data_type  variable_name

Składnia: const Keyword

const variable_name

LUB

const data_type variable_name

Przykład - końcowe słowo kluczowe

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

Wynik

12

Przykład - słowo kluczowe const

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

Powyższy przykład deklaruje dwie stałe, pi i area, używając constsłowo kluczowe. Plikarea wartością zmiennej jest stała czasu kompilacji.

Wynik

The output is 452.15999999999997

Note - Tylko constzmienne mogą służyć do obliczania stałej czasu kompilacji. Stałe czasu kompilacji to stałe, których wartości zostaną określone w czasie kompilacji

Przykład

Dart zgłasza wyjątek, jeśli zostanie podjęta próba zmodyfikowania zmiennych zadeklarowanych za pomocą finallub słowo kluczowe const. Poniższy przykład ilustruje to samo -

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

Kod podany powyżej zwróci następujący błąd jako 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)

Wyrażenie to specjalny rodzaj instrukcji, której wynikiem jest wartość. Każde wyrażenie składa się z -

  • Operands - Reprezentuje dane

  • Operator - Określa, w jaki sposób operandy będą przetwarzane w celu uzyskania wartości.

Rozważmy następujące wyrażenie - „2 + 3”. W tym wyrażeniu 2 i 3 sąoperands a symbol „+” (plus) to operator.

W tym rozdziale omówimy operatory dostępne w Dart.

  • Operatory arytmetyczne
  • Operatory równości i relacyjne
  • Test typu Operatory
  • Operatory bitowe
  • Operatory przypisania
  • Operatory logiczne

Operatory arytmetyczne

W poniższej tabeli przedstawiono operatory arytmetyczne obsługiwane przez Dart.

Pokaż przykłady

Sr.No Operatory i znaczenie
1 +

Dodaj

2

Odejmować

3 -expr

Jednoargumentowy minus, znany również jako negacja (odwróć znak wyrażenia)

4 *

Zwielokrotniać

5 /

Podzielić

6 ~/

Dzielenie, zwracanie wyniku będącego liczbą całkowitą

7 %

Pobierz resztę z dzielenia liczb całkowitych (modulo)

8 ++

Przyrost

9 --

Zmniejszenie

Operatory równości i relacyjne

Operatory relacyjne testują lub definiują rodzaj relacji między dwiema jednostkami. Operatory relacyjne zwracają wartość logiczną, tj. Prawda / fałsz.

Załóżmy, że wartość A to 10, a B to 20.

Pokaż przykłady

Operator Opis Przykład
> Lepszy niż (A> B) jest fałszywe
< Mniej niż (A <B) jest Prawdą
> = Większe bądź równe (A> = B) jest fałszywe
<= Mniejsze lub równe (A <= B) jest Prawdą
== Równość (A == B) jest fałszywe
! = Nie równe (A! = B) jest Prawdą

Test typu Operatory

Te operatory są przydatne do sprawdzania typów w czasie wykonywania.

Pokaż przykłady

Operator Znaczenie
jest Prawda, jeśli obiekt ma określony typ
jest! Fałsz, jeśli obiekt ma określony typ

Operatory bitowe

W poniższej tabeli wymieniono operatory bitowe dostępne w Dart i ich role -

Pokaż przykłady

Operator Opis Przykład
Bitowe AND a & b Zwraca jedynkę na każdej pozycji bitowej, dla której odpowiednie bity obu operandów są jedynkami.
Bitowe OR a | b Zwraca jedynkę na każdej pozycji bitowej, dla której odpowiednie bity jednego lub obu operandów są jedynkami.
Bitowe XOR a ^ b Zwraca jedynkę na każdej pozycji bitowej, dla której odpowiadające bity jednego z nich, ale nie obu, są jedynkami.
Bitowe NIE ~ a Odwraca bity swojego operandu.
Przesunięcie w lewo a ≪ b Przesuwa a w reprezentacji binarnej b (<32) bity w lewo, przesuwając zera od prawej.
Signpropagating right shift a ≫ b Przesuwa a w binarnej reprezentacji b (<32) bitów w prawo, odrzucając przesunięte bity.

Operatory przypisania

W poniższej tabeli wymieniono operatory przypisania dostępne w Dart.

Pokaż przykłady

Sr.No Operator i opis
1 =(Simple Assignment )

Przypisuje wartości z prawego operandu do lewego operandu

Ex: C = A + B przypisze wartość A + B do C.

2 ??=

Przypisz wartość tylko wtedy, gdy zmienna ma wartość null

3 +=(Add and Assignment)

Dodaje prawy operand do lewego operandu i przypisuje wynik do lewego operandu.

Ex: C + = A jest równoważne C = C + A

4 ─=(Subtract and Assignment)

Odejmuje prawy operand od lewego operandu i przypisuje wynik lewemu operandowi.

Ex: C - = A jest równoważne C = C - A

5 *=(Multiply and Assignment)

Mnoży prawy operand przez lewy operand i przypisuje wynik lewemu operandowi.

Ex: C * = A jest równoważne C = C * A

6 /=(Divide and Assignment)

Dzieli lewy operand z prawym operandem i przypisuje wynik lewemu operandowi.

Note - Ta sama logika dotyczy operatorów bitowych, więc staną się ≪ =, ≫ =, ≫ =, ≫ =, | = i ^ =.

Operatory logiczne

Operatory logiczne służą do łączenia dwóch lub więcej warunków. Operatory logiczne zwracają wartość logiczną. Załóżmy, że wartość zmiennej A wynosi 10, a B wynosi 20.

Pokaż przykłady

Operator Opis Przykład
&&

And - Operator zwraca prawdę tylko wtedy, gdy wszystkie podane wyrażenia zwracają prawdę

(A> 10 && B> 10) jest fałszywe.
||

OR - Operator zwraca prawdę, jeśli przynajmniej jedno z podanych wyrażeń zwróci prawdę

(A> 10 || B> 10) jest Prawdą.
!

NOT- Operator zwraca odwrotność wyniku wyrażenia. Na przykład:! (7> 5) zwraca fałsz

! (A> 10) jest Prawdą.

Wyrażenia warunkowe

Dart ma dwa operatory, które pozwalają ocenić wyrażenia, które w innym przypadku wymagałyby instrukcji ifelse -

stan: schorzenie ? wyr1: wyr2

Jeśli warunek jest prawdziwy, obliczane jest wyrażenie expr1(i zwraca jego wartość); w przeciwnym razie oblicza i zwraca wartośćexpr2.

wyrażenie1 ?? wyr2

Gdyby expr1jest różna od null, zwraca swoją wartość; w przeciwnym razie oblicza i zwraca wartośćexpr2

Przykład

Poniższy przykład pokazuje, jak można użyć wyrażenia warunkowego w Dart -

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

Wytworzy następujący wynik -

value lesser than or equal to 10

Przykład

Weźmy inny przykład -

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

Wytworzy następujący wynik -

12

Czasami niektóre instrukcje wymagają ponownego wykonania. Pętle to idealny sposób na zrobienie tego samego. Pętla reprezentuje zestaw instrukcji, które należy powtórzyć. W kontekście pętli powtórzenie jest określane jakoiteration.

Poniższy rysunek ilustruje klasyfikację pętli -

Zacznijmy dyskusję od Definite Loops. Pętla, której liczba iteracji jest określona / ustalona, ​​jest określana jakodefinite loop.

Sr.No Pętla i opis
1 dla pętli

Plik forpętla jest implementacją określonej pętli. Pętla for wykonuje blok kodu określoną liczbę razy. Może być używany do iteracji po ustalonym zestawie wartości, takim jak tablica

2 dla… w pętli

Pętla for ... in służy do przeglądania właściwości obiektu.

Przechodząc dalej, omówmy teraz nieokreślone pętle. Nieokreślona pętla jest używana, gdy liczba iteracji w pętli jest nieokreślona lub nieznana. Nieokreślone pętle mogą być realizowane za pomocą -

Sr.No Pętla i opis
1 while Loop

Pętla while wykonuje instrukcje za każdym razem, gdy określony warunek przyjmuje wartość true. Innymi słowy, pętla ocenia warunek przed wykonaniem bloku kodu.

2 zrób… while Loop

Pętla do… while jest podobna do pętli while, z tą różnicą, że pętla do ... while nie ocenia warunku po raz pierwszy wykonywana w pętli.

Przejdźmy teraz i omówmy Loop Control Statements Dart.

Sr.No Oświadczenie i opis kontroli
1 instrukcja break

Plik breakinstrukcja służy do usunięcia kontroli z konstrukcji. Za pomocąbreakw pętli powoduje, że program wychodzi z pętli. Poniżej znajduje się przykładbreak komunikat.

2 dalej Oświadczenie

Plik continue instrukcja pomija kolejne instrukcje w bieżącej iteracji i przenosi sterowanie z powrotem na początek pętli.

Używanie etykiet do sterowania przepływem

ZA labelto po prostu identyfikator, po którym następuje dwukropek (:), który jest stosowany do instrukcji lub bloku kodu. Etykieta może być używana zbreak i continue aby dokładniej kontrolować przepływ.

Podziały wiersza nie są dozwolone między ‘continue’ lub ‘break’instrukcja i nazwa etykiety. Ponadto między nazwą etykiety a skojarzoną pętlą nie powinno być żadnych innych instrukcji.

Przykład: etykieta z przerwą

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

Następujące output jest wyświetlany po pomyślnym wykonaniu powyższego kodu.

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

Przykład: etykieta z kontynuacją

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

Poniższe dane wyjściowe są wyświetlane po pomyślnym wykonaniu powyższego kodu.

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

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

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

Konstrukcja warunkowa / decyzyjna ocenia warunek przed wykonaniem instrukcji.

Konstrukcje warunkowe w Dart są sklasyfikowane w poniższej tabeli.

Sr.No Oświadczenie i opis
1 if komunikat

Na if instrukcja składa się z wyrażenia logicznego, po którym następuje co najmniej jedna instrukcja.

2 If ... Else Statement

Na if może następować opcjonalnie elseblok. Plikelse blok zostanie wykonany, jeśli wyrażenie logiczne przetestowane przez if blok zwraca wartość false.

3 inaczej… jeśli Ladder

Plik else…if ladderjest przydatne do testowania wielu warunków. Poniżej znajduje się składnia tego samego.

4 switch… case Instrukcja

Instrukcja switch ocenia wyrażenie, dopasowuje wartość wyrażenia do klauzuli case i wykonuje instrukcje powiązane z tym przypadkiem.

Numery rzutek można sklasyfikować jako -

  • int- Liczba całkowita o dowolnej wielkości. Plikint typ danych służy do reprezentowania liczb całkowitych.

  • double- 64-bitowe (podwójnej precyzji) liczby zmiennoprzecinkowe, zgodnie ze standardem IEEE 754. Plikdouble typ danych służy do reprezentowania liczb ułamkowych

Plik num typ jest dziedziczony przez int i doublerodzaje. Plikdart core library umożliwia wykonywanie wielu operacji na wartościach liczbowych.

Składnia deklarowania liczby jest taka, jak podano poniżej -

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

Przykład

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

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

Wytworzy następujący wynik -

10 
10.5

Note - The Dart VM zgłosi wyjątek, jeśli wartości ułamkowe są przypisane do zmiennych całkowitych.

Rozbiór gramatyczny zdania

Plik parse()Funkcja statyczna umożliwia przekształcenie ciągu zawierającego literał numeryczny w liczbę. Poniższa ilustracja pokazuje to samo -

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

Powyższy kod da w wyniku następujące dane wyjściowe -

12 
10.91

Funkcja analizy generuje plik FormatExceptionjeśli zostanie przekazana dowolna wartość inna niż cyfry. Poniższy kod pokazuje, jak przekazać wartość alfanumeryczną do plikuparse() funkcjonować.

Przykład

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

Powyższy kod da w wyniku następujące dane wyjściowe -

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)

Właściwości liczbowe

W poniższej tabeli wymieniono właściwości obsługiwane przez numery rzutek.

Sr.No Właściwość i opis
1 hashcode

Zwraca kod skrótu dla wartości liczbowej.

2 isFinite

Prawda, jeśli liczba jest skończona; w przeciwnym razie fałsz.

3 isInfinite

Prawda, jeśli liczba jest dodatnią nieskończonością lub ujemną nieskończonością; w przeciwnym razie fałsz.

4 isNan

Prawda, jeśli liczba jest podwójną wartością Not-a-Number; w przeciwnym razie fałsz.

5 jest ujemny

Prawda, jeśli liczba jest ujemna; w przeciwnym razie fałsz.

6 znak

Zwraca minus jeden, zero lub plus jeden w zależności od znaku i wartości liczbowej liczby.

7 isEven

Zwraca wartość true, jeśli liczba jest liczbą parzystą.

8 to jest dziwne

Zwraca wartość true, jeśli liczba jest liczbą nieparzystą.

Metody liczbowe

Poniżej podano listę najczęściej używanych metod obsługiwanych przez liczby -

Sr.No Metoda i opis
1 abs

Zwraca wartość bezwzględną liczby.

2 stropować

Zwraca najmniejszą liczbę całkowitą nie mniejszą niż liczba.

3 porównać do

Porównuje to z inną liczbą.

4 Podłoga

Zwraca największą liczbę całkowitą nie większą niż bieżąca liczba.

5 reszta

Zwraca obciętą resztę po podzieleniu dwóch liczb.

6 Okrągły

Zwraca liczbę całkowitą najbliższą bieżącym liczbom.

7 podwoić

Zwraca podwójny odpowiednik liczby.

8 toInt

Zwraca całkowity odpowiednik liczby.

9

Zwraca ciąg będący odpowiednikiem liczby.

10 ścięty

Zwraca liczbę całkowitą po odrzuceniu wszelkich cyfr ułamkowych.

Typ danych String reprezentuje sekwencję znaków. Łańcuch Dart to sekwencja 16 jednostek kodu UTF.

Wartości ciągów w Dart można przedstawić za pomocą pojedynczych, podwójnych lub potrójnych cudzysłowów. Ciągi jednowierszowe są przedstawiane za pomocą apostrofów lub cudzysłowów. Potrójne cudzysłowy są używane do reprezentowania ciągów wieloliniowych.

Składnia reprezentowania wartości ciągów w Dart jest taka, jak podano poniżej -

Składnia

String  variable_name = 'value'  

OR  

String  variable_name = ''value''  

OR  

String  variable_name = '''line1 
line2'''  

OR  

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

Poniższy przykład ilustruje użycie typu danych String w 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); 
}

Spowoduje to, co następuje 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

Ciągi znaków są niezmienne. Jednak ciągi mogą być poddawane różnym operacjom, a wynikowy ciąg może być przechowywany jako nowa wartość.

Interpolacja ciągów

Proces tworzenia nowego ciągu przez dołączenie wartości do ciągu statycznego jest określany jako concatenation lub interpolation. Innymi słowy, jest to proces dodawania łańcucha do innego ciągu.

Operator plus (+) jest powszechnie używanym mechanizmem łączenia / interpolacji ciągów.

Przykład 1

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

Spowoduje to, co następuje output -

The concatenated string : Helloworld

Przykład 2

Możesz użyć „$ {}”, aby interpolować wartość wyrażenia Dart w łańcuchach. Poniższy przykład ilustruje to samo.

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

Spowoduje to, co następuje output -

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

Właściwości ciągu

Właściwości wymienione w poniższej tabeli są tylko do odczytu.

Sr.No Właściwość i opis
1 codeUnits

Zwraca niemodyfikowalną listę jednostek kodu UTF-16 tego ciągu.

2 jest pusty

Zwraca wartość true, jeśli ten ciąg jest pusty.

3 Długość

Zwraca długość ciągu, w tym spację, tabulację i znaki nowego wiersza.

Metody manipulowania ciągami znaków

Klasa String w dart: core libraryzapewnia również metody manipulowania napisami. Niektóre z tych metod podano poniżej -

Sr.No Metody i opis
1 toLowerCase ()

Konwertuje wszystkie znaki w tym ciągu na małe litery.

2 toUpperCase ()

Konwertuje wszystkie znaki w tym ciągu na wielkie litery.

3 trym()

Zwraca ciąg bez żadnych początkowych i końcowych białych znaków.

4 porównać do()

Porównuje ten obiekt z innym.

5 Zamień wszystko()

Zastępuje wszystkie podciągi, które pasują do określonego wzorca, daną wartością.

6 rozdzielać()

Dzieli ciąg na dopasowania określonego separatora i zwraca listę podciągów.

7 podciąg ()

Zwraca podciąg tego ciągu, który rozciąga się od startIndex włącznie do endIndex, z wyłączeniem.

8 toString ()

Zwraca ciąg znaków reprezentujący ten obiekt.

9 codeUnitAt ()

Zwraca 16-bitową jednostkę kodu UTF-16 pod podanym indeksem.

Dart zapewnia wbudowaną obsługę typu danych Boolean. Typ danych Boolean w DART obsługuje tylko dwie wartości - prawda i fałsz. Słowo kluczowe bool jest używane do reprezentowania literału boolowskiego w DART.

Składnia deklarowania zmiennej boolowskiej w DART jest następująca:

bool var_name = true;  
OR  
bool var_name = false

Przykład

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

Spowoduje to, co następuje output -

true

Przykład

W przeciwieństwie do JavaScript, typ danych Boolean rozpoznaje tylko literał prawda jako prawda. Każda inna wartość jest uważana za fałszywą. Rozważmy następujący przykład -

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

Powyższy fragment kodu, jeśli zostanie uruchomiony w języku JavaScript, wydrukuje komunikat „Ciąg nie jest pusty”, ponieważ konstrukcja if zwróci wartość true, jeśli ciąg nie jest pusty.

Jednak w Dart strjest konwertowany na fałsz jako str! = true . W związku z tym fragment kodu wydrukuje komunikat „Pusty ciąg” (po uruchomieniu w trybie niezaznaczonym).

Przykład

Powyższy fragment, jeśli się pojawi checkedmode zgłosi wyjątek. To samo pokazano poniżej -

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

Spowoduje to, co następuje output, w 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)

Spowoduje to, co następuje output, w Unchecked Mode -

Empty String

Note - The WebStorm IDE działa domyślnie w trybie zaznaczenia.

Bardzo często używaną kolekcją w programowaniu jest plik array. Dart reprezentuje tablice w postaciListobiekty. ZAListjest po prostu uporządkowaną grupą obiektów. Plikdart:core Library udostępnia klasę List, która umożliwia tworzenie list i manipulowanie nimi.

Logiczną reprezentację listy w Dart podano poniżej -

  • test_list - to identyfikator odnoszący się do kolekcji.

  • Lista zawiera wartości 12, 13 i 14. Bloki pamięci przechowujące te wartości są znane jako elements.

  • Każdy element na liście jest identyfikowany przez unikalny numer zwany index. Indeks zaczyna się odzero i rozciąga się do n-1 gdzie nto całkowita liczba elementów na liście. Indeks jest również nazywanysubscript.

Listy można sklasyfikować jako -

  • Lista o stałej długości
  • Lista rosnąca

Omówmy teraz te dwa typy lists szczegółowo.

Lista o stałej długości

Lista o stałej długości nie może zmieniać się w czasie wykonywania. Składnia tworzenia listy o stałej długości jest następująca -

Step 1 − Declaring a list

Składnia deklarowania listy o stałej długości jest podana poniżej -

var list_name = new List(initial_size)

Powyższa składnia tworzy listę o określonym rozmiarze. Lista nie może rosnąć ani zmniejszać się w czasie wykonywania. Każda próba zmiany rozmiaru listy spowoduje wyjątek.

Step 2 − Initializing a list

Składnia inicjowania listy jest taka, jak podano poniżej -

lst_name[index] = value;

Przykład

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

Spowoduje to, co następuje output -

[12, 13, 11]

Lista rosnąca

Długość listy rozwijanej może się zmieniać w czasie wykonywania. Składnia deklarowania i inicjowania listy rozwijanej jest taka, jak podano poniżej -

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

Indeks / indeks służy do odniesienia do elementu, który powinien być wypełniony wartością. Składnia inicjowania listy jest taka, jak podano poniżej -

list_name[index] = value;

Przykład

Poniższy przykład pokazuje, jak utworzyć listę 3 elementów.

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

Spowoduje to, co następuje output -

[1, 2, 3]

Przykład

Poniższy przykład tworzy listę o zerowej długości przy użyciu empty List() constructor. Plikadd() funkcja w List klasa służy do dynamicznego dodawania elementów do listy.

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

Spowoduje to, co następuje output -

[12, 13]

Właściwości listy

W poniższej tabeli wymieniono niektóre często używane właściwości List klasa w dart:core library.

Sr.No Metody i opis
1 pierwszy

Zwraca przypadek pierwszego elementu.

2 jest pusty

Zwraca wartość true, jeśli kolekcja nie zawiera elementów.

3 nie jest pusty

Zwraca wartość true, jeśli kolekcja zawiera co najmniej jeden element.

4 długość

Zwraca rozmiar listy.

5 ostatni, ubiegły, zeszły

Zwraca ostatni element z listy.

6 wywrócony

Zwraca iterowalny obiekt zawierający wartości list w odwrotnej kolejności.

7 Pojedynczy

Sprawdza, czy lista zawiera tylko jeden element i zwraca go.

W tym rozdziale omówimy, jak wykonywać podstawowe operacje na Listach, takie jak -

Sr.No Podstawowa obsługa i opis
1 Wstawianie elementów do listy

Listy mutowalne mogą rosnąć dynamicznie w czasie wykonywania. PlikList.add() funkcja dołącza określoną wartość na koniec listy i zwraca zmodyfikowany obiekt List.

2 Aktualizacja listy

Listy w Dart mogą być aktualizowane przez -

  • Aktualizacja indeksu
  • Korzystanie z funkcji List.replaceRange ()
3 Usuwanie elementów listy

Następujące funkcje obsługiwane przez klasę List w bibliotece dart: core mogą być używane do usuwania elementów z listy.

Obiekt Map to prosta para klucz / wartość. Klucze i wartości na mapie mogą być dowolnego typu. Mapa to kolekcja dynamiczna. Innymi słowy, Mapy mogą się rozwijać i zmniejszać w czasie wykonywania.

Mapy można zadeklarować na dwa sposoby -

  • Korzystanie z literałów mapy
  • Korzystanie z konstruktora Map

Deklarowanie mapy przy użyciu literałów mapy

Aby zadeklarować mapę przy użyciu literałów mapy, musisz ująć pary klucz-wartość w parę nawiasów klamrowych "{ }".

Oto jego syntax -

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

Deklarowanie mapy za pomocą konstruktora mapy

Aby zadeklarować Map za pomocą konstruktora Map, mamy dwa kroki. Najpierw zadeklaruj mapę, a następnie zainicjuj mapę.

Plik syntax do declare a map wygląda następująco -

var identifier = new Map()

Teraz użyj następującej składni do initialize the map -

map_name[key] = value

Przykład: literał mapy

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

Spowoduje to, co następuje output -

{Usrname: tom, Password: pass@123}

Przykład: dodawanie wartości do literałów mapy w czasie wykonywania

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

Spowoduje to, co następuje output -

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

Przykład: Konstruktor mapy

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

Spowoduje to, co następuje output -

{Usrname: admin, Password: admin@123}

Note - Wartością mapy może być dowolny obiekt, w tym NULL.

Mapa - Właściwości

Plik Map klasa w rzutce: pakiet podstawowy definiuje następujące właściwości -

Sr.No Właściwość i opis
1 Klucze

Zwraca iterowalny obiekt reprezentujący klucze

2 Wartości

Zwraca iterowalny obiekt reprezentujący wartości

3 Długość

Zwraca rozmiar mapy

4 jest pusty

Zwraca wartość true, jeśli mapa jest pustą mapą

5 nie jest pusty

Zwraca wartość true, jeśli mapa jest pustą mapą

Mapa - funkcje

Poniżej znajdują się najczęściej używane funkcje do manipulowania mapami w Dart.

Sr.No Nazwa i opis funkcji
1 dodać wszystko()

Dodaje do tej mapy wszystkie inne pary klucz-wartość.

2 jasny()

Usuwa wszystkie pary z mapy.

3 usunąć()

Usuwa klucz i skojarzoną z nim wartość, jeśli jest obecna, z mapy.

4 dla każdego()

Stosuje f do każdej pary klucz-wartość mapy.

Symbole w Dart to nieprzezroczyste, dynamiczne nazwy ciągów używane do odzwierciedlania metadanych z biblioteki. Mówiąc najprościej, symbole są sposobem przechowywania relacji między ciągiem czytelnym dla człowieka a ciągiem zoptymalizowanym pod kątem używania przez komputery.

Odbicie to mechanizm służący do uzyskiwania metadanych danego typu w czasie wykonywania, takich jak liczba metod w klasie, liczba posiadanych konstruktorów lub liczba parametrów funkcji. Możesz nawet wywołać metodę typu, który jest ładowany w czasie wykonywania.

W refleksji Dart dostępne są określone klasy w dart:mirrorspakiet. Ta biblioteka działa zarówno w aplikacjach internetowych, jak i aplikacjach wiersza poleceń.

Składnia

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

Plik name musi być poprawną publiczną nazwą członka Dart, publiczną nazwą konstruktora lub nazwą biblioteki.

Przykład

Rozważmy następujący przykład. Kod deklaruje klasęFoo w bibliotece foo_lib. Klasa definiuje metodym1, m2, i m3.

Foo.dart

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

Następujący kod ładuje się Foo.dartbiblioteka i wyszukuje klasę Foo przy pomocy typu Symbol. Ponieważ odzwierciedlamy metadane z powyższej biblioteki, kod importujedart:mirrors biblioteka.

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

Zauważ, że wiersz libMirror.declarations.forEach ((s, d) => print (s)); będzie iterował po każdej deklaracji w bibliotece w czasie wykonywania i wypisze deklaracje jako typSymbol.

Ten kod powinien dawać następujące efekty output -

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

Przykład: wyświetl liczbę metod instancji klasy

Rozważmy teraz wyświetlenie liczby metod instancji w klasie. Predefiniowana klasaClassMirror pomaga nam to osiągnąć.

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

Ten kod powinien dawać następujące efekty 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")

Konwertuj symbol na ciąg

Możesz przekonwertować nazwę typu, takiego jak klasa lub biblioteka, przechowywaną w symbolu z powrotem na ciąg przy użyciu MirrorSystemklasa. Poniższy kod pokazuje, jak przekonwertować symbol na ciąg.

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

Powinien dać następujący wynik output -

Symbol("foo_lib")   

foo_lib

Łańcuchy to ciąg znaków. Dart reprezentuje ciągi jako sekwencję jednostek kodu Unicode UTF-16. Unicode to format, który definiuje unikalną wartość liczbową dla każdej litery, cyfry i symbolu.

Ponieważ ciąg Dart jest sekwencją jednostek kodu UTF-16, 32-bitowe wartości Unicode w ciągu są reprezentowane przy użyciu specjalnej składni. ZArune jest liczbą całkowitą reprezentującą punkt kodowy Unicode.

Klasa String w dart:core Biblioteka zapewnia mechanizmy dostępu runes. Dostęp do jednostek / run z kodami ciągów można uzyskać na trzy sposoby -

  • Korzystanie z funkcji String.codeUnitAt ()
  • Korzystanie z właściwości String.codeUnits
  • Korzystanie z właściwości String.runes

Funkcja String.codeUnitAt ()

Dostęp do jednostek kodu w ciągu można uzyskać poprzez ich indeksy. Zwraca 16-bitową jednostkę kodu UTF-16 pod podanym indeksem.

Składnia

String.codeUnitAt(int index);

Przykład

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

Spowoduje to, co następuje output -

82

Właściwość String.codeUnits

Ta właściwość zwraca niemodyfikowalną listę jednostek kodu UTF-16 określonego ciągu.

Składnia

String. codeUnits;

Przykład

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

Spowoduje to, co następuje output -

[82, 117, 110, 101, 115]

Właściwość String.runes

Ta właściwość zwraca iterowalną liczbę punktów kodu Unicode this string.Runes rozszerza iterowalność.

Składnia

String.runes

Przykład

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

Spowoduje to, co następuje output -

A 
s 
t 
r 
i 
n 
g

Punkty kodowe Unicode są zwykle wyrażane jako \uXXXX, gdzie XXXX to 4-cyfrowa wartość szesnastkowa. Aby określić więcej lub mniej niż 4 cyfry szesnastkowe, umieść wartość w nawiasach klamrowych. W tym celu można użyć konstruktora klasy Runes w bibliotece dart: core.

Przykład

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

Spowoduje to, co następuje output -

Wyliczenie służy do definiowania nazwanych wartości stałych. Typ wyliczeniowy jest deklarowany przy użyciuenum słowo kluczowe.

Składnia

enum enum_name {  
   enumeration list 
}

Gdzie,

  • Enum_name określa nazwę typu wyliczenie
  • Lista wyliczeń to lista identyfikatorów oddzielonych przecinkami

Każdy z symboli na liście wyliczeń oznacza wartość całkowitą, o jeden większą niż symbol, który ją poprzedza. Domyślnie wartość pierwszego symbolu wyliczenia wynosi 0.

Na przykład

enum Status { 
   none, 
   running, 
   stopped, 
   paused 
}

Przykład

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

Spowoduje to, co następuje 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

Funkcje są elementami składowymi kodu możliwego do odczytania, utrzymania i wielokrotnego użytku. Funkcja to zestaw instrukcji do wykonania określonego zadania. Funkcje organizują program w logiczne bloki kodu. Po zdefiniowaniu funkcji można wywołać kod dostępu. Dzięki temu kod można ponownie wykorzystać. Ponadto funkcje ułatwiają odczytywanie i utrzymywanie kodu programu.

Deklaracja funkcji informuje kompilator o nazwie funkcji, typie zwracanym i parametrach. Definicja funkcji zawiera rzeczywistą treść funkcji.

Sr.No Funkcje i opis
1 Definiowanie funkcji

Definicja funkcji określa, co i jak zostanie wykonane określone zadanie.

2 Wywołanie funkcji

Funkcja musi zostać wywołana, aby ją wykonać.

3 Funkcje powracające

Funkcje mogą również zwracać wartość wraz z kontrolą, z powrotem do obiektu wywołującego.

4 Funkcja sparametryzowana

Parametry to mechanizm przekazywania wartości do funkcji.

Parametry opcjonalne

Parametry opcjonalne mogą być używane, gdy argumenty nie muszą być obowiązkowo przekazywane w celu wykonania funkcji. Parametr można oznaczyć jako opcjonalny, dołączając znak zapytania do jego nazwy. Opcjonalny parametr należy ustawić jako ostatni argument funkcji.

Mamy trzy typy opcjonalnych parametrów w Dart -

Sr.No Parametr i opis
1 Opcjonalny parametr pozycyjny

Aby określić opcjonalne parametry pozycyjne, użyj nawiasów kwadratowych [].

2 Opcjonalny nazwany parametr

W przeciwieństwie do parametrów pozycyjnych, nazwa parametru musi być określona podczas przekazywania wartości. Nawias klamrowy {} może służyć do określenia opcjonalnych nazwanych parametrów.

3 Opcjonalne parametry z wartościami domyślnymi

Domyślnie parametrom funkcji można również przypisać wartości. Jednak takie parametry mogą być również jawnie przekazanymi wartościami.

Rekurencyjne funkcje rzutek

Rekurencja to technika iterowania operacji poprzez wielokrotne wywoływanie funkcji, aż do osiągnięcia wyniku. Rekurencję najlepiej stosować, gdy trzeba wielokrotnie wywoływać tę samą funkcję z różnymi parametrami w obrębie pętli.

Przykład

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

Powinien dać następujący wynik output -

720

Funkcje lambda

Funkcje lambda to zwięzły mechanizm do reprezentowania funkcji. Funkcje te są również nazywane funkcjami strzałkowymi.

Składnia

[return_type]function_name(parameters)=>expression;

Przykład

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

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

Powinien dać następujący wynik output -

hello 123

Na interfacedefiniuje składnię, do której musi stosować się każda jednostka. Interfejsy definiują zestaw metod dostępnych na obiekcie. Dart nie ma składni do deklarowania interfejsów. Deklaracje klas same w sobie są interfejsami w Dart.

Classesaby móc korzystać z interfejsu, należy użyć słowa kluczowego implements. Klasa implementująca musi koniecznie zapewnić konkretną implementację wszystkich funkcji zaimplementowanego interfejsu. Innymi słowy, klasa musi przedefiniować każdą funkcję w interfejsie, którą chce zaimplementować.

Składnia: implementacja interfejsu

class identifier implements interface_name

Przykład

W poniższym programie deklarujemy klasę Printer. PlikConsolePrinter klasa implementuje niejawną deklarację interfejsu dla Printerklasa. Plikmain funkcja tworzy obiekt klasy ConsolePrinter klasa przy użyciu newsłowo kluczowe. Ten obiekt służy do wywoływania funkcjiprint_data zdefiniowane w ConsolePrinter klasa.

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__________"); 
   } 
}

Powinien dać następujący wynik output -

__________Printing to Console__________

Wdrażanie wielu interfejsów

Klasa może implementować wiele interfejsów. Interfejsy są oddzielone przecinkiem. Pliksyntax za to samo podano poniżej -

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

Następujące example pokazuje, jak zaimplementować wiele interfejsów w Dart -

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

Powinien dać następujący wynik output -

The gross total: 1000 
Discount:50

Dart to język zorientowany obiektowo. Obsługuje funkcje programowania zorientowanego obiektowo, takie jak klasy, interfejsy itp. Aclassw zakresie OOP to plan tworzenia obiektów. ZAclasshermetyzuje dane dla obiektu. Dart zapewnia wbudowaną obsługę tej koncepcji zwanejclass.

Deklarowanie klasy

Użyj class słowo kluczowe, aby zadeklarować plik classw Dart. Definicja klasy zaczyna się od słowa kluczowego class, po którym następuje rozszerzenieclass name; a treść klasy ujęta w nawiasy klamrowe. Składnię tego samego podano poniżej -

Składnia

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

Plik classpo słowie kluczowym następuje nazwa klasy. Podczas nadawania nazw klasom należy wziąć pod uwagę zasady dotyczące identyfikatorów.

Definicja klasy może obejmować:

  • Fields- Pole to dowolna zmienna zadeklarowana w klasie. Pola reprezentują dane dotyczące obiektów.

  • Setters and Getters- Umożliwia programowi inicjowanie i pobieranie wartości pól klasy. Domyślna metoda pobierająca / ustawiająca jest powiązana z każdą klasą. Jednak domyślne mogą zostać przesłonięte przez jawne zdefiniowanie metody ustawiającej / pobierającej.

  • Constructors - odpowiedzialny za alokację pamięci dla obiektów klasy.

  • Functions- Funkcje reprezentują działania, które obiekt może wykonać. Czasami nazywa się je również metodami.

Te komponenty razem nazywane są data members klasy.

Przykład: deklarowanie klasy

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

Przykład deklaruje klasę Car. Klasa ma pole o nazwieengine. Plikdisp() to prosta funkcja, która wyświetla wartość pola engine.

Tworzenie instancji klasy

Aby utworzyć wystąpienie klasy, użyj rozszerzenia newsłowo kluczowe, po którym następuje nazwa klasy. Składnię tego samego podano poniżej -

Składnia

var object_name = new class_name([ arguments ])
  • Plik new Słowo kluczowe jest odpowiedzialne za tworzenie instancji.

  • Prawa strona wyrażenia wywołuje konstruktora. Do konstruktora należy przekazywać wartości, jeśli jest sparametryzowany.

Przykład: tworzenie wystąpienia klasy

var obj = new Car("Engine 1")

Dostęp do atrybutów i funkcji

Dostęp do atrybutów i funkcji klasy można uzyskać za pośrednictwem obiektu. Użyj '.' notacja kropkowa (nazywana jakoperiod), aby uzyskać dostęp do członków danych klasy.

//accessing an attribute 
obj.field_name  

//accessing a function 
obj.function_name()

Przykład

Spójrz na poniższy przykład, aby zrozumieć, jak uzyskać dostęp do atrybutów i funkcji w Dart -

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

Plik output powyższego kodu wygląda następująco -

E1001

Dart Constructors

Konstruktor to specjalna funkcja klasy, która jest odpowiedzialna za inicjalizację zmiennych tej klasy. Dart definiuje konstruktora o takiej samej nazwie, jak nazwa klasy. Konstruktor jest funkcją, dlatego można go sparametryzować. Jednak w przeciwieństwie do funkcji konstruktory nie mogą mieć typu zwracanego. Jeśli nie zadeklarujesz konstruktora, wartość domyślnano-argument constructor jest dla Ciebie.

Składnia

Class_name(parameter_list) { 
   //constructor body 
}

Przykład

Poniższy przykład pokazuje, jak używać konstruktorów w Dart -

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

Powinien dać następujący wynik output -

E1001

Nazwani konstruktorzy

Dart zapewnia named constructors aby włączyć definicję klasy multiple constructors. Składnia nazwanych konstruktorów jest taka, jak podano poniżej -

Składnia: definiowanie konstruktora

Class_name.constructor_name(param_list)

Przykład

Poniższy przykład pokazuje, jak można używać nazwanych konstruktorów w Dart -

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

Powinien dać następujący wynik output -

The engine is : E1001 
Non-parameterized constructor invoked

To słowo kluczowe

Plik thissłowo kluczowe odnosi się do bieżącej instancji klasy. Tutaj nazwa parametru i nazwa pola klasy są takie same. Dlatego, aby uniknąć niejednoznaczności, pole klasy jest poprzedzone przedrostkiemthissłowo kluczowe. Poniższy przykład wyjaśnia to samo -

Przykład

Poniższy przykład wyjaśnia, jak używać this słowo kluczowe w Dart -

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

Powinien dać następujący wynik output -

The engine is : E1001

Dart Class ─ Getters and Setters

Getters i Setters, zwany także jako accessors i mutators, pozwól programowi odpowiednio zainicjować i pobrać wartości pól klas. Metody pobierające lub metody dostępu są definiowane przy użyciugetsłowo kluczowe. Setery lub mutatory są definiowane za pomocąset słowo kluczowe.

Domyślna metoda pobierająca / ustawiająca jest powiązana z każdą klasą. Jednak domyślne mogą zostać przesłonięte przez jawne zdefiniowanie metody ustawiającej / pobierającej. Funkcja pobierająca nie ma parametrów i zwraca wartość, a metoda ustawiająca ma jeden parametr i nie zwraca wartości.

Składnia: definiowanie metody pobierającej

Return_type  get identifier 
{ 
}

Składnia: definiowanie ustawiacza

set identifier 
{ 
}

Przykład

Poniższy przykład pokazuje, jak możesz używać getters i setters w klasie Dart -

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

Ten kod programu powinien dawać następujące efekty output -

Age should be greater than 5 
MARK 
Null

Dziedziczenie klas

Dart obsługuje koncepcję dziedziczenia, która jest zdolnością programu do tworzenia nowych klas z istniejącej klasy. Klasa rozszerzana w celu tworzenia nowszych klas nazywana jest klasą nadrzędną / superklasą. Nowo utworzone klasy nazywane są klasami podrzędnymi / podrzędnymi.

Klasa dziedziczy z innej klasy przy użyciu słowa kluczowego „extends”. Child classes inherit all properties and methods except constructors from the parent class.

Składnia

class child_class_name extends parent_class_name

Note - Dart nie obsługuje wielokrotnego dziedziczenia.

Przykład: dziedziczenie klas

W poniższym przykładzie deklarujemy klasę Shape. Klasa jest rozszerzona oCircleklasa. Ponieważ między klasami istnieje związek dziedziczenia, klasa potomna, tj. KlasaCar uzyskuje niejawny dostęp do składowej danych klasy nadrzędnej.

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 {}

Powinien dać następujący wynik output -

calling calc area defined in the Shape class

Rodzaje dziedziczenia

Dziedziczenie może mieć następujące trzy typy -

  • Single - Każda klasa może być najwyżej z jednej klasy nadrzędnej.

  • Multiple- Klasa może dziedziczyć z wielu klas. Dart nie obsługuje dziedziczenia wielokrotnego.

  • Multi-level - Klasa może dziedziczyć z innej klasy podrzędnej.

Przykład

Poniższy przykład pokazuje, jak działa dziedziczenie wielopoziomowe -

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

Klasa Leafwyprowadza atrybuty z klas Root i Child na podstawie dziedziczenia wielopoziomowego. Jegooutput wygląda następująco -

hello

Dart - dziedziczenie klas i przesłanianie metod

Zastępowanie metod to mechanizm, za pomocą którego klasa potomna redefiniuje metodę w swojej klasie nadrzędnej. Poniższy przykład ilustruje to samo -

Przykład

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

Powinien dać następujący wynik output -

value of b 12

Liczba i typ parametrów funkcji muszą być zgodne podczas zastępowania metody. W przypadku niezgodności liczby parametrów lub ich typu danych kompilator Dart zgłasza błąd. Poniższa ilustracja wyjaśnia to samo -

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

Powinien dać następujący wynik output -

value of b 12

Statyczne słowo kluczowe

Plik static słowo kluczowe można zastosować do członków danych klasy, tj. fields i methods. Zmienna statyczna zachowuje swoje wartości do zakończenia wykonywania programu. Do statycznych elementów członkowskich odwołuje się nazwa klasy.

Przykład

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 
}

Powinien dać następujący wynik output -

The value of num is 12

Super słowo kluczowe

Plik supersłowo kluczowe jest używane w odniesieniu do bezpośredniego rodzica klasy. Słowa kluczowego można użyć w celu odniesienia się do superklasy wersji plikuvariable, property, lub method. Poniższy przykład ilustruje to samo -

Przykład

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

Powinien dać następujący wynik output -

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

Programowanie zorientowane obiektowo definiuje obiekt jako „dowolną jednostkę, która ma zdefiniowane granice”. Obiekt ma następujące -

  • State- Opisuje obiekt. Pola klasy reprezentują stan obiektu.

  • Behavior - Opisuje, co może zrobić przedmiot.

  • Identity- Unikalna wartość, która odróżnia obiekt od zestawu podobnych innych obiektów. Co najmniej dwa obiekty mogą mieć wspólny stan i zachowanie, ale nie mogą mieć tożsamości.

Operator okresu (.) jest używany w połączeniu z obiektem w celu uzyskania dostępu do składowych danych klasy.

Przykład

Dart reprezentuje dane w postaci obiektów. Każda klasa w Dart rozszerza klasę Object. Poniżej podano prosty przykład tworzenia i używania obiektu.

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

Powinien dać następujący wynik output -

This is a test method 
This is a test method1

Operator kaskady (..)

Powyższy przykład wywołuje metody w klasie. Jednak za każdym razem, gdy wywoływana jest funkcja, wymagane jest odwołanie do obiektu. Plikcascade operator może być używany jako skrót w przypadkach, gdy istnieje sekwencja wywołań.

Operator kaskadowy (..) może służyć do wywołania sekwencji wywołań za pośrednictwem obiektu. Powyższy przykład można przepisać w następujący sposób.

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

Powinien dać następujący wynik output -

This is a test method 
This is a test method1

Metoda toString ()

Ta funkcja zwraca ciąg znaków reprezentujący obiekt. Spójrz na poniższy przykład, aby zrozumieć, jak używaćtoString metoda.

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

Powinien dać następujący wynik output -

12

Dart, w przeciwieństwie do innych języków programowania, nie obsługuje tablic. Kolekcje Dart mogą służyć do replikowania struktur danych, takich jak tablice. Biblioteka dart: core i inne klasy umożliwiają obsługę kolekcji w skryptach Dart.

Kolekcje rzutek można zasadniczo sklasyfikować jako -

Sr.No Kolekcja i opis rzutek
1 Lista

Lista to po prostu uporządkowana grupa obiektów. Plikdart:core Library udostępnia klasę List, która umożliwia tworzenie list i manipulowanie nimi.

  • Fixed Length List - Długość listy nie może się zmieniać w czasie wykonywania.

  • Growable List - Długość listy może się zmieniać w czasie wykonywania.

2 Zestaw

Zestaw reprezentuje zbiór obiektów, w których każdy obiekt może wystąpić tylko raz. Biblioteka dart: core udostępnia klasę Set do implementacji tego samego.

3 Mapy

Obiekt Map to prosta para klucz / wartość. Klucze i wartości na mapie mogą być dowolnego typu. Mapa to kolekcja dynamiczna. Innymi słowy, Mapy mogą się rozwijać i zmniejszać w czasie wykonywania. Klasa Map w bibliotece dart: core zapewnia obsługę tego samego.

4 Kolejka

Kolejka to kolekcja, którą można manipulować na obu końcach. Kolejki są przydatne, gdy chcesz zbudować kolekcję pierwszy na wejściu, pierwszy na wyjściu. Mówiąc najprościej, kolejka wstawia dane z jednego końca i usuwa z drugiego. Wartości są usuwane / odczytywane w kolejności ich wstawiania.

Kolekcje iteracyjne

Klasa Iterator z dart:corebiblioteka umożliwia łatwe poruszanie się po kolekcji. Każda kolekcja ma plikiteratorwłasność. Ta właściwość zwraca iterator wskazujący na obiekty w kolekcji.

Przykład

Poniższy przykład ilustruje przechodzenie przez kolekcję przy użyciu obiektu iteratora.

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

Plik moveNext()funkcja zwraca wartość logiczną wskazującą, czy istnieje kolejny wpis. Plikcurrent właściwość obiektu iteratora zwraca wartość obiektu, na który aktualnie wskazuje iterator.

Ten program powinien dać następujące efekty output -

100 
200 
300

Dart to optionally typed language. Kolekcje w Dart są domyślnie heterogeniczne. Innymi słowy, pojedyncza kolekcja Dart może zawierać wartości różnych typów. Jednak kolekcję Dart można utworzyć tak, aby zawierała jednorodne wartości. Do tego samego można wykorzystać koncepcję Generics.

Użycie Generics wymusza ograniczenie typu danych wartości, które mogą być zawarte w kolekcji. Takie kolekcje są nazywane kolekcjami bezpiecznymi dla typów. Bezpieczeństwo typu to funkcja programowania, która zapewnia, że ​​blok pamięci może zawierać tylko dane określonego typu.

Wszystkie kolekcje Dart obsługują implementację bezpieczeństwa typu za pośrednictwem typów generycznych. Para nawiasów kątowych zawierająca typ danych jest używana do zadeklarowania kolekcji z bezpiecznym typem. Składnia deklarowania kolekcji bezpiecznej dla typu jest podana poniżej.

Składnia

Collection_name <data_type> identifier= new Collection_name<data_type>

Poniżej podano bezpieczną implementację list, mapy, zbioru i kolejki. Ta funkcja jest również obsługiwana przez wszystkie implementacje wyżej wymienionych typów kolekcji.

Przykład: lista ogólna

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

Powinien dać następujący wynik output -

WARNING 
ERROR 
INFO

Próba wstawienia wartości innej niż określony typ spowoduje błąd kompilacji. Poniższy przykład ilustruje to.

Przykład

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

Powinien dać następujący wynik output -

1                                                                                     
ERROR                                                                             
INFO

Przykład: zestaw ogólny

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

Powinien dać następujący wynik output -

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

Przykład: kolejka ogólna

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

Powinien dać następujący wynik output -

Default implementation ListQueue<int> 
20 
30 
40

Mapa ogólna

Deklaracja mapy bezpiecznej typu określa typy danych -

  • Klucz
  • Wartość

Składnia

Map <Key_type, value_type>

Przykład

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

Powinien dać następujący wynik output -

Map :{name: Tom, Id: E1001}

Pakiet jest mechanizmem do hermetyzacji grupy jednostek programowania. Aplikacje mogą czasami wymagać integracji niektórych bibliotek lub wtyczek innych firm. Każdy język ma mechanizm do zarządzania zewnętrznymi pakietami, takimi jak Maven lub Gradle dla Java, Nuget dla .NET, npm dla Node.js, itp. Menedżer pakietów dla Dart topub.

Pub pomaga instalować pakiety w repozytorium. Repozytorium hostowanych pakietów można znaleźć pod adresemhttps://pub.dartlang.org/.

Plik package metadata jest zdefiniowany w pliku, pubsec.yaml. YAML to akronim dlaYet Another Markup Language. Plikpub narzędzie może być używane do pobierania wszystkich różnych bibliotek wymaganych przez aplikację.

Każda aplikacja Dart ma rozszerzenie pubspec.yaml plik zawierający zależności aplikacji do innych bibliotek i metadane aplikacji, takie jak nazwa aplikacji, autor, wersja i opis.

Zawartość pliku pubspec.yaml plik powinien wyglądać mniej więcej tak -

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

Ważny pub commands są następujące -

Sr.No Polecenie i opis
1

‘pub get’

Pomaga uzyskać wszystkie pakiety, od których zależy Twoja aplikacja.

2

‘pub upgrade’

Uaktualnia wszystkie zależności do nowszej wersji.

3

‘pub build’

Służy do budowania aplikacji internetowej i utworzy folder kompilacji ze wszystkimi powiązanymi skryptami.

4

‘pub help’

To da ci pomoc dla wszystkich różnych poleceń wydawania.

Jeśli używasz IDE, takiego jak WebStorm, możesz kliknąć prawym przyciskiem myszy pubspec.yaml, aby bezpośrednio uzyskać wszystkie polecenia -

Instalowanie pakietu

Rozważmy przykład, w którym aplikacja musi analizować plik XML. Dart XML to lekka biblioteka o otwartym kodzie źródłowym, stabilna do analizowania, przechodzenia, wykonywania zapytań i tworzenia dokumentów XML.

Kroki prowadzące do osiągnięcia tego zadania są następujące -

Step 1 - Dodaj następujące elementy do pliku pubsec.yaml.

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:

Kliknij prawym przyciskiem myszy plik pubsec.yamli pobierz zależności. Spowoduje to wewnętrzne uruchomieniepub get command jak pokazano niżej.

Pobrane pakiety i pakiety zależne można sprawdzić w folderze pakietów.

Ponieważ instalacja jest teraz zakończona, musimy odwołać się do dart xmlw projekcie. Składnia jest następująca -

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

Przeczytaj ciąg XML

Aby odczytać ciąg XML i zweryfikować dane wejściowe, Dart XML używa pliku parse()metoda. Składnia jest następująca -

xml.parse(String input):

Przykład: analiza danych wejściowych ciągu XML

Poniższy przykład pokazuje, jak analizować dane wejściowe ciągu XML -

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

Powinien dać następujący wynik 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>

Wyjątkiem (lub wyjątkowym zdarzeniem) jest problem, który pojawia się podczas wykonywania programu. Gdy wystąpi wyjątek, normalny przepływ programu zostaje zakłócony, a program / Aplikacja kończy się nieprawidłowo.

Wbudowane wyjątki Dart obejmują -

Sr.No Wyjątki i opis
1

DeferredLoadException

Zgłaszane, gdy nie można załadować odroczonej biblioteki.

2

FormatException

Wyjątek zgłoszony, gdy ciąg lub inne dane nie mają oczekiwanego formatu i nie można ich przeanalizować ani przetworzyć.

3

IntegerDivisionByZeroException

Wyrzucane, gdy liczba jest podzielona przez zero.

4

IOException

Klasa podstawowa dla wszystkich wyjątków związanych z wyjściem Inupt.

5

IsolateSpawnException

Zgłaszane, gdy nie można utworzyć izolatu.

6

Timeout

Zgłaszane, gdy wystąpi zaplanowany limit czasu podczas oczekiwania na wynik asynchroniczny.

Każdy wyjątek w Dart jest podtypem wcześniej zdefiniowanej klasy Exception. Wyjątki muszą być obsługiwane, aby zapobiec nagłemu zamknięciu aplikacji.

Bloki try / on / catch

Plik tryblok osadza kod, który może spowodować wyjątek. Blok on jest używany, gdy trzeba określić typ wyjątku. Plikcatch blok jest używany, gdy program obsługi potrzebuje obiektu wyjątku.

Plik try po bloku musi następować dokładnie jeden on / catch blok lub jeden finallyblok (lub jeden z obu). Gdy wyjątek wystąpi w bloku try, formant jest przenoszony docatch.

Plik syntax do obsługi wyjątku podano poniżej -

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

Oto kilka punktów, o których należy pamiętać -

  • Fragment kodu może mieć więcej niż jeden blok on / catch do obsługi wielu wyjątków.

  • Blok on i blok catch wzajemnie się wykluczają, tj. Blok try może być powiązany zarówno z blokiem on, jak i blokiem catch.

Poniższy kod ilustruje obsługę wyjątków w Dart -

Przykład: Korzystanie z bloku ON

Poniższy program dzieli dwie liczby reprezentowane przez zmienne x i yodpowiednio. Kod zgłasza wyjątek, ponieważ próbuje podzielić przez zero. Plikon block zawiera kod do obsługi tego wyjątku.

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

Powinien dać następujący wynik output -

Cannot divide by zero

Przykład: użycie bloku catch

W poniższym przykładzie użyliśmy tego samego kodu co powyżej. Jedyną różnicą jest to, żecatch block(zamiast bloku ON) tutaj zawiera kod do obsługi wyjątku. Parametrcatch zawiera obiekt wyjątku zgłoszony w czasie wykonywania.

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

Powinien dać następujący wynik output -

IntegerDivisionByZeroException

Przykład: na… haczyku

Poniższy przykład pokazuje, jak używać on...catch blok.

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

Powinien dać następujący wynik output -

IntegerDivisionByZeroException

Ostatni blok

Plik finallyblok zawiera kod, który powinien zostać wykonany niezależnie od wystąpienia wyjątku. Opcjonalnyfinally blok jest wykonywany bezwarunkowo po try/on/catch.

Składnia korzystania z finally blok jest następujący -

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 
}

Poniższy przykład ilustruje użycie finally blok.

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

Powinien dać następujący wynik output -

Cannot divide by zero 
Finally block executed

Zgłaszanie wyjątku

Plik throwsłowo kluczowe służy do jawnego zgłaszania wyjątku. Należy obsłużyć podniesiony wyjątek, aby zapobiec nagłemu zamknięciu programu.

Plik syntax jawne zgłaszanie wyjątku jest -

throw new Exception_name()

Przykład

Poniższy przykład pokazuje, jak używać throw słowo kluczowe, aby zgłosić wyjątek -

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

Powinien dać następujący wynik output -

Age cannot be negative

Wyjątki niestandardowe

Jak określono powyżej, każdy typ wyjątku w Dart jest podtypem klasy wbudowanej Exception. Dart umożliwia tworzenie niestandardowych wyjątków poprzez rozszerzenie istniejących. Składnia definiowania niestandardowego wyjątku jest następująca:

Składnia: definiowanie wyjątku

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

Wyjątki niestandardowe powinny być zgłaszane jawnie i to samo powinno być obsługiwane w kodzie.

Przykład

Poniższy przykład pokazuje, jak zdefiniować i obsługiwać wyjątek niestandardowy.

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

W powyższym kodzie definiujemy wyjątek niestandardowy, AmtException. Kod zgłasza wyjątek, jeśli przekazana kwota nie mieści się w zakresie objętym wyjątkiem. Plikmain funkcja zawiera wywołanie funkcji w try...catch blok.

Kod powinien dawać następujące efekty output -

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

Od czasu do czasu programiści popełniają błędy podczas kodowania. Błąd w programie jest określany jako błąd. Proces znajdowania i naprawiania błędów nazywa się debugowaniem i jest normalną częścią procesu rozwoju. W tej sekcji omówiono narzędzia i techniki, które mogą pomóc w debugowaniu zadań.

Edytor WebStorm włącza punkty przerwania i debugowanie krok po kroku. Program przerwie się w miejscu, w którym jest dołączony punkt przerwania. Ta funkcjonalność jest podobna do tego, czego można oczekiwać od tworzenia aplikacji w języku Java lub C #. Możesz obserwować zmienne, przeglądać stos, przechodzić i wchodzić do wywołań metod i funkcji - wszystko z poziomu edytora WebStorm.

Dodawanie punktu przerwania

Rozważ następujący fragment kodu. (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); 
}

Do add a breakpoint, kliknij lewy margines, aby. Na poniższym rysunku linia numer 7 ma punkt przerwania.

Run the program in debug mode. W eksploratorze projektów kliknij prawym przyciskiem myszy program do rzutek w naszym przypadku TestString.dart.

Gdy program zostanie uruchomiony w trybie debugowania, pojawi się okno Debuggera, jak pokazano na poniższym zrzucie ekranu. Karta zmiennych pokazuje wartości zmiennych w bieżącym kontekście. Możesz dodawać obserwatorów dla określonych zmiennych i słuchać zmian wartości za pomocą okna zegarków.

Step Into(F7) ikona strzałki w menu debugowania pomaga w wykonywaniu kodu po jednej instrukcji naraz. Jeśli główne metody wywołują podprogram, to również trafi do kodu podprogramu.

Step over (F8): Jest podobny do Step Into. Różnica w użyciu występuje, gdy bieżąca instrukcja zawiera wywołanie podprogramu. Jeśli główna metoda wywołuje podprogram, krok po kroku nie spowoduje drążenia w podprogramie. pominie podprogram.

Step Out(Shift + F8): wykonuje pozostałe wiersze funkcji, w której znajduje się bieżący punkt wykonania. Następną wyświetlaną instrukcją jest instrukcja następująca po wywołaniu podprogramu.

Po uruchomieniu w trybie debugowania program podaje następujące informacje output -

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

ZA typedeflub alias typu funkcji pomaga zdefiniować wskaźniki do kodu wykonywalnego w pamięci. Mówiąc najprościej, atypedef może służyć jako wskaźnik odwołujący się do funkcji.

Poniżej podano kroki do wdrożenia typedefs w programie Dart.

Step 1: Defining a typedef

ZA typedefmożna użyć do określenia sygnatury funkcji, do której mają pasować określone funkcje. Podpis funkcji jest definiowany przez parametry funkcji (w tym ich typy). Zwracany typ nie jest częścią podpisu funkcji. Jego składnia jest następująca.

typedef function_name(parameters)

Step 2: Assigning a Function to a typedef Variable

Zmienna typedef może wskazywać na dowolną funkcję mającą taki sam podpis jak typedef. Możesz użyć następującego podpisu, aby przypisać funkcję do plikutypedef zmienna.

type_def  var_name = function_name

Step 3: Invoking a Function

Plik typedefzmienna może służyć do wywoływania funkcji. Oto, jak możesz wywołać funkcję -

var_name(parameters)

Przykład

Weźmy teraz przykład, aby zrozumieć więcej typedef w Dart.

Najpierw zdefiniujmy a typedef. Tutaj definiujemy sygnaturę funkcji. Funkcja przyjmie dwa parametry wejściowe tego typuinteger. Typ zwracany nie jest częścią podpisu funkcji.

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

Następnie zdefiniujmy funkcje. Zdefiniuj niektóre funkcje z taką samą sygnaturą funkcji, jak w przypadkuManyOperation 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}"); 
}

Na koniec wywołamy funkcję za pośrednictwem typedef. Zadeklaruj zmienną typu ManyOperations. Przypisz nazwę funkcji do zadeklarowanej zmiennej.

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

Plik operzmienna może wskazywać na dowolną metodę, która przyjmuje dwa parametry całkowite. PlikAddodwołanie do funkcji jest przypisane do zmiennej. Typedefs może przełączać odwołania do funkcji w czasie wykonywania

Połączmy teraz wszystkie części i zobaczmy cały program.

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

Program powinien generować następujące elementy output -

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

Note - Powyższy kod spowoduje błąd, jeśli plik typedef zmienna próbuje wskazać funkcję z inną sygnaturą funkcji.

Przykład

Typedefsmożna również przekazać jako parametr do funkcji. Rozważmy następujący przykład -

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

Spowoduje to, co następuje output -

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

Biblioteka w języku programowania reprezentuje zbiór procedur (zestaw instrukcji programistycznych). Dart ma zestaw wbudowanych bibliotek, które są przydatne do przechowywania często używanych procedur. Biblioteka Dart składa się z zestawu klas, stałych, funkcji, typów definicji, właściwości i wyjątków.

Importowanie biblioteki

Importowanie sprawia, że ​​komponenty w bibliotece są dostępne dla kodu wywołującego. Do osiągnięcia tego samego służy słowo kluczowe import. Plik rzutki może zawierać wiele instrukcji importu.

Identyfikatory URI wbudowanej biblioteki Dart używają schematu dart: schemat do odwoływania się do biblioteki. Inne biblioteki mogą używać ścieżki do systemu plików lub pakietu: schemat, aby określić swój identyfikator URI. Biblioteki dostarczane przez menedżera pakietów, takie jak narzędzie publikacji, używają pakietu: schemat .

Składnia importu biblioteki w Dart jest podana poniżej -

import 'URI'

Rozważ następujący fragment kodu -

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

Jeśli chcesz użyć tylko części biblioteki, możesz ją zaimportować selektywnie. Składnię tego samego podano poniżej -

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

Poniżej podano niektóre powszechnie używane biblioteki -

Sr.No Biblioteka i opis
1

dart:io

Obsługa plików, gniazd, HTTP i innych operacji we / wy dla aplikacji serwerowych. Ta biblioteka nie działa w aplikacjach opartych na przeglądarce. Ta biblioteka jest domyślnie importowana.

2

dart:core

Wbudowane typy, kolekcje i inne podstawowe funkcje dla każdego programu Dart. Ta biblioteka jest automatycznie importowana.

3

dart: math

Stałe i funkcje matematyczne oraz generator liczb losowych.

4

dart: convert

Kodery i dekodery do konwersji między różnymi reprezentacjami danych, w tym JSON i UTF-8.

5

dart: typed_data

Listy, które wydajnie obsługują dane o stałym rozmiarze (na przykład 8-bajtowe liczby całkowite bez znaku).

Przykład: Importowanie i używanie biblioteki

Poniższy przykład importuje wbudowaną bibliotekę dart: math. Fragment wywołujesqrt() funkcja z mathbiblioteka. Ta funkcja zwraca pierwiastek kwadratowy z podanej liczby.

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

Output

Square root of 36 is: 6.0

Hermetyzacja w bibliotekach

Skrypty Dart mogą poprzedzać identyfikatory znakiem podkreślenia (_), aby oznaczyć komponenty jako prywatne. Mówiąc najprościej, biblioteki Dart mogą ograniczać dostęp do swoich treści przez zewnętrzne skrypty. Nazywa się toencapsulation. Składnię tego samego podano poniżej -

Składnia

_identifier

Przykład

Najpierw zdefiniuj bibliotekę z funkcją prywatną.

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

Następnie zaimportuj bibliotekę

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

Powyższy kod spowoduje błąd.

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)

Tworzenie bibliotek niestandardowych

Dart pozwala również na użycie własnego kodu jako biblioteki. Tworzenie biblioteki niestandardowej obejmuje następujące kroki -

Step 1: Declaring a Library

Aby jawnie zadeklarować bibliotekę, użyj library statement. Składnia deklarowania biblioteki jest taka, jak podano poniżej -

library library_name  
// library contents go here

Step 2: Associating a Library

Bibliotekę można skojarzyć na dwa sposoby -

  • W tym samym katalogu
import 'library_name'
  • Z innego katalogu
import 'dir/library_name'

Przykład: biblioteka niestandardowa

Najpierw zdefiniujmy bibliotekę niestandardową, 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); 
}

Następnie zaimportujemy bibliotekę -

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

Program powinien generować następujące elementy output -

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

Przedrostek biblioteki

Jeśli importujesz dwie biblioteki z kolidującymi identyfikatorami, możesz określić przedrostek dla jednej lub obu bibliotek. Użyj'as'słowo kluczowe do określania przedrostka. Składnię tego samego podano poniżej -

Składnia

import 'library_uri' as prefix

Przykład

Najpierw zdefiniujmy bibliotekę: loggerlib.dart.

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

Następnie zdefiniujemy kolejną bibliotekę: webloggerlib.dart.

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

Na koniec zaimportujemy bibliotekę z prefiksem.

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

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

Spowoduje to, co następuje output -

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

Na asynchronous operation wykonuje w wątku, niezależnie od mainwątek aplikacji. Gdy aplikacja wywołuje metodę w celu wykonania operacji asynchronicznie, aplikacja może kontynuować wykonywanie, podczas gdy metoda asynchroniczna wykonuje swoje zadanie.

Przykład

Weźmy przykład, aby zrozumieć tę koncepcję. W tym przypadku program akceptuje dane wejściowe użytkownika za pomocą rozszerzeniaIO 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"); 
}

Plik readLineSync()jest metodą synchroniczną. Oznacza to, że wykonanie wszystkich instrukcji następujących poreadLineSync() wywołanie funkcji zostanie zablokowane do readLineSync() metoda kończy wykonywanie.

Plik stdin.readLineSyncczeka na wejście. Zatrzymuje się w swoich ścieżkach i nie wykonuje dalej, dopóki nie otrzyma danych wejściowych użytkownika.

Powyższy przykład spowoduje, że output -

Enter your name :     
Tom                   

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

W informatyce mówimy, że coś jest synchronousgdy czeka na wystąpienie zdarzenia przed kontynuowaniem. Wadą tego podejścia jest to, że jeśli wykonanie części kodu trwa zbyt długo, wykonanie kolejnych bloków, choć niepowiązanych, zostanie zablokowane. Rozważ serwer WWW, który musi odpowiadać na wiele żądań zasobu.

Model wykonywania synchronicznego będzie blokować żądanie każdego innego użytkownika, dopóki nie zakończy przetwarzania bieżącego żądania. W takim przypadku, podobnie jak w przypadku serwera WWW, każde żądanie musi być niezależne od innych. Oznacza to, że serwer WWW nie powinien czekać na zakończenie wykonywania bieżącego żądania, zanim odpowie na żądanie innych użytkowników.

Mówiąc najprościej, powinien akceptować żądania od nowych użytkowników, zanim koniecznie zrealizuje żądania poprzednich użytkowników. Jest to określane jako asynchroniczne. Programowanie asynchroniczne oznacza w zasadzie brak czekającego lub nieblokującego modelu programowania. Plikdart:async Pakiet ułatwia implementację asynchronicznych bloków programistycznych w skrypcie Dart.

Przykład

Poniższy przykład lepiej ilustruje działanie bloku asynchronicznego.

Step 1 - Utwórz plik contact.txt plik, jak podano poniżej and zapisz go w folderze danych w bieżącym projekcie.

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

Step 2 - Napisz program, który odczyta plik bez blokowania innych części aplikacji.

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 
}

Plik output tego programu będzie następująco -

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

„End of main” jest wykonywany jako pierwszy, podczas gdy skrypt kontynuuje odczytywanie pliku. PlikFuture klasa, część dart:async, służy do uzyskiwania wyniku obliczenia po zakończeniu zadania asynchronicznego. ToFuture value jest następnie używana do zrobienia czegoś po zakończeniu obliczeń.

Po zakończeniu operacji odczytu kontrola wykonania jest przenoszona w ramach "then()". Dzieje się tak, ponieważ operacja odczytu może zająć więcej czasu i dlatego nie chce blokować innej części programu.

Dart Future

Społeczność Dart definiuje Futurejako „sposób na uzyskanie wartości kiedyś w przyszłości”. Mówiąc najprościej,Future objectssą mechanizmem reprezentującym wartości zwracane przez wyrażenie, którego wykonanie zakończy się w późniejszym czasie. Kilka wbudowanych klas Dart zwraca plikFuture gdy wywoływana jest metoda asynchroniczna.

Dart to jednowątkowy język programowania. Jeśli jakikolwiek kod blokuje wątek wykonania (na przykład przez oczekiwanie na czasochłonną operację lub blokowanie operacji we / wy), program skutecznie zawiesza się.

Operacje asynchroniczne pozwalają programowi działać bez blokowania. Dart używaFuture objects do reprezentowania operacji asynchronicznych.

Concurrencyto wykonanie kilku sekwencji instrukcji w tym samym czasie. Polega na wykonywaniu więcej niż jednego zadania jednocześnie.

Dart używa Isolatesjako narzędzie do wykonywania prac równoległych. Plikdart:isolate Package jest rozwiązaniem firmy Dart, które pozwala pobierać jednowątkowy kod Dart i umożliwia aplikacji większe wykorzystanie dostępnego sprzętu.

Isolates, jak sama nazwa wskazuje, są to izolowane jednostki działającego kodu. Jedynym sposobem przesyłania danych między nimi jest przekazywanie wiadomości, podobnie jak sposób przekazywania wiadomości między klientem a serwerem. Naisolate pomaga programowi wykorzystać zalety wielordzeniowych mikroprocesorów po wyjęciu z pudełka.

Przykład

Weźmy przykład, aby lepiej zrozumieć tę koncepcję.

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

Tutaj spawn metoda Isolate klasa ułatwia uruchomienie funkcji, foo, równolegle z resztą naszego kodu. Plikspawn funkcja przyjmuje dwa parametry -

  • funkcja, która ma zostać utworzona, i
  • obiekt, który zostanie przekazany do spawnowanej funkcji.

W przypadku, gdy nie ma obiektu do przekazania do spawnowanej funkcji, można przekazać wartość NULL.

Dwie funkcje (foo and main)może niekoniecznie działać w tej samej kolejności za każdym razem. Nie ma gwarancji, kiedyfoo będzie wykonywany i kiedy main()będzie wykonywał. Wynik będzie inny przy każdym uruchomieniu.

Wyjście 1

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

Wyjście 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!!

Na podstawie danych wyjściowych możemy wywnioskować, że kod Dart może spowodować powstanie nowego pliku isolate od uruchamiania kodu, takiego jak sposób, w jaki kod Java lub C # może rozpocząć nowy wątek.

Isolates różnią się od wątków tym, że plik isolatema własną pamięć. Nie ma sposobu na udostępnienie zmiennej międzyisolates—Jedyny sposób komunikacji isolates odbywa się poprzez przekazywanie wiadomości.

Note - Powyższe dane wyjściowe będą różne dla różnych konfiguracji sprzętu i systemu operacyjnego.

Isolate v / s Future

Asynchroniczne wykonywanie złożonej pracy obliczeniowej jest ważne, aby zapewnić responsywność aplikacji. Dart Future jest mechanizmem pobierania wartości zadania asynchronicznego po jego zakończeniu, while Dart Isolates są narzędziem do abstrahowania równoległości i wdrażania go na praktycznym, wysokim poziomie.

Testowanie jednostkowe obejmuje testowanie każdej pojedynczej jednostki aplikacji. Pomaga deweloperowi testować małe funkcjonalności bez uruchamiania całej złożonej aplikacji.

Dart external library o nazwie „test” zapewnia standardowy sposób pisania i uruchamiania testów jednostkowych.

Testowanie jednostkowe rzutek obejmuje następujące kroki -

Step 1: Installing the "test" package

Aby zainstalować pakiety innych firm w bieżącym projekcie, będziesz potrzebować pubspec.yamlplik. Żeby zainstalowaćtest packages, najpierw wprowadź następujący wpis w pubspec.yaml plik -

dependencies: 
test:

Po dokonaniu wpisu kliknij prawym przyciskiem myszy plik pubspec.yamlplik i pobierz zależności. Zainstaluje"test"pakiet. Poniżej znajduje się zrzut ekranu dla tego samego wWebStorm Redaktor.

Pakiety można instalować z command linetakże. Wpisz w terminalu:

pub get

Step 2: Importing the "test" package

import "package:test/test.dart";

Step 3 Writing Tests

Testy są określane przy użyciu funkcji najwyższego poziomu test(), podczas test assertions są wykonane przy użyciu expect()funkcjonować. Aby skorzystać z tych metod, należy je zainstalować jako plikpub zależność.

Składnia

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

Plik group()funkcja może służyć do grupowania testów. Opis każdej grupy jest dodawany na początku opisu testu.

Składnia

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

Przykład 1: zaliczenie testu

Poniższy przykład definiuje metodę Add(). Ta metoda przyjmuje dwie wartości całkowite i zwraca liczbę całkowitą reprezentującąsum. Aby to przetestowaćadd() metoda -

Step 1 - Zaimportuj test pakiet, jak podano poniżej.

Step 2 - Zdefiniuj test za pomocą test()funkcjonować. Tutajtest() funkcja używa expect() funkcja wymuszająca asercję.

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

Powinien dać następujący wynik output -

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

Przykład 2: Test negatywny

Plik subtract()zdefiniowana poniżej metoda zawiera błąd logiczny. Następującetest weryfikuje to samo.

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 - Przypadek testowy dla funkcji add() przechodzi, ale test dla subtract() zawodzi, jak pokazano poniżej.

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)

Grupowanie przypadków testowych

Możesz zgrupować test casestak, że dodaje więcej znaczenia do kodu testowego. Jeśli masz wieletest cases pomaga to w pisaniu bardziej przejrzystego kodu.

W podanym kodzie piszemy przypadek testowy dla split() funkcja i trimfunkcjonować. Dlatego logicznie grupujemy te przypadki testowe i nazywamy jeString.

Przykład

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 - Dane wyjściowe dołączą nazwę grupy dla każdego przypadku testowego, jak podano poniżej -

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

Każda strona internetowa znajduje się w oknie przeglądarki, które można traktować jako obiekt.

ZA Document objectreprezentuje dokument HTML, który jest wyświetlany w tym oknie. Obiekt Document ma różne właściwości odnoszące się do innych obiektów, które umożliwiają dostęp do treści dokumentu i modyfikację.

Sposób uzyskiwania dostępu do treści dokumentu i jego modyfikowania nazywa się Document Object Modellub DOM. Obiekty są zorganizowane w hierarchię. Ta hierarchiczna struktura dotyczy organizacji obiektów w dokumencie sieci Web.

  • Window- Najwyższe miejsce w hierarchii. Jest to najdalszy element hierarchii obiektów.

  • Document- Każdy dokument HTML ładowany do okna staje się obiektem dokumentu. Dokument zawiera zawartość strony.

  • Elements- reprezentują zawartość strony internetowej. Przykłady obejmują pola tekstowe, tytuł strony itp.

  • Nodes - są często elementami, ale mogą to być również atrybuty, tekst, komentarze i inne typy DOM.

Oto prosta hierarchia kilku ważnych obiektów DOM -

Dart zapewnia dart:htmlbiblioteka do manipulowania obiektami i elementami w DOM. Aplikacje konsolowe nie mogą używać rozszerzeniadart:htmlbiblioteka. Aby korzystać z biblioteki HTML w aplikacjach internetowych, importujdart:html -

import 'dart:html';

Idąc dalej, omówimy niektóre DOM Operations w następnej sekcji.

Znajdowanie elementów DOM

Plik dart:html Biblioteka udostępnia querySelector funkcję wyszukiwania elementów w DOM.

Element querySelector(String selectors);

Plik querySelector() funkcja zwraca pierwszy element, który pasuje do określonej grupy selektorów. "selectors powinien być ciągiem przy użyciu składni selektora CSS, jak podano poniżej

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

Przykład: Manipulowanie DOM

Wykonaj kroki podane poniżej, w środowisku IDE Webstorm -

Step 1 - Plik Nowy projekt → W lokalizacji podaj nazwę projektu w postaci DemoWebApp.

Step 1 - W sekcji „Generuj przykładową treść” wybierz SimpleWebApplication.

Stworzy przykładowy projekt, DemoWebApp. Tam jestpubspec.yaml plik zawierający zależności, które należy pobrać.

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

Jeśli masz połączenie z Internetem, zostaną one pobrane automatycznie, w przeciwnym razie możesz kliknąć prawym przyciskiem myszy plik pubspec.yaml i pobierz zależności.

W folderze internetowym znajdziesz trzy pliki: Index.html, main.dart, i 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!!!.'; 
}

Uruchom index.htmlplik; zobaczysz na ekranie następujące dane wyjściowe.

Obsługa zdarzeń

Plik dart:html Biblioteka udostępnia onClickwydarzenie dla elementów DOM. Składnia pokazuje, jak element może obsłużyć strumień zdarzeń kliknięcia.

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

Plik querySelector() funkcja zwraca element z danego DOM i onClick.listen() zajmie eventHandlermetoda, która zostanie wywołana po wywołaniu zdarzenia kliknięcia. SkładniaeventHandler podano poniżej -

void eventHanlderFunction (MouseEvent event){ }

Weźmy teraz przykład, aby zrozumieć koncepcję obsługi zdarzeń w Dart.

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

Wynik