Программирование дротиков - Краткое руководство

Dart - это объектно-ориентированный язык с синтаксисом в стиле C, который при желании может быть преобразован в JavaScript. Он поддерживает разнообразный набор средств программирования, таких как интерфейсы, классы, коллекции, универсальные типы и дополнительную типизацию.

Dart можно широко использовать для создания одностраничных приложений. Одностраничные приложения применяются только к веб-сайтам и веб-приложениям. Одностраничные приложения позволяют перемещаться между различными экранами веб-сайта без загрузки другой веб-страницы в браузере. Классический пример:GMail ─ когда вы нажимаете на сообщение в папке «Входящие», браузер остается на той же веб-странице, но код JavaScript скрывает папку «Входящие» и выводит текст сообщения на экран.

Google выпустила специальную сборку Chromium - в Dart VM. Использование Dartium означает, что вам не нужно компилировать код в JavaScript, пока вы не будете готовы к тестированию в других браузерах.

В следующей таблице сравниваются функции Dart и JavaScript.

Характерная черта Дротик JavaScript
Система типов Необязательный, динамический Слабый, динамичный
Классы Да, одинарное наследование Прототип
Интерфейсы Да, несколько интерфейсов Нет
Параллелизм Да, с изолятами Да, с веб-воркерами HTML5

Этот учебник обеспечивает базовое понимание языка программирования Dart.

В этой главе обсуждается настройка среды выполнения для Dart на платформе Windows.

Выполнение скрипта онлайн с помощью DartPad

Вы можете протестировать свои скрипты онлайн, используя онлайн-редактор по адресу https://dartpad.dartlang.org/. Редактор Dart выполняет сценарий и отображает как HTML, так и вывод консоли. Онлайн-редактор поставляется с набором предустановленных примеров кода.

Скриншот Dartpad редактор приведен ниже -

Dartpad также позволяет кодировать более ограниченным образом. Этого можно добиться, установив флажок «Сильный режим» в правом нижнем углу редактора. Сильный режим помогает с -

  • Более сильная статическая и динамическая проверка
  • Генерация идиоматического кода JavaScript для лучшей совместимости.

Вы можете попробовать следующий пример с помощью Dartpad

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

Код отобразит следующий вывод

hello world

Настройка локальной среды

В этом разделе давайте посмотрим, как настроить локальную среду.

Использование текстового редактора

Примеры нескольких редакторов включают Windows Notepad, Notepad ++, Emacs, vim или vi и т. Д. Редакторы могут отличаться от одной операционной системы к другой. Исходные файлы обычно имеют расширение «.dart».

Установка Dart SDK

Текущая стабильная версия Dart 1.21.0. Вdart sdk можно скачать с -

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

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

Снимок экрана установки Dart SDK приведен ниже -

По завершении установки SDK установите для переменной среды PATH значение -

<dart-sdk-path>\bin

Проверка установки

Чтобы проверить, успешно ли установлен Dart, откройте командную строку и введите следующую команду -

Dart

Если установка прошла успешно, отобразится время выполнения дротика.

Поддержка IDE

Множество IDE поддерживают создание сценариев в Dart. Примеры включаютEclipse, IntelliJ, и WebStorm из реактивных мозгов.

Ниже приведены шаги по настройке среды Dart с использованием WebStrom IDE.

Установка WebStorm

Установочный файл для WebStorm можно скачать с https://www.jetbrains.com/webstorm/download/#section=windows-version.

Установочный файл WebStorm доступен для Mac OS, Windows и Linux.

После загрузки установочных файлов выполните следующие действия:

  • Установите Dart SDK: см. Шаги, перечисленные выше

  • Создайте новый проект Dart и настройте поддержку Dart

  • Чтобы создать новый проект Dart,

    • Нажмите Create New Project с экрана приветствия

    • В следующем диалоговом окне нажмите Dart

  • Если не указано значение для Dart SDKpath, затем укажите путь к SDK. Например, путь к SDK может быть<dart installation directory>/dart/dartsdk.

Добавить файл Dart в проект

Чтобы добавить файл Dart в проект -

  • Щелкните правой кнопкой мыши проект
  • Создать → Файл Dart
  • Введите имя Dart Script

Снимок экрана редактора WebStorm приведен ниже -

Инструмент dart2js

В dart2jsинструмент компилирует код Dart в JavaScript. Компиляция кода Dart в JS позволяет запускать сценарий Dart в браузерах, не поддерживающих виртуальную машину Dart.

Инструмент dart2js поставляется как часть Dart SDK и может быть найден в /dartsdk/bin folder.

Чтобы скомпилировать Dart в JavaScript, введите в терминале следующую команду

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

Эта команда создает файл, содержащий JavaScript-эквивалент вашего кода Dart. Полное руководство по использованию этой утилиты можно найти на официальном сайте Dart.

Синтаксис определяет набор правил для написания программ. Каждая языковая спецификация определяет собственный синтаксис. Программа Dart состоит из -

  • Переменные и операторы
  • Classes
  • Functions
  • Выражения и программные конструкции
  • Принятие решений и циклические конструкции
  • Comments
  • Библиотеки и пакеты
  • Typedefs
  • Структуры данных, представленные как Коллекции / Обобщения

Ваш первый код дротика

Давайте начнем с традиционного примера «Hello World» -

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

В main()function - это предопределенный метод в Dart. Этот метод действует как точка входа в приложение. Скрипту Dart нуженmain() способ исполнения. print() - это предопределенная функция, которая выводит указанную строку или значение на стандартный вывод, т.е. на терминал.

Результатом приведенного выше кода будет -

Hello World!

Выполнить программу Dart

Вы можете выполнить программу Dart двумя способами:

  • Через терминал
  • Через IDE WebStorm

Через Терминал

Чтобы выполнить программу Dart через терминал -

  • Перейти к пути к текущему проекту
  • Введите следующую команду в окне терминала
dart file_name.dart

Через IDE WebStorm

Чтобы выполнить программу Dart через IDE WebStorm:

  • Щелкните правой кнопкой мыши файл сценария Dart в среде IDE. (Файл должен содержатьmain() функция для включения выполнения)

  • Нажми на ‘Run <file_name>’вариант. Скриншот того же приведен ниже -

В качестве альтернативы можно нажать

кнопку или использовать ярлыкCtrl+Shift+F10 для выполнения сценария Dart.

Параметры командной строки Dart

Параметры командной строки Dart используются для изменения выполнения сценария Dart. Общие параметры командной строки для Dart включают следующее:

Старший Нет Параметр и описание командной строки
1 -c or --c

Включает как утверждения, так и проверки типа (режим проверки).

2 --version

Отображает информацию о версии виртуальной машины.

3 --packages <path>

Задает путь к файлу конфигурации разрешения пакета.

4 -p <path>

Указывает, где найти импортированные библиотеки. Этот параметр нельзя использовать с --packages.

5 -h or --help

Отображает справку.

Включение отмеченного режима

Программы Dart работают в двух режимах, а именно:

  • Проверенный режим
  • Режим производства (по умолчанию)

Рекомендуется запускать виртуальную машину Dart в checked modeво время разработки и тестирования, поскольку он добавляет предупреждения и ошибки, чтобы помочь процессу разработки и отладки. В выбранном режиме выполняются различные проверки, такие как проверка типов и т. Д. Чтобы включить проверенный режим, добавьте параметр -c или –-checked перед именем файла сценария во время выполнения сценария.

Однако для обеспечения повышения производительности при запуске сценария рекомендуется запускать сценарий в production mode.

Рассмотрим следующие Test.dart файл скрипта -

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

Запустите скрипт, введя -

dart Test.dart

Несмотря на несоответствие типов, скрипт выполняется успешно, так как отмеченный режим отключен. Скрипт приведет к следующему выводу -

hello

Теперь попробуйте выполнить сценарий с опцией «- - checked» или «-c» -

dart -c Test.dart

Или же,

dart - - checked Test.dart

Виртуальная машина Dart выдаст ошибку о несоответствии типов.

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)

Идентификаторы в Dart

Идентификаторы - это имена, присваиваемые элементам в программе, таким как переменные, функции и т. Д. Правила для идентификаторов:

Идентификаторы могут включать как символы, так и цифры. Однако идентификатор не может начинаться с цифры.

  • Идентификаторы не могут включать специальные символы, кроме подчеркивания (_) или знака доллара ($).

  • Идентификаторы не могут быть ключевыми словами.

  • Они должны быть уникальными.

  • Идентификаторы чувствительны к регистру.

  • Идентификаторы не могут содержать пробелов.

В следующих таблицах перечислены несколько примеров действительных и недействительных идентификаторов.

Действительные идентификаторы Неверные идентификаторы
Имя Вар
Имя Имя
число1 Имя
$ результат 1 номер

Ключевые слова в Dart

Ключевые слова имеют особое значение в контексте языка. В следующей таблице перечислены некоторые ключевые слова в Dart.

аннотация 1 Продолжить ложный новый это
как 1 по умолчанию окончательный ноль бросить
утверждать отложенный 1 Ну наконец то оператор 1 правда
асинхронный 2 делать за часть 1 пытаться
асинхронный * 2 динамический 1 получить 1 перебросить typedef 1
ждать 2 еще если возвращение вар
сломать перечислить реализует 1 набор 1 пустота
дело экспорт 1 импорт 1 статический 1 в то время как
поймать внешний 1 в супер с участием
класс расширяет является переключатель выход 2
const фабрика 1 библиотека 1 синхронизация * 2 доходность * 2

Пробелы и разрывы строк

Dart игнорирует пробелы, табуляции и символы новой строки, которые появляются в программах. Вы можете свободно использовать пробелы, табуляции и символы новой строки в своей программе, и вы можете свободно форматировать и делать отступы в своих программах аккуратным и последовательным образом, чтобы код был легким для чтения и понимания.

Dart чувствителен к регистру

Dart чувствителен к регистру. Это означает, что Dart различает символы верхнего и нижнего регистра.

Заявления заканчиваются точкой с запятой

