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ąć
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 -
|
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.
|
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;
}