Каждая строка инструкции называется утверждением. Каждый оператор dart должен заканчиваться точкой с запятой (;). Одна строка может содержать несколько операторов. Однако эти утверждения должны быть разделены точкой с запятой.

Комментарии в Dart

Комментарии - это способ улучшить читаемость программы. Комментарии могут использоваться для включения дополнительной информации о программе, например об авторе кода, подсказках о функции / конструкции и т. Д. Комментарии игнорируются компилятором.

Dart поддерживает следующие типы комментариев -

  • Single-line comments ( // ) - Любой текст между "//" и концом строки рассматривается как комментарий.

  • Multi-line comments (/* */) - Эти комментарии могут занимать несколько строк.

пример

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

Объектно-ориентированное программирование в Dart

Dart - объектно-ориентированный язык. Объектная ориентация - это парадигма разработки программного обеспечения, которая следует за моделированием реального мира. Объектная ориентация рассматривает программу как набор объектов, которые взаимодействуют друг с другом с помощью механизма, называемого методами.

  • Object- Объект - это представление любого объекта в реальном времени. Согласно брошь Grady, каждый объект должен иметь три особенности:

    • State - описываются атрибутами объекта.

    • Behavior - описывает, как объект будет действовать.

    • Identity - уникальное значение, которое отличает объект от множества подобных объектов.

  • Class- Класс с точки зрения ООП - это план для создания объектов. Класс инкапсулирует данные для объекта.

  • Method - Методы, облегчающие общение между объектами.

Пример: дротик и объектная ориентация

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

В приведенном выше примере определяется класс TestClass. У класса есть методdisp(). Метод выводит на терминал строку «Hello World». Ключевое слово new создает объект класса. Объект вызывает методdisp().

Код должен выдать следующее output -

Hello World

Одна из наиболее фундаментальных характеристик языка программирования - это набор поддерживаемых им типов данных. Это тип значений, которые можно представить и которыми можно управлять на языке программирования.

Язык Dart поддерживает следующие типы:

  • Numbers
  • Strings
  • Booleans
  • Lists
  • Maps

Числа

Числа в Dart используются для представления числовых литералов. Number Dart бывает двух видов -

  • Integer- Целочисленные значения представляют собой не дробные значения, т. Е. Числовые значения без десятичной точки. Например, значение «10» - целое число. Целочисленные литералы представлены с помощьюint ключевое слово.

  • Double- Dart также поддерживает дробные числовые значения, то есть значения с десятичными точками. Тип данных Double в Dart представляет собой 64-битное (двойной точности) число с плавающей запятой. Например, значение «10,10». Ключевое словоdouble используется для представления литералов с плавающей запятой.

Струны

Строки представляют собой последовательность символов. Например, если вы должны были хранить некоторые данные, такие как имя, адрес и т. Д., Следует использовать строковый тип данных. Строка Dart - это последовательность кодовых единиц UTF-16.Runes используются для представления последовательности кодовых единиц UTF-32.

Ключевое слово Stringиспользуется для представления строковых литералов. Строковые значения заключаются в одинарные или двойные кавычки.

Булево

Тип данных Boolean представляет логические значения true и false. Дарт используетbool ключевое слово для представления логического значения.

Список и карта

Список типов данных и карта используются для представления коллекции объектов. АList- упорядоченная группа объектов. Тип данных List в Dart является синонимом концепции массива в других языках программирования. ВMapТип данных представляет собой набор значений в виде пар "ключ-значение". Вdart: core библиотека позволяет создавать и управлять этими коллекциями с помощью предопределенных классов List и Map соответственно.

Динамический Тип

Dart - это язык с произвольной типизацией. Если тип переменной не указан явно, тип переменной будетdynamic. Вdynamic ключевое слово также может использоваться явно как аннотация типа.

Переменная - это «именованное пространство в памяти», в котором хранятся значения. Другими словами, он действует как контейнер для значений в программе. Имена переменных называются идентификаторами. Ниже приведены правила именования идентификатора -

  • Идентификаторы не могут быть ключевыми словами.

  • Идентификаторы могут содержать буквы и цифры.

  • Идентификаторы не могут содержать пробелы и специальные символы, за исключением подчеркивания (_) и знака доллара ($).

  • Имена переменных не могут начинаться с цифры.

Синтаксис типа

Перед использованием переменная должна быть объявлена. Дарт использует ключевое слово var для достижения того же. Синтаксис объявления переменной приведен ниже -

var name = 'Smith';

Все переменные в dart хранят ссылку на значение, а не значение. Переменная с именем name содержит ссылку на объект String со значением «Smith».

Дарт поддерживает type-checkingдобавив к имени переменной префикс типа данных. Проверка типов гарантирует, что переменная содержит только данные, относящиеся к определенному типу данных. Синтаксис для этого же приведен ниже -

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

Рассмотрим следующий пример -

void main() { 
   String name = 1; 
}

Приведенный выше фрагмент приведет к предупреждению, поскольку значение, присвоенное переменной, не соответствует типу данных переменной.

Вывод

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

Все неинициализированные переменные имеют начальное значение null. Это потому, что Дарт рассматривает все значения как объекты. Следующий пример иллюстрирует то же самое -

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

Вывод

Null

Ключевое слово dynamic

Переменные, объявленные без статического типа, неявно объявляются как динамические. Переменные также можно объявлять с помощью ключевого слова dynamic вместо ключевого слова var.

Следующий пример иллюстрирует то же самое.

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

Вывод

tom

Финал и Конст

В final и constключевое слово используются для объявления констант. Dart предотвращает изменение значений переменной, объявленной с использованием ключевого слова final или const. Эти ключевые слова могут использоваться вместе с типом данных переменной или вместоvar ключевое слово.

В constключевое слово используется для представления константы времени компиляции. Переменные, объявленные с использованиемconst ключевое слово являются неявно окончательными.

Синтаксис: последнее ключевое слово

final variable_name

ИЛИ ЖЕ

final data_type  variable_name

Синтаксис: ключевое слово const

const variable_name

ИЛИ ЖЕ

const data_type variable_name

Пример - последнее ключевое слово

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

Вывод

12

Пример - ключевое слово const

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

В приведенном выше примере объявляются две константы, pi и area, используя constключевое слово. Вarea значение переменной - это константа времени компиляции.

Вывод

The output is 452.15999999999997

Note - Только constпеременные могут использоваться для вычисления постоянной времени компиляции. Константы времени компиляции - это константы, значения которых будут определены во время компиляции.

пример

Dart выдает исключение, если предпринимается попытка изменить переменные, объявленные с finalили ключевое слово const. Пример, приведенный ниже, иллюстрирует то же самое -

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

Приведенный выше код вызовет следующую ошибку: 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)

Выражение - это особый вид оператора, который возвращает значение. Каждое выражение состоит из -

  • Operands - Представляет данные

  • Operator - Определяет, как операнды будут обрабатываться для получения значения.

Рассмотрим следующее выражение - «2 + 3». В этом выражении 2 и 3 являютсяoperands а символ "+" (плюс) - это operator.

В этой главе мы обсудим операторы, доступные в Dart.

  • Арифметические операторы
  • Операторы равенства и отношения
  • Операторы типовых испытаний
  • Побитовые операторы
  • Операторы присваивания
  • Логические операторы

Арифметические операторы

В следующей таблице показаны арифметические операторы, поддерживаемые Dart.

Показать примеры

Старший Нет Операторы и значение
1 +

Добавить

2

Вычесть

3 -expr

Унарный минус, также известный как отрицание (переверните знак выражения)

4 *

Умножить

5 /

Делить

6 ~/

Делить, возвращая целочисленный результат

7 %

Получить остаток от целочисленного деления (по модулю)

8 ++

Инкремент

9 --

Декремент

Операторы равенства и отношения

Операторы отношения проверяют или определяют вид отношений между двумя объектами. Операторы отношения возвращают логическое значение, т.е. истина / ложь.

Предположим, что значение A равно 10, а B равно 20.

Показать примеры

Оператор Описание пример
> Лучше чем (A> B) ложно
< Меньше, чем (A <B) верно
> = Больше или равно (A> = B) ложно
<= Меньше или равно (A <= B) верно
== Равенство (A == B) ложно
знак равно Не равный (A! = B) верно

Операторы типовых испытаний

Эти операторы удобны для проверки типов во время выполнения.

Показать примеры

Оператор Имея в виду
является Истинно, если объект имеет указанный тип
является! False, если объект имеет указанный тип

Побитовые операторы

В следующей таблице перечислены побитовые операторы, доступные в Dart, и их роль.

Показать примеры

Оператор Описание пример
Побитовое И а и б Возвращает единицу в каждой битовой позиции, для которой соответствующие биты обоих операндов равны единице.
Побитовое ИЛИ а | б Возвращает единицу в каждой битовой позиции, для которой соответствующие биты одного или обоих операндов равны единице.
Побитовое исключающее ИЛИ а ^ б Возвращает единицу в каждой битовой позиции, для которой соответствующие биты одного, но не обоих операндов равны единице.
Побитовое НЕ ~ а Инвертирует биты своего операнда.
Левый "шифт а ≪ б Сдвигает a в двоичном представлении на b (<32) бит влево, сдвигая на нули справа.
Знак, распространяющийся вправо а ≫ б Сдвигает a в двоичном представлении на b (<32) бит вправо, отбрасывая сдвинутые биты.

Операторы присваивания

В следующей таблице перечислены операторы присваивания, доступные в Dart.

Показать примеры

Старший Нет Оператор и описание
1 =(Simple Assignment )

Назначает значения от правого операнда к левому операнду

Ex: C = A + B присвоит значение A + B в C

2 ??=

Назначьте значение, только если переменная пуста

3 +=(Add and Assignment)

Он добавляет правый операнд к левому операнду и присваивает результат левому операнду.

Ex: C + = A эквивалентно C = C + A

4 ─=(Subtract and Assignment)

Он вычитает правый операнд из левого операнда и присваивает результат левому операнду.

Ex: C - = A эквивалентно C = C - A

5 *=(Multiply and Assignment)

Он умножает правый операнд на левый операнд и присваивает результат левому операнду.

Ex: C * = A эквивалентно C = C * A

6 /=(Divide and Assignment)

Он делит левый операнд на правый и присваивает результат левому операнду.

Note - Та же логика применяется к побитовым операторам, поэтому они станут ≪ =, ≫ =, ≫ =, ≫ =, | = и ^ =.

Логические операторы

Логические операторы используются для объединения двух или более условий. Логические операторы возвращают логическое значение. Предположим, что значение переменной A равно 10, а B равно 20.

Показать примеры

Оператор Описание пример
&&

And - Оператор возвращает истину, только если все указанные выражения возвращают истину

(A> 10 && B> 10) ложно.
||

OR - Оператор возвращает истину, если хотя бы одно из указанных выражений возвращает истину.

(A> 10 || B> 10) верно.
!

NOT- Оператор возвращает результат, обратный результату выражения. Например:! (7> 5) возвращает false

! (A> 10) верно.

Условные выражения

В Dart есть два оператора, которые позволяют оценивать выражения, которые в противном случае могли бы потребовать операторов ifelse:

состояние ? expr1: expr2

Если условие истинно, тогда выражение оценивает expr1(и возвращает его значение); в противном случае он оценивает и возвращает значениеexpr2.

expr1 ?? expr2

Если expr1не равно нулю, возвращает свое значение; в противном случае оценивает и возвращает значениеexpr2

пример

В следующем примере показано, как можно использовать условное выражение в Dart -

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

Он выдаст следующий результат -

value lesser than or equal to 10

пример

Возьмем другой пример -

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

Он выдаст следующий результат -

12

Иногда некоторые инструкции требуют повторного выполнения. Циклы - идеальный способ сделать то же самое. Цикл представляет собой набор инструкций, которые необходимо повторить. В контексте цикла повторение называетсяiteration.

На следующем рисунке показана классификация петель -

Начнем обсуждение с определенных циклов. Цикл, количество итераций которого определено / фиксировано, называетсяdefinite loop.

Старший Нет Цикл и описание
1 для цикла

В forloop - это реализация определенного цикла. Цикл for выполняет блок кода указанное количество раз. Его можно использовать для перебора фиксированного набора значений, например массива

2 for… in Loop

Цикл for ... in используется для просмотра свойств объекта.

Двигаясь дальше, давайте теперь обсудим неопределенные циклы. Неопределенный цикл используется, когда количество итераций в цикле неопределенно или неизвестно. Неопределенные циклы могут быть реализованы с использованием -

Старший Нет Цикл и описание
1 пока цикл

Цикл while выполняет инструкции каждый раз, когда указанное условие оценивается как истинное. Другими словами, цикл оценивает условие перед выполнением блока кода.

2 делать… while Loop

Цикл do… while аналогичен циклу while, за исключением того, что цикл do… while не оценивает условие при первом выполнении цикла.

Давайте теперь продолжим и обсудим Loop Control Statements дротика.

Старший Нет Положение и описание управления
1 заявление о прерывании

В breakОператор используется для вывода управления из конструкции. С помощьюbreakв цикле заставляет программу выйти из цикла. Ниже приводится примерbreak заявление.

2 продолжить заявление

В continue оператор пропускает последующие операторы в текущей итерации и возвращает управление в начало цикла.

Использование меток для управления потоком

А label- это просто идентификатор, за которым следует двоеточие (:), применяемый к оператору или блоку кода. Этикетку можно использовать сbreak и continue для более точного управления потоком.

Разрывы строк между ‘continue’ или же ‘break’заявление и название его ярлыка. Кроме того, не должно быть никаких других операторов между именем метки и связанным циклом.

Пример: этикетка с разрывом

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

Следующее output отображается при успешном выполнении вышеуказанного кода.

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

Пример: ярлык с продолжением

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

Следующий вывод отображается при успешном выполнении вышеуказанного кода.

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

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

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

Условная конструкция / конструкция принятия решения оценивает условие перед выполнением инструкций.

Условные конструкции в Dart классифицированы в следующей таблице.

Старший Нет Заявление и описание
1 if заявление

An if Оператор состоит из логического выражения, за которым следует один или несколько операторов.

2 Если ... Иное заявление

An if может сопровождаться необязательным elseблок. Вelse блок будет выполняться, если логическое выражение проверено if блок оценивается как ложь.

3 иначе… если лестница

В else…if ladderполезно для проверки нескольких условий. Ниже приводится синтаксис того же.

4 switch… case Заявление

Оператор switch оценивает выражение, сопоставляет значение выражения с предложением case и выполняет операторы, связанные с этим случаем.

Номера дротиков можно классифицировать как -

  • int- Целое число произвольного размера. Вint тип данных используется для представления целых чисел.

  • double- 64-битные числа с плавающей запятой (двойной точности), как указано в стандарте IEEE 754. Вdouble тип данных используется для представления дробных чисел

В num тип наследуется int и doubleтипы. Вdart core library позволяет выполнять многочисленные операции с числовыми значениями.

Синтаксис объявления числа приведен ниже -

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

пример

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

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

Он выдаст следующий результат -

10 
10.5

Note - The Dart VM вызовет исключение, если целочисленным переменным присвоены дробные значения.

Парсинг

В parse()статическая функция позволяет преобразовать строку, содержащую числовой литерал, в число. Следующая иллюстрация демонстрирует то же самое -

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

Приведенный выше код приведет к следующему выводу -

12 
10.91

Функция синтаксического анализа выдает FormatExceptionесли ему передается любое значение, кроме цифр. В следующем коде показано, как передать буквенно-цифровое значение вparse() функция.

пример

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

Приведенный выше код приведет к следующему выводу -

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)

Число Свойства

В следующей таблице перечислены свойства, поддерживаемые числами Dart.

Старший Нет Описание недвижимости
1 хэш-код

Возвращает хэш-код для числового значения.

2 isFinite

Верно, если число конечно; в противном случае - ложь.

3 isInfinite

Истинно, если число положительно или отрицательно; в противном случае - ложь.

4 isNan

Истинно, если число является двойным значением Not-a-Number; в противном случае - ложь.

5 isNegative

Истинно, если число отрицательное; в противном случае - ложь.

6 подписать

Возвращает минус один, ноль или плюс один в зависимости от знака и числового значения числа.

7 даже

Возвращает истину, если число четное.

8 isOdd

Возвращает истину, если число нечетное.

Числовые методы

Ниже приведен список часто используемых методов, поддерживаемых числами -

Старший Нет Метод и описание
1 пресс

Возвращает абсолютное значение числа.

2 потолок

Возвращает наименьшее целое число не меньше числа.

3 по сравнению с

Сравнивает это с другим числом.

4 Этаж

Возвращает наибольшее целое число, не большее текущего числа.

5 остаток

Возвращает усеченный остаток от деления двух чисел.

6 Круглый

Возвращает целое число, ближайшее к текущим числам.

7 удвоить

Возвращает двойной эквивалент числа.

8 toInt

Возвращает целочисленный эквивалент числа.

9

Возвращает строковое эквивалентное представление числа.

10 обрезать

Возвращает целое число после отбрасывания дробных цифр.

Тип данных String представляет собой последовательность символов. Строка Dart - это последовательность кодовых единиц UTF 16.

Строковые значения в Dart могут быть представлены в одинарных, двойных или тройных кавычках. Однострочные строки представлены одинарными или двойными кавычками. Тройные кавычки используются для представления многострочных строк.

Синтаксис представления строковых значений в Dart приведен ниже -

Синтаксис

String  variable_name = 'value'  

OR  

String  variable_name = ''value''  

OR  

String  variable_name = '''line1 
line2'''  

OR  

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

В следующем примере показано использование типа данных String в 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); 
}

Это приведет к следующему 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

Строки неизменны. Однако со строками можно выполнять различные операции, и результирующая строка может быть сохранена как новое значение.

Строчная интерполяция

Процесс создания новой строки путем добавления значения к статической строке называется concatenation или же interpolation. Другими словами, это процесс добавления строки к другой строке.

Оператор плюс (+) - это обычно используемый механизм для объединения / интерполяции строк.

Пример 1

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

Это приведет к следующему output -

The concatenated string : Helloworld

Пример 2

Вы можете использовать "$ {}", чтобы интерполировать значение выражения Dart внутри строк. Следующий пример иллюстрирует то же самое.

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

Это приведет к следующему output -

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

Свойства строки

Все свойства, перечисленные в следующей таблице, доступны только для чтения.

Старший Нет Описание недвижимости
1 codeUnits

Возвращает неизменяемый список кодовых единиц UTF-16 этой строки.

2 пусто

Возвращает истину, если эта строка пуста.

3 Длина

Возвращает длину строки, включая пробелы, символы табуляции и новой строки.

Методы манипулирования строками

Класс String в dart: core libraryтакже предоставляет методы для управления строками. Некоторые из этих методов приведены ниже -

Старший Нет Методы и описание
1 toLowerCase ()

Преобразует все символы в этой строке в нижний регистр.

2 toUpperCase ()

Преобразует все символы в этой строке в верхний регистр.

3 отделка()

Возвращает строку без начальных и конечных пробелов.

4 по сравнению с()

Сравнивает этот объект с другим.

5 заменить все()

Заменяет все подстроки, соответствующие указанному шаблону, на заданное значение.

6 Трещина()

Разбивает строку в соответствии с указанным разделителем и возвращает список подстрок.

7 подстрока ()

Возвращает подстроку этой строки, которая простирается от startIndex включительно до endIndex, исключая.

8 нанизывать()

Возвращает строковое представление этого объекта.

9 codeUnitAt ()

Возвращает 16-битную единицу кода UTF-16 по заданному индексу.

Dart предоставляет встроенную поддержку логического типа данных. Тип данных Boolean в DART поддерживает только два значения - true и false. Ключевое слово bool используется для представления логического литерала в DART.

Синтаксис объявления логической переменной в DART приведен ниже:

bool var_name = true;  
OR  
bool var_name = false

пример

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

Это приведет к следующему output -

true

пример

В отличие от JavaScript, тип данных Boolean распознает только буквальное значение true как true. Любое другое значение считается ложным. Рассмотрим следующий пример -

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

Приведенный выше фрагмент, если он запущен в JavaScript, напечатает сообщение «String is not empty», поскольку конструкция if вернет true, если строка не пуста.

Однако в Dart strпреобразуется в false как str! = true . Следовательно, фрагмент будет печатать сообщение «Пустая строка» (при запуске в неотмеченном режиме).

пример

Приведенный выше фрагмент при запуске checkedmode вызовет исключение. То же самое проиллюстрировано ниже -

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

Это приведет к следующему output, в 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)

Это приведет к следующему output, в Unchecked Mode -

Empty String

Note - The WebStorm По умолчанию IDE работает в отмеченном режиме.

Очень часто используемая коллекция в программировании - это array. Дарт представляет массивы в видеListобъекты. АListэто просто упорядоченная группа объектов. Вdart:core Библиотека предоставляет класс List, который позволяет создавать списки и управлять ими.

Логическое представление списка в Dart приведено ниже -

  • test_list - это идентификатор, который ссылается на коллекцию.

  • Список содержит значения 12, 13 и 14. Блоки памяти, содержащие эти значения, известны как elements.

  • Каждый элемент в списке идентифицируется уникальным номером, который называется index. Индекс начинается сzero и простирается до n-1 где n- общее количество элементов в списке. Индекс также называютsubscript.

Списки можно классифицировать как -

  • Список фиксированной длины
  • Растущий список

Давайте теперь обсудим эти два типа lists в деталях.

Список фиксированной длины

Длина списка фиксированной длины не может измениться во время выполнения. Синтаксис для создания списка фиксированной длины приведен ниже -

Step 1 − Declaring a list

Синтаксис для объявления списка фиксированной длины приведен ниже -

var list_name = new List(initial_size)

Приведенный выше синтаксис создает список указанного размера. Список не может увеличиваться или уменьшаться во время выполнения. Любая попытка изменить размер списка приведет к исключению.

Step 2 − Initializing a list

Синтаксис для инициализации списка приведен ниже -

lst_name[index] = value;

пример

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

Это приведет к следующему output -

[12, 13, 11]

Растущий список

Длина расширяемого списка может изменяться во время выполнения. Синтаксис для объявления и инициализации расширяемого списка приведен ниже:

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

Индекс / нижний индекс используется для ссылки на элемент, который должен быть заполнен значением. Синтаксис для инициализации списка приведен ниже -

list_name[index] = value;

пример

В следующем примере показано, как создать список из 3 элементов.

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

Это приведет к следующему output -

[1, 2, 3]

пример

В следующем примере создается список нулевой длины с использованием empty List() constructor. Вadd() функция в List Класс используется для динамического добавления элементов в список.

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

Это приведет к следующему output -

[12, 13]

Свойства списка

В следующей таблице перечислены некоторые часто используемые свойства List класс в dart:core library.

Старший Нет Методы и описание
1 первый

Возвращает регистр первого элемента.

2 пусто

Возвращает true, если в коллекции нет элементов.

3 isNotEmpty

Возвращает true, если в коллекции есть хотя бы один элемент.

4 длина

Возвращает размер списка.

5 последний

Возвращает последний элемент в списке.

6 перевернутый

Возвращает итерируемый объект, содержащий значения списков в обратном порядке.

7 не замужем

Проверяет, есть ли в списке только один элемент, и возвращает его.

В этой главе мы обсудим, как выполнять некоторые основные операции со списками, такие как -

Старший Нет Основные операции и описание
1 Вставка элементов в список

Изменяемые списки могут динамически расти во время выполнения. ВList.add() функция добавляет указанное значение в конец списка и возвращает измененный объект списка.

2 Обновление списка

Списки в Dart могут быть обновлены:

  • Обновление индекса
  • Использование функции List.replaceRange ()
3 Удаление элементов списка

Следующие функции, поддерживаемые классом List в библиотеке dart: core, могут использоваться для удаления элемента (ов) из списка.

Объект Map - это простая пара ключ / значение. Ключи и значения на карте могут быть любого типа. Карта - это динамическая коллекция. Другими словами, Карты могут увеличиваться и уменьшаться во время выполнения.

Карты могут быть объявлены двумя способами -

  • Использование литералов карты
  • Использование конструктора карты

Объявление карты с использованием литералов карты

Чтобы объявить карту с использованием литералов карты, необходимо заключить пары ключ-значение в пару фигурных скобок. "{ }".

Вот его syntax -

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

Объявление карты с помощью конструктора карт

Чтобы объявить карту с помощью конструктора карты, у нас есть два шага. Сначала объявите карту, а во-вторых, инициализируйте карту.

В syntax к declare a map выглядит следующим образом -

var identifier = new Map()

Теперь используйте следующий синтаксис для initialize the map -

map_name[key] = value

Пример: литерал карты

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

Это приведет к следующему output -

{Usrname: tom, Password: pass@123}

Пример: добавление значений в литералы карты во время выполнения

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

Это приведет к следующему output -

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

Пример: конструктор карты

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

Это приведет к следующему output -

{Usrname: admin, Password: admin@123}

Note - Значение карты может быть любым объектом, включая NULL.

Карта - Свойства

В Map класс в пакете dart: core определяет следующие свойства:

Старший Нет Описание недвижимости
1 Ключи

Возвращает повторяемый объект, представляющий ключи

2 Значения

Возвращает итерируемый объект, представляющий значения

3 Длина

Возвращает размер карты.

4 пусто

Возвращает истину, если карта является пустой картой.

5 isNotEmpty

Возвращает истину, если карта является пустой картой.

Карта - Функции

Ниже приведены наиболее часто используемые функции для управления картами в Dart.

Старший Нет Название и описание функции
1 добавить все()

Добавляет на эту карту все пары "ключ-значение" другого.

2 Чисто()

Удаляет все пары с карты.

3 удалять()

Удаляет ключ и связанное с ним значение, если оно есть, с карты.

4 для каждого()

Применяет f к каждой паре "ключ-значение" на карте.

Символы в Dart - это непрозрачное динамическое строковое имя, используемое для отражения метаданных из библиотеки. Проще говоря, символы - это способ сохранить связь между строкой, читаемой человеком, и строкой, оптимизированной для использования компьютерами.

Отражение - это механизм для получения метаданных типа во время выполнения, таких как количество методов в классе, количество конструкторов, которые он имеет, или количество параметров в функции. Вы даже можете вызвать метод того типа, который загружается во время выполнения.

В отражении Dart определенные классы доступны в dart:mirrorsпакет. Эта библиотека работает как в веб-приложениях, так и в приложениях командной строки.

Синтаксис

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

В name должно быть действительным именем общедоступного члена Dart, именем общедоступного конструктора или именем библиотеки.

пример

Рассмотрим следующий пример. Код объявляет классFoo в библиотеке foo_lib. Класс определяет методыm1, m2, и 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"); 
   } 
}

Следующий код загружает Foo.dartбиблиотека и ищет класс Foo с помощью типа Symbol. Поскольку мы отражаем метаданные из указанной выше библиотеки, код импортируетdart:mirrors библиотека.

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

Обратите внимание, что строка libMirror.declarations.forEach ((s, d) => print (s)); будет перебирать каждое объявление в библиотеке во время выполнения и печатать объявления как типSymbol.

Этот код должен дать следующее output -

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

Пример: отображение количества методов экземпляра класса

Давайте теперь рассмотрим отображение количества экземпляров методов в классе. Предопределенный классClassMirror помогает нам добиться того же.

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

Этот код должен дать следующее 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")

Преобразовать символ в строку

Вы можете преобразовать имя типа, такого как класс или библиотека, хранящиеся в символе, обратно в строку, используя MirrorSystemкласс. В следующем коде показано, как преобразовать символ в строку.

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

Должно получиться следующее output -

Symbol("foo_lib")   

foo_lib

Строки - это последовательность символов. Dart представляет строки как последовательность кодовых единиц Unicode UTF-16. Юникод - это формат, который определяет уникальное числовое значение для каждой буквы, цифры и символа.

Поскольку строка Dart представляет собой последовательность кодовых единиц UTF-16, 32-битные значения Unicode в строке представлены с использованием специального синтаксиса. Аrune - целое число, представляющее кодовую точку Unicode.

Класс String в dart:core библиотека предоставляет механизмы для доступа runes. К единицам строкового кода / рунам можно получить доступ тремя способами:

  • Использование функции String.codeUnitAt ()
  • Использование свойства String.codeUnits
  • Использование свойства String.runes

String.codeUnitAt () Функция

Доступ к кодовым единицам в строке можно получить через их индексы. Возвращает 16-битную единицу кода UTF-16 по заданному индексу.

Синтаксис

String.codeUnitAt(int index);

пример

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

Это приведет к следующему output -

82

String.codeUnits Свойство

Это свойство возвращает неизменяемый список единиц кода UTF-16 указанной строки.

Синтаксис

String. codeUnits;

пример

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

Это приведет к следующему output -

[82, 117, 110, 101, 115]

String.runes Свойство

Это свойство возвращает итерацию кодовых точек Unicode этого string.Runes расширяет итерабельность.

Синтаксис

String.runes

пример

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

Это приведет к следующему output -

A 
s 
t 
r 
i 
n 
g

Кодовые точки Unicode обычно выражаются как \uXXXX, где XXXX - четырехзначное шестнадцатеричное значение. Чтобы указать более или менее 4 шестнадцатеричных цифр, заключите значение в фигурные скобки. Для этого можно использовать конструктор класса Runes в библиотеке dart: core.

пример

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

Это приведет к следующему output -

Перечисление используется для определения именованных значений констант. Перечислимый тип объявляется с помощьюenum ключевое слово.

Синтаксис

enum enum_name {  
   enumeration list 
}

Где,

  • Enum_name задает имя типа перечисления
  • Список перечисления представляет собой список идентификаторов, разделенных запятыми.

Каждый из символов в списке перечисления обозначает целочисленное значение, на единицу большее, чем предшествующий ему символ. По умолчанию значение первого символа перечисления равно 0.

Например

enum Status { 
   none, 
   running, 
   stopped, 
   paused 
}

пример

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

Это приведет к следующему 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

Функции - это строительные блоки читаемого, поддерживаемого и повторно используемого кода. Функция - это набор операторов для выполнения определенной задачи. Функции организуют программу в логические блоки кода. После определения функции могут быть вызваны для доступа к коду. Это делает код многоразовым. Кроме того, функции позволяют легко читать и поддерживать код программы.

Объявление функции сообщает компилятору об имени функции, типе возвращаемого значения и параметрах. Определение функции предоставляет фактическое тело функции.

Старший Нет Функции и описание
1 Определение функции

Определение функции указывает, что и как будет выполняться конкретная задача.

2 Вызов функции

Функция должна быть вызвана для ее выполнения.

3 Возврат функций

Функции также могут возвращать значение вместе с управлением обратно вызывающей стороне.

4 Параметризованная функция

Параметры - это механизм передачи значений функциям.

Дополнительные параметры

Необязательные параметры могут использоваться, когда аргументы не требуется принудительно передавать для выполнения функции. Параметр можно пометить как необязательный, добавив к его имени знак вопроса. Необязательный параметр должен быть установлен в качестве последнего аргумента функции.

В Dart есть три типа необязательных параметров:

Старший Нет Параметр и описание
1 Дополнительный позиционный параметр

Чтобы указать необязательные позиционные параметры, используйте квадратные скобки [].

2 Необязательный именованный параметр

В отличие от позиционных параметров, имя параметра должно быть указано во время передачи значения. Фигурную скобку {} можно использовать для указания необязательных именованных параметров.

3 Необязательные параметры со значениями по умолчанию

Параметрам функции также могут быть присвоены значения по умолчанию. Однако такие параметры также могут быть явно переданными значениями.

Рекурсивные функции Dart

Рекурсия - это метод итерации по операции путем многократного вызова функции самой себя до тех пор, пока не будет достигнут результат. Рекурсию лучше всего применять, когда вам нужно многократно вызывать одну и ту же функцию с разными параметрами из цикла.

пример

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

Должно получиться следующее output -

720

Лямбда-функции

Лямбда-функции - это краткий механизм для представления функций. Эти функции также называются функциями стрелок.

Синтаксис

[return_type]function_name(parameters)=>expression;

пример

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

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

Должно получиться следующее output -

hello 123

An interfaceопределяет синтаксис, которого должна придерживаться любая сущность. Интерфейсы определяют набор методов, доступных для объекта. Dart не имеет синтаксиса для объявления интерфейсов. Объявления классов сами по себе являются интерфейсами в Dart.

Classesследует использовать ключевое слово Implements, чтобы иметь возможность использовать интерфейс. Реализующий класс обязательно должен предоставить конкретную реализацию всех функций реализованного интерфейса. Другими словами, класс должен переопределить каждую функцию в интерфейсе, который он хочет реализовать.

Синтаксис: реализация интерфейса

class identifier implements interface_name

пример

В следующей программе мы объявляем класс Printer. ВConsolePrinter класс реализует неявное объявление интерфейса для Printerкласс. Вmain функция создает объект ConsolePrinter класс с использованием newключевое слово. Этот объект используется для вызова функцииprint_data определено в ConsolePrinter класс.

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

Должно получиться следующее output -

__________Printing to Console__________

Реализация нескольких интерфейсов

Класс может реализовывать несколько интерфейсов. Интерфейсы разделяются запятой. Вsyntax для того же самого дано ниже -

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

Следующее example показывает, как вы можете реализовать несколько интерфейсов в 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; 
   } 
}

Должно получиться следующее output -

The gross total: 1000 
Discount:50

Dart - объектно-ориентированный язык. Он поддерживает функции объектно-ориентированного программирования, такие как классы, интерфейсы и т. Д.classс точки зрения ООП - это план создания объектов. Аclassинкапсулирует данные для объекта. Dart предоставляет встроенную поддержку этой концепции под названиемclass.

Объявление класса

Использовать class ключевое слово для объявления classв Дарт. Определение класса начинается с ключевого слова class, за которым следуетclass name; и тело класса, заключенное в фигурные скобки. Синтаксис для этого же приведен ниже -

Синтаксис

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

В classза ключевым словом следует имя класса. При именовании класса необходимо учитывать правила для идентификаторов.

Определение класса может включать следующее:

  • Fields- Поле - это любая переменная, объявленная в классе. Поля представляют данные, относящиеся к объектам.

  • Setters and Getters- Позволяет программе инициализировать и получать значения полей класса. С каждым классом связан геттер / сеттер по умолчанию. Однако значения по умолчанию можно переопределить, явно указав установщик / получатель.

  • Constructors - отвечает за выделение памяти для объектов класса.

  • Functions- Функции представляют действия, которые может выполнять объект. Иногда их также называют методами.

Эти компоненты вместе называются data members класса.

Пример: объявление класса

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

В примере объявляется класс Car. В классе есть поле с именемengine. Вdisp() это простая функция, которая печатает значение поля engine.

Создание экземпляра класса

Чтобы создать экземпляр класса, используйте newключевое слово, за которым следует имя класса. Синтаксис для этого же приведен ниже -

Синтаксис

var object_name = new class_name([ arguments ])
  • В new ключевое слово отвечает за создание экземпляра.

  • Правая часть выражения вызывает конструктор. Конструктору следует передавать значения, если он параметризован.

Пример: создание класса

var obj = new Car("Engine 1")

Доступ к атрибутам и функциям

Доступ к атрибутам и функциям класса можно получить через объект. Использовать '.' точечная запись (называемаяperiod) для доступа к элементам данных класса.

//accessing an attribute 
obj.field_name  

//accessing a function 
obj.function_name()

пример

Взгляните на следующий пример, чтобы понять, как получить доступ к атрибутам и функциям в Dart:

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

В output приведенного выше кода выглядит следующим образом -

E1001

Конструкторы дротиков

Конструктор - это специальная функция класса, которая отвечает за инициализацию переменных класса. Dart определяет конструктор с тем же именем, что и у класса. Конструктор - это функция, поэтому его можно параметризовать. Однако, в отличие от функции, конструкторы не могут иметь возвращаемый тип. Если вы не объявляете конструктор, по умолчаниюno-argument constructor предоставляется для вас.

Синтаксис

Class_name(parameter_list) { 
   //constructor body 
}

пример

В следующем примере показано, как использовать конструкторы в Dart -

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

Должно получиться следующее output -

E1001

Именованные конструкторы

Дарт предоставляет named constructors чтобы разрешить определение класса multiple constructors. Синтаксис именованных конструкторов приведен ниже -

Синтаксис: определение конструктора

Class_name.constructor_name(param_list)

пример

В следующем примере показано, как вы можете использовать именованные конструкторы в 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}");    
   }                               
}

Должно получиться следующее output -

The engine is : E1001 
Non-parameterized constructor invoked

Это ключевое слово

В thisключевое слово относится к текущему экземпляру класса. Здесь имя параметра и имя поля класса совпадают. Следовательно, чтобы избежать двусмысленности, поле класса имеет префиксthisключевое слово. Следующий пример объясняет то же самое -

пример

В следующем примере объясняется, как использовать this ключевое слово в Dart -

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

Должно получиться следующее output -

The engine is : E1001

Класс Dart ─ геттеры и сеттеры

Getters и Setters, также называемый accessors и mutators, позволяют программе инициализировать и получать значения полей класса соответственно. Геттеры или аксессоры определяются с помощьюgetключевое слово. Сеттеры или мутаторы определяются с помощьюset ключевое слово.

С каждым классом связан геттер / сеттер по умолчанию. Однако значения по умолчанию можно переопределить, явно указав установщик / получатель. Получатель не имеет параметров и возвращает значение, а метод установки имеет один параметр и не возвращает значение.

Синтаксис: определение получателя

Return_type  get identifier 
{ 
}

Синтаксис: определение установщика

set identifier 
{ 
}

пример

В следующем примере показано, как можно использовать getters и setters в классе 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); 
}

Этот программный код должен выдавать следующие output -

Age should be greater than 5 
MARK 
Null

Наследование класса

Dart поддерживает концепцию наследования, которая представляет собой способность программы создавать новые классы из существующего класса. Класс, который расширяется для создания новых классов, называется родительским классом / суперклассом. Вновь созданные классы называются дочерними / подклассами.

Класс наследуется от другого класса с помощью ключевого слова extends. Child classes inherit all properties and methods except constructors from the parent class.

Синтаксис

class child_class_name extends parent_class_name

Note - Dart не поддерживает множественное наследование.

Пример: наследование класса

В следующем примере мы объявляем класс Shape. Класс расширяется за счетCircleкласс. Поскольку между классами существует отношение наследования, дочерний класс, т. Е. КлассCar получает неявный доступ к члену данных своего родительского класса.

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

Должно получиться следующее output -

calling calc area defined in the Shape class

Типы наследования

Наследование может быть следующих трех типов -

  • Single - Каждый класс может происходить максимум от одного родительского класса.

  • Multiple- Класс может наследовать от нескольких классов. Dart не поддерживает множественное наследование.

  • Multi-level - Класс может наследовать от другого дочернего класса.

пример

В следующем примере показано, как работает многоуровневое наследование.

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

Класс Leafнаследует атрибуты от корневых и дочерних классов на основании многоуровневого наследования. этоoutput выглядит следующим образом -

hello

Dart - наследование классов и переопределение методов

Переопределение метода - это механизм, с помощью которого дочерний класс переопределяет метод в своем родительском классе. Следующий пример иллюстрирует то же самое -

пример

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

Должно получиться следующее output -

value of b 12

Количество и тип параметров функции должны совпадать при переопределении метода. В случае несовпадения количества параметров или их типа данных компилятор Dart выдает ошибку. Следующая иллюстрация объясняет то же самое -

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

Должно получиться следующее output -

value of b 12

Статическое ключевое слово

В static ключевое слово может быть применено к членам данных класса, т. е. fields и methods. Статическая переменная сохраняет свои значения до завершения выполнения программы. На статические члены ссылаются по имени класса.

пример

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 
}

Должно получиться следующее output -

The value of num is 12

Супер ключевое слово

В superключевое слово используется для ссылки на непосредственного родителя класса. Ключевое слово может использоваться для обозначения версии суперклассаvariable, property, или же method. Следующий пример иллюстрирует то же самое -

пример

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

Должно получиться следующее output -

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

Объектно-ориентированное программирование определяет объект как «любую сущность, имеющую определенную границу». Объект имеет следующее -

  • State- Описывает объект. Поля класса представляют состояние объекта.

  • Behavior - Описывает, на что способен объект.

  • Identity- Уникальное значение, которое отличает объект от множества других похожих объектов. Два или более объекта могут иметь общее состояние и поведение, но не идентичность.

Оператор периода (.) используется вместе с объектом для доступа к элементам данных класса.

пример

Дарт представляет данные в виде объектов. Каждый класс в Dart расширяет класс Object. Ниже приведен простой пример создания и использования объекта.

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

Должно получиться следующее output -

This is a test method 
This is a test method1

Оператор каскада (..)

В приведенном выше примере вызываются методы класса. Однако каждый раз при вызове функции ссылка на объект обязательна. Вcascade operator может использоваться как сокращение в случаях, когда есть последовательность вызовов.

Оператор каскада (..) может использоваться для выполнения последовательности вызовов через объект. Приведенный выше пример можно переписать следующим образом.

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

Должно получиться следующее output -

This is a test method 
This is a test method1

Метод toString ()

Эта функция возвращает строковое представление объекта. Взгляните на следующий пример, чтобы понять, как использоватьtoString метод.

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

Должно получиться следующее output -

12

Dart, в отличие от других языков программирования, не поддерживает массивы. Коллекции Dart могут использоваться для репликации структур данных, таких как массив. Библиотека dart: core и другие классы включают поддержку Collection в сценариях Dart.

Коллекции дротиков можно в основном классифицировать как -

Старший Нет Коллекция дротиков и описание
1 Список

Список - это просто упорядоченная группа объектов. Вdart:core Библиотека предоставляет класс List, который позволяет создавать списки и управлять ими.

  • Fixed Length List - Длина списка не может измениться во время выполнения.

  • Growable List - Длина списка может меняться во время выполнения.

2 Набор

Set представляет собой набор объектов, в котором каждый объект может встречаться только один раз. Библиотека dart: core предоставляет класс Set для реализации того же.

3 Карты

Объект Map - это простая пара ключ / значение. Ключи и значения на карте могут быть любого типа. Карта - это динамическая коллекция. Другими словами, Карты могут увеличиваться и уменьшаться во время выполнения. Класс Map в библиотеке dart: core обеспечивает то же самое.

4 Очередь

Очередь - это коллекция, которой можно управлять с обеих сторон. Очереди полезны, когда вы хотите создать коллекцию «первым пришел - первым вышел». Проще говоря, очередь вставляет данные с одного конца и удаляет с другого. Значения удаляются / читаются в порядке их вставки.

Итерация коллекций

Класс Iterator из dart:coreбиблиотека позволяет легко обходить коллекцию. В каждой коллекции естьiteratorсвойство. Это свойство возвращает итератор, указывающий на объекты в коллекции.

пример

В следующем примере показано прохождение коллекции с использованием объекта-итератора.

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

В moveNext()функция возвращает логическое значение, указывающее, есть ли следующая запись. Вcurrent Свойство объекта итератора возвращает значение объекта, на который в настоящий момент указывает итератор.

Эта программа должна выдать следующие output -

100 
200 
300

Дротик - это optionally typed language. По умолчанию коллекции в Dart неоднородны. Другими словами, одна коллекция Dart может содержать значения различных типов. Однако можно сделать коллекцию Dart для хранения однородных значений. Для достижения того же можно использовать концепцию Generics.

Использование Generics накладывает ограничение на тип данных значений, которые могут содержаться в коллекции. Такие коллекции называются типобезопасными коллекциями. Типовая безопасность - это функция программирования, которая гарантирует, что блок памяти может содержать данные только определенного типа.

Все коллекции Dart поддерживают реализацию безопасности типов через дженерики. Пара угловых скобок, содержащих тип данных, используется для объявления типобезопасной коллекции. Синтаксис объявления типобезопасной коллекции приведен ниже.

Синтаксис

Collection_name <data_type> identifier= new Collection_name<data_type>

Типобезопасные реализации List, Map, Set и Queue приведены ниже. Эта функция также поддерживается всеми реализациями вышеупомянутых типов коллекций.

Пример: общий список

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

Должно получиться следующее output -

WARNING 
ERROR 
INFO

Попытка вставить значение, отличное от указанного типа, приведет к ошибке компиляции. Следующий пример иллюстрирует это.

пример

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

Должно получиться следующее output -

1                                                                                     
ERROR                                                                             
INFO

Пример: общий набор

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

Должно получиться следующее output -

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

Пример: общая очередь

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

Должно получиться следующее output -

Default implementation ListQueue<int> 
20 
30 
40

Общая карта

Объявление типобезопасной карты определяет типы данных:

  • Ключ
  • Значение

Синтаксис

Map <Key_type, value_type>

пример

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

Должно получиться следующее output -

Map :{name: Tom, Id: E1001}

Пакет - это механизм для инкапсуляции группы программных единиц. Иногда приложениям может потребоваться интеграция некоторых сторонних библиотек или плагинов. Каждый язык имеет механизм для управления внешними пакетами, такими как Maven или Gradle для Java, Nuget для .NET, npm для Node.js и т. Д. Менеджер пакетов для Dart - этоpub.

Pub помогает устанавливать пакеты в репозиторий. Репозиторий размещенных пакетов можно найти по адресуhttps://pub.dartlang.org/.

В package metadata определено в файле, pubsec.yaml. YAML - это аббревиатура отYet Another Markup Language. Вpub инструмент можно использовать для загрузки всех различных библиотек, которые требуются приложению.

В каждом приложении Dart есть pubspec.yaml файл, который содержит зависимости приложения от других библиотек и метаданные приложений, такие как имя приложения, автор, версия и описание.

Содержимое pubspec.yaml файл должен выглядеть примерно так -

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

Важный pub commands следующие -

Старший Нет Команда и описание
1

‘pub get’

Помогает получить все пакеты, от которых зависит ваше приложение.

2

‘pub upgrade’

Обновляет все ваши зависимости до более новой версии.

3

‘pub build’

Он используется для создания вашего веб-приложения, и он создаст папку сборки со всеми связанными скриптами в ней.

4

‘pub help’

Это поможет вам справиться со всеми различными командами pub.

Если вы используете IDE, такую ​​как WebStorm, вы можете щелкнуть правой кнопкой мыши pubspec.yaml, чтобы получить все команды напрямую -

Установка пакета

Рассмотрим пример, в котором приложению необходимо проанализировать xml. Dart XML - это легкая библиотека с открытым исходным кодом, стабильная для синтаксического анализа, просмотра, запроса и создания XML-документов.

Шаги для достижения указанной задачи следующие:

Step 1 - Добавьте в файл 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:

Щелкните правой кнопкой мыши pubsec.yamlи получить зависимости. Это приведет к внутреннему срабатываниюpub get command как показано ниже.

Загруженные пакеты и зависимые от них пакеты можно проверить в папке пакетов.

Поскольку установка завершена, нам нужно указать dart xmlв проекте. Синтаксис следующий -

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

Читать строку XML

Чтобы прочитать строку XML и проверить ввод, Dart XML использует parse()метод. Синтаксис следующий -

xml.parse(String input):

Пример: анализ вводимой строки XML

В следующем примере показано, как анализировать ввод строки 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()); 
}

Должно получиться следующее 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>

Исключение (или исключительное событие) - это проблема, возникающая во время выполнения программы. Когда возникает исключение, нормальный поток программы прерывается, и программа / приложение завершается ненормально.

Встроенные исключения Dart включают:

Старший Нет Исключения и описание
1

DeferredLoadException

Вызывается, когда не загружается отложенная библиотека.

2

FormatException

Исключение возникает, когда строка или некоторые другие данные не имеют ожидаемого формата и не могут быть проанализированы или обработаны.

3

IntegerDivisionByZeroException

Выбрасывается, когда число делится на ноль.

4

IOException

Базовый класс для всех исключений, связанных с Inupt-Output.

5

IsolateSpawnException

Выбрасывается, когда невозможно создать изолятор.

6

Timeout

Выбрасывается, когда запланированный тайм-аут происходит при ожидании результата асинхронности.

Каждое исключение в Dart - это подтип предопределенного класса Exception. Чтобы предотвратить внезапное завершение работы приложения, необходимо обрабатывать исключения.

Блоки try / on / catch

В tryblock встраивает код, который может привести к исключению. Блок on используется, когда необходимо указать тип исключения. Вcatch блок используется, когда обработчику нужен объект исключения.

В try за блоком должен следовать ровно один on / catch блок или один finallyблок (или один из обоих). Когда в блоке try возникает исключение, управление передается вcatch.

В syntax для обработки исключения, как указано ниже -

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

Ниже приведены некоторые моменты, которые следует запомнить:

  • Фрагмент кода может иметь более одного блока on / catch для обработки нескольких исключений.

  • Блок включения и блок catch взаимно включаются, т.е. блок try может быть связан как с блоком включения, так и блоком catch.

Следующий код иллюстрирует обработку исключений в Dart -

Пример: использование блока ON

Следующая программа делит два числа, представленных переменными x и yсоответственно. Код вызывает исключение, поскольку пытается делить на ноль. Вon block содержит код для обработки этого исключения.

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

Должно получиться следующее output -

Cannot divide by zero

Пример: использование блока catch

В следующем примере мы использовали тот же код, что и выше. Единственная разница в том, чтоcatch block(вместо блока ON) здесь содержится код для обработки исключения. Параметрcatch содержит объект исключения, созданный во время выполнения.

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

Должно получиться следующее output -

IntegerDivisionByZeroException

Пример: on… catch

В следующем примере показано, как использовать on...catch блок.

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

Должно получиться следующее output -

IntegerDivisionByZeroException

Последний блок

В finallyblock включает код, который должен выполняться независимо от возникновения исключения. Необязательныйfinally блок выполняется безоговорочно после try/on/catch.

Синтаксис для использования finally блок выглядит следующим образом -

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 
}

Следующий пример иллюстрирует использование finally блок.

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

Должно получиться следующее output -

Cannot divide by zero 
Finally block executed

Выброс исключения

В throwключевое слово используется для явного вызова исключения. Возникшее исключение должно быть обработано, чтобы предотвратить внезапный выход из программы.

В syntax для явного создания исключения -

throw new Exception_name()

пример

В следующем примере показано, как использовать throw ключевое слово для исключения исключения -

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

Должно получиться следующее output -

Age cannot be negative

Пользовательские исключения

Как указано выше, каждый тип исключения в Dart является подтипом встроенного класса Exception. Dart позволяет создавать собственные исключения, расширяя существующие. Синтаксис для определения настраиваемого исключения приведен ниже -

Синтаксис: определение исключения

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

Пользовательские исключения следует вызывать явно, и то же самое следует обрабатывать в коде.

пример

В следующем примере показано, как определить и обработать настраиваемое исключение.

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

В приведенном выше коде мы определяем настраиваемое исключение, AmtException. Код вызывает исключение, если переданная сумма не находится в пределах исключенного диапазона. Вmain функция включает вызов функции в try...catch блок.

Код должен выдать следующее output -

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

Время от времени разработчики допускают ошибки при кодировании. Ошибка в программе называется ошибкой. Процесс поиска и исправления ошибок называется отладкой и является нормальной частью процесса разработки. В этом разделе рассматриваются инструменты и методы, которые могут помочь вам в решении задач отладки.

Редактор WebStorm включает точки останова и пошаговую отладку. Программа остановится в точке, где установлена ​​точка останова. Эта функциональность похожа на то, что вы можете ожидать от разработки приложений Java или C #. Вы можете просматривать переменные, просматривать стек, переходить и переходить к вызовам методов и функций - и все это из редактора WebStorm.

Добавление точки останова

Рассмотрим следующий фрагмент кода. (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); 
}

Чтобы add a breakpoint, щелкните на левом поле, чтобы. На приведенном ниже рисунке строка 7 имеет точку останова.

Run the program in debug mode. В проводнике проекта щелкните правой кнопкой мыши программу dart в нашем случае TestString.dart.

После того, как программа запустится в режиме отладки, вы увидите окно отладчика, как показано на следующем снимке экрана. На вкладке переменных отображаются значения переменных в текущем контексте. Вы можете добавить наблюдателей для определенных переменных и отслеживать изменения этих значений с помощью окна часов.

Step Into(F7) значок стрелки в меню отладки помогает выполнять код по одной инструкции за раз. Если основные методы вызывают подпрограмму, это также войдет в код подпрограммы.

Step over (F8): похоже на Step Into. Разница в использовании возникает, когда текущий оператор содержит вызов подпрограммы. Если основной метод вызывает подпрограмму, переход не будет углубляться в подпрограмму. он пропустит подпрограмму.

Step Out(Shift + F8): выполняет оставшиеся строки функции, в которой находится текущая точка выполнения. Следующий отображаемый оператор - это оператор, следующий за вызовом подпрограммы.

После запуска в режиме отладки программа выдает следующее output -

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

А typedef, или псевдоним типа функции, помогает определять указатели на исполняемый код в памяти. Проще говоря,typedef может использоваться как указатель, ссылающийся на функцию.

Ниже приведены шаги по реализации typedefs в программе Dart.

Step 1: Defining a typedef

А typedefможет использоваться для указания сигнатуры функции, которой должны соответствовать определенные функции. Сигнатура функции определяется параметрами функции (включая их типы). Тип возврата не является частью сигнатуры функции. Его синтаксис следующий.

typedef function_name(parameters)

Step 2: Assigning a Function to a typedef Variable

Переменная typedef может указывать на любую функцию, имеющую ту же сигнатуру, что и typedef. Вы можете использовать следующую сигнатуру, чтобы назначить функцию объектуtypedef переменная.

type_def  var_name = function_name

Step 3: Invoking a Function

В typedefпеременная может использоваться для вызова функций. Вот как вы можете вызвать функцию -

var_name(parameters)

пример

Давайте теперь рассмотрим пример, чтобы понять больше typedef в Дарт.

Сначала определим typedef. Здесь мы определяем сигнатуру функции. Функция примет два входных параметра типаinteger. Тип возвращаемого значения не является частью сигнатуры функции.

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

Далее давайте определим функции. Определите некоторые функции с той же сигнатурой, что и уManyOperation 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}"); 
}

Наконец, мы вызовем функцию через typedef. Объявите переменную типа ManyOperations. Назначьте имя функции объявленной переменной.

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

В operпеременная может указывать на любой метод, который принимает два целочисленных параметра. ВAddссылка на функцию присваивается переменной. Typedefs может переключать ссылки на функции во время выполнения

Давайте теперь соберем все части вместе и посмотрим полную программу.

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

Программа должна выдать следующие output -

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

Note - Приведенный выше код приведет к ошибке, если typedef переменная пытается указать на функцию с другой сигнатурой функции.

пример

Typedefsтакже может передаваться в качестве параметра функции. Рассмотрим следующий пример -

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

Это приведет к следующему output -

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

Библиотека на языке программирования представляет собой набор процедур (набор инструкций по программированию). В Dart есть набор встроенных библиотек, которые полезны для хранения часто используемых процедур. Библиотека Dart состоит из набора классов, констант, функций, определений типов, свойств и исключений.

Импорт библиотеки

Импорт делает компоненты библиотеки доступными для вызывающего кода. Ключевое слово import используется для достижения того же. Файл dart может иметь несколько операторов импорта.

В URI встроенной библиотеки Dart для ссылки на библиотеку используется схема dart :. Другие библиотеки могут использовать путь к файловой системе или схему package: для указания своего URI. Библиотеки, предоставляемые диспетчером пакетов, такие как инструмент pub, используют схему package : .

Синтаксис для импорта библиотеки в Dart приведен ниже -

import 'URI'

Рассмотрим следующий фрагмент кода -

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

Если вы хотите использовать только часть библиотеки, вы можете выборочно импортировать библиотеку. Синтаксис для этого же приведен ниже -

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

Некоторые часто используемые библиотеки приведены ниже -

Старший Нет Библиотека и описание
1

dart:io

Поддержка файлов, сокетов, HTTP и других операций ввода-вывода для серверных приложений. Эта библиотека не работает в браузерных приложениях. Эта библиотека импортируется по умолчанию.

2

dart:core

Встроенные типы, коллекции и другие основные функции для каждой программы Dart. Эта библиотека импортируется автоматически.

3

dart: math

Математические константы и функции, а также генератор случайных чисел.

4

dart: convert

Кодеры и декодеры для преобразования между различными представлениями данных, включая JSON и UTF-8.

5

dart: typed_data

Списки, которые эффективно обрабатывают данные фиксированного размера (например, 8-байтовые целые числа без знака).

Пример: импорт и использование библиотеки

В следующем примере импортируется встроенная библиотека dart: math. Фрагмент вызываетsqrt() функция от mathбиблиотека. Эта функция возвращает квадратный корень из переданного ей числа.

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

Output

Square root of 36 is: 6.0

Инкапсуляция в библиотеках

Сценарии Dart могут добавлять к идентификаторам знак подчеркивания (_), чтобы отмечать компоненты как частные. Проще говоря, библиотеки Dart могут ограничивать доступ к своему содержимому внешними скриптами. Это называетсяencapsulation. Синтаксис для этого же приведен ниже -

Синтаксис

_identifier

пример

Сначала определите библиотеку с частной функцией.

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

Далее импортируем библиотеку

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

Приведенный выше код приведет к ошибке.

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)

Создание пользовательских библиотек

Dart также позволяет использовать ваш собственный код в качестве библиотеки. Создание настраиваемой библиотеки включает следующие шаги:

Step 1: Declaring a Library

Чтобы явно объявить библиотеку, используйте library statement. Синтаксис объявления библиотеки приведен ниже -

library library_name  
// library contents go here

Step 2: Associating a Library

Вы можете связать библиотеку двумя способами:

  • В том же каталоге
import 'library_name'
  • Из другого каталога
import 'dir/library_name'

Пример: пользовательская библиотека

Сначала давайте определим настраиваемую библиотеку, 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); 
}

Далее мы импортируем библиотеку -

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

Программа должна выдать следующие output -

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

Префикс библиотеки

Если вы импортируете две библиотеки с конфликтующими идентификаторами, вы можете указать префикс для одной или обеих библиотек. Использовать'as'ключевое слово для указания префикса. Синтаксис для этого же приведен ниже -

Синтаксис

import 'library_uri' as prefix

пример

Сначала давайте определим библиотеку: loggerlib.dart.

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

Далее мы определим другую библиотеку: webloggerlib.dart.

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

Наконец, мы импортируем библиотеку с префиксом.

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

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

Это приведет к следующему output -

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

An asynchronous operation выполняется в потоке, отдельно от mainпоток приложения. Когда приложение вызывает метод для асинхронного выполнения операции, приложение может продолжать выполнение, пока асинхронный метод выполняет свою задачу.

пример

Давайте рассмотрим пример, чтобы понять эту концепцию. Здесь программа принимает пользовательский ввод с помощьюIO 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"); 
}

В readLineSync()это синхронный метод. Это означает, что выполнение всех инструкций, следующих заreadLineSync() вызов функции будет заблокирован до readLineSync() метод завершает выполнение.

В stdin.readLineSyncждет ввода. Он останавливается на своем пути и больше не выполняется, пока не получит ввод пользователя.

Приведенный выше пример приведет к следующему output -

Enter your name :     
Tom                   

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

В вычислениях мы говорим, что что-то synchronousкогда он ожидает события перед продолжением. Недостатком этого подхода является то, что если часть кода выполняется слишком долго, выполнение последующих блоков, хотя и не связанных, будет заблокировано. Рассмотрим веб-сервер, который должен отвечать на несколько запросов ресурса.

Модель синхронного выполнения будет блокировать любой запрос другого пользователя до тех пор, пока он не завершит обработку текущего запроса. В таком случае, как и в случае с веб-сервером, каждый запрос должен быть независимым от других. Это означает, что веб-сервер не должен ждать завершения выполнения текущего запроса, прежде чем он ответит на запрос от других пользователей.

Проще говоря, он должен принимать запросы от новых пользователей до того, как обязательно выполнит запросы предыдущих пользователей. Это называется асинхронным. Асинхронное программирование в основном означает отсутствие ожидающей или неблокирующей модели программирования. Вdart:async Пакет упрощает реализацию блоков асинхронного программирования в сценарии Dart.

пример

Следующий пример лучше иллюстрирует работу асинхронного блока.

Step 1 - Создать contact.txt файл, как указано ниже and сохранить его в папке данных текущего проекта.

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

Step 2 - Напишите программу, которая будет читать файл, не блокируя другие части приложения.

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 
}

В output этой программы будет следующим -

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

«Конец основного» выполняется первым, пока сценарий продолжает чтение файла. ВFuture класс, часть dart:async, используется для получения результата вычисления после завершения асинхронной задачи. ЭтотFuture value затем используется для каких-либо действий после завершения вычислений.

После завершения операции чтения управление выполнением передается в "then()". Это связано с тем, что операция чтения может занять больше времени, и поэтому он не хочет блокировать другую часть программы.

Дротик Будущее

Сообщество Dart определяет Futureкак «средство получить ценность когда-нибудь в будущем». Проще говоря,Future objectsпредставляют собой механизм для представления значений, возвращаемых выражением, выполнение которого завершится позже. Некоторые из встроенных классов Dart возвращаютFuture когда вызывается асинхронный метод.

Dart - это однопоточный язык программирования. Если какой-либо код блокирует поток выполнения (например, ожидая длительной операции или блокируя ввод-вывод), программа фактически зависает.

Асинхронные операции позволяют вашей программе работать без блокировки. Дарт используетFuture objects для представления асинхронных операций.

Concurrency- это выполнение нескольких последовательностей инструкций одновременно. Он предполагает одновременное выполнение нескольких задач.

Дарт использует Isolatesкак инструмент для параллельных работ. Вdart:isolate package - это решение Dart, позволяющее использовать однопоточный код Dart и позволяющее приложению более широко использовать доступное оборудование.

Isolates, как следует из названия, представляют собой изолированные единицы выполняемого кода. Единственный способ передавать данные между ними - это передавать сообщения, например, как вы передаете сообщения между клиентом и сервером. Anisolate помогает программе использовать преимущества многоядерных микропроцессоров из коробки.

пример

Давайте рассмотрим пример, чтобы лучше понять эту концепцию.

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

Здесь spawn метод Isolate класс облегчает выполнение функции, foo, параллельно с остальной частью нашего кода. Вspawn функция принимает два параметра -

  • функция, которую нужно создать, и
  • объект, который будет передан порожденной функции.

В случае, если нет объекта для передачи порожденной функции, ей можно передать значение NULL.

Две функции (foo and main)не обязательно запускаться каждый раз в одном и том же порядке. Нет никакой гарантии, когдаfoo будет выполняться и когда main()будет выполняться. Результат будет разным при каждом запуске.

Выход 1

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

Выход 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!!

Исходя из результатов, мы можем сделать вывод, что код Dart может порождать новый isolate от запуска кода, как код Java или C # может запустить новый поток.

Isolates отличаются от потоков тем, что isolateесть своя память. Невозможно разделить переменную междуisolates- единственный способ общаться между isolates через передачу сообщений.

Note - Приведенный выше вывод будет отличаться для разных конфигураций оборудования и операционной системы.

Изолировать от будущего

Асинхронное выполнение сложной вычислительной работы важно для обеспечения быстрой реакции приложений. Dart Future - это механизм для получения значения асинхронной задачи после ее завершения, а Dart Isolates представляют собой инструмент для абстрагирования параллелизма и его практической реализации на высоком уровне.

Модульное тестирование включает в себя тестирование каждой отдельной единицы приложения. Он помогает разработчику тестировать небольшие функции без запуска всего сложного приложения.

Дротик external library named "test" предоставляет стандартный способ написания и выполнения модульных тестов.

Модульное тестирование Dart включает в себя следующие шаги -

Step 1: Installing the "test" package

Для установки сторонних пакетов в текущем проекте вам потребуется pubspec.yamlфайл. Установитьtest packages, сначала сделайте следующую запись в pubspec.yaml файл -

dependencies: 
test:

Сделав запись, щелкните правой кнопкой мыши значок pubspec.yamlфайл и получить зависимости. Он установит"test"пакет. Ниже приведен скриншот того же вWebStorm Редактор.

Пакеты могут быть установлены из command lineтоже. Введите в терминал следующее -

pub get

Step 2: Importing the "test" package

import "package:test/test.dart";

Step 3 Writing Tests

Тесты задаются с помощью функции верхнего уровня test(), в то время как test assertions сделаны с использованием expect()функция. Для использования этих методов они должны быть установлены какpub зависимость.

Синтаксис

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

В group()Функция может использоваться для группировки тестов. Описание каждой группы добавляется в начало описания ее теста.

Синтаксис

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

Пример 1: сдача теста

В следующем примере определяется метод Add(). Этот метод принимает два целых значения и возвращает целое число, представляющееsum. Чтобы проверить этоadd() метод -

Step 1 - Импортировать test пакет, как указано ниже.

Step 2 - Определите тест, используя test()функция. Здесьtest() функция использует expect() функция для принудительного выполнения утверждения.

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

Должно получиться следующее output -

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

Пример 2: Неудачный тест

В subtract()описанный ниже метод имеет логическую ошибку. Следующееtest подтверждает то же самое.

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 - Тестовый пример для функции add() проходит, но тест на subtract() не работает, как показано ниже.

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)

Группировка тестовых случаев

Вы можете сгруппировать test casesтак что он добавляет больше смысла в ваш тестовый код. Если у вас многоtest cases это помогает писать более чистый код.

В данном коде мы пишем тестовый пример для split() функция и trimфункция. Следовательно, мы логически группируем эти тестовые примеры и называем ихString.

пример

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 - В выходных данных будет добавлено имя группы для каждого тестового примера, как указано ниже -

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

Каждая веб-страница находится внутри окна браузера, которое можно рассматривать как объект.

А Document objectпредставляет HTML-документ, отображаемый в этом окне. Объект Document имеет различные свойства, которые относятся к другим объектам, которые позволяют получить доступ к содержимому документа и изменить его.

Способ доступа к содержимому документа и его изменения называется Document Object Model, или же DOM. Объекты организованы в иерархию. Эта иерархическая структура применяется к организации объектов в веб-документе.

  • Window- Вершина иерархии. Это крайний элемент иерархии объектов.

  • Document- Каждый HTML-документ, загружаемый в окно, становится объектом документа. Документ содержит содержимое страницы.

  • Elements- отображать контент на веб-странице. Примеры включают текстовые поля, заголовок страницы и т. Д.

  • Nodes - часто являются элементами, но они также могут быть атрибутами, текстом, комментариями и другими типами DOM.

Вот простая иерархия нескольких важных объектов DOM:

Дарт предоставляет dart:htmlбиблиотека для управления объектами и элементами в DOM. Консольные приложения не могут использоватьdart:htmlбиблиотека. Чтобы использовать библиотеку HTML в веб-приложениях, импортируйтеdart:html -

import 'dart:html';

Двигаясь дальше, мы обсудим некоторые DOM Operations в следующем разделе.

Поиск элементов DOM

В dart:html библиотека предоставляет querySelector функция для поиска элементов в DOM.

Element querySelector(String selectors);

В querySelector() функция возвращает первый элемент, который соответствует указанной группе селекторов. "selectors должен быть строкой с использованием синтаксиса селектора CSS, как указано ниже

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

Пример: манипулирование DOM

Следуйте инструкциям, приведенным ниже, в IDE Webstorm -

Step 1 - Файл NewProject → В этом месте укажите имя проекта как DemoWebApp.

Step 1 - В разделе «Создать образец контента» выберите SimpleWebApplication.

Будет создан образец проекта, DemoWebApp. Существуетpubspec.yaml файл, содержащий зависимости, которые необходимо загрузить.

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

Если вы подключены к Интернету, они будут загружены автоматически, иначе вы можете щелкнуть правой кнопкой мыши pubspec.yaml и получить зависимости.

В веб-папке вы найдете три файла: Index.html, main.dart, и 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!!!.'; 
}

Запустить index.htmlфайл; вы увидите следующий результат на вашем экране.

Обработка событий

В dart:html библиотека предоставляет onClickсобытие для элементов DOM. Синтаксис показывает, как элемент может обрабатывать поток событий щелчка.

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

В querySelector() функция возвращает элемент из заданной DOM и onClick.listen() займет eventHandlerметод, который будет вызываться при возникновении события щелчка. СинтаксисeventHandler приведено ниже -

void eventHanlderFunction (MouseEvent event){ }

Давайте теперь рассмотрим пример, чтобы понять концепцию обработки событий в 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; 
}

Вывод