Dart


Начало работы

hello.dart

``dart // функция верхнего уровня, с которой начинается выполнение приложения void main(){ print(“Hello World!”); // Печать в консоль }

Каждое приложение имеет функцию main()


### Переменные

``dart
int x = 2; // явно типизированная переменная
var p = 5; // type inferred - Generic var with type inference

dynamic z = 8; // переменная может принимать любой тип
z = "cool"; // cool

// если вы никогда не собираетесь изменять переменную, используйте final или const. Примерно так:

final email = "[email protected]"; // то же, что и var, но не может быть переназначен
final String email = "[email protected]"; // Вы не можете изменить значение

const qty = 5; // Константа времени компиляции

Дататипы

``dart

int age = 20; // целые числа, диапазон от -2^63 до 2^63 - 1 double height = 1.85; // числа с плавающей точкой

// Можно также объявить переменную как num num x = 1; // x может иметь значения как int, так и double num += 2.5; print(num); //Печать: 3.5

String name = “Nicola”;

bool isFavourite = true; bool isLoaded = false;



### Интерполяция строк

``dart''
// можно использовать одинарные или двойные qoutes для типа String
var FirstName = 'Nicola';
var LastName = "Tesla";

//можно встраивать переменные в строку с помощью $
String fullName = "$firstName $lastName";

// конкатенировать с +
var name = "Albert " + "Einstein";

String upperCase = '${firstName.toUpperCase()}';
print(upperCase); //Печать: НИКОЛА

Комментарии

``dart // Это обычный однострочный комментарий.

/// Это комментарий документации, используемый для документирования библиотек, /// классов и их членов. Такие инструменты, как IDE и dartdoc, специально обрабатывают /// doc-комментарии. /// doc-комментариям особым образом.

/* Также поддерживаются такие комментарии, как. */


### Импорт
``dart
// Импорт основных библиотек
import 'dart:math';

// Импорт библиотек из внешних пакетов
import 'package:test/test.dart';

// Импорт файлов
import 'path/to/my_other_file.dart';

Операторы

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

``dart print(2 + 3); //Печать: 5 print(2 - 3); //Печать: -1 print(2 * 3); //Print: 6 print(5 / 2); //Печать: 2,5 - Результат равен двойке print(5 ~/ 2); //Печать: 2 - Результат равен int print(5 % 2); //Печать: 1 - Остаток

int a = 1, b; // Инкремент b = ++a; // preIncrement - увеличение a до того, как b получит свое значение. b = a++; // postIncrement - увеличение a ПОСЛЕ того, как b получит свое значение.

//Decrement b = –a; // predecrement - Уменьшение a до того, как b получит свое значение. b = a–; // postdecrement - Уменьшение a ПОСЛЕ того, как b получит свое значение.



### Операторы равенства и реляционные операторы
``dart
print(2 == 2); //Печать: true - Равно
print(2 != 3); //Print: true - Не равно
print(3 > 2); //Print: true - Больше, чем
print(2 < 3); //Print: true - Меньше, чем
print(3 >= 3); //Print: true - Больше или равно
print(2 <= 3); //Print: true - Меньше или равно

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

``dart’' // !expr инвертирует выражение (меняет false на true, и наоборот) // || логическое ИЛИ // && логическое И bool isOutOfStock = false; int quantity = 3; if (!isOutOfStock && (quantity == 2 || quantity == 3)) { // …Заказать товар… }





Потоки управления : Условные знаки {.cols-2}
------------


### if и else if
``дарт
if(age < 18){
    print("Подросток");
} else if( age > 18 && age <60){
    print("Взрослый");
} else {
    print("Старый");
}

switch case

``dart enum Pet {dog, cat} Pet myPet = Pet.dog; switch(myPet){ case Pet.dog: print(‘Мой питомец - собака’); break; case Pet.cat: print(‘Мой питомец - кошка’); break; default: print(‘У меня нет домашнего животного’); } // Prints: Мое домашнее животное - собака.





Потоки управления : Циклы
------------


### цикл while
``дарт
while (!dreamsAchieved) {
  workHard();
}

цикл while проверяет условие перед итерацией цикла

цикл do-while

``dart do { workHard(); } while (!dreamsAchieved);

цикл do-while проверяет условие после выполнения операторов внутри цикла

### цикл for
``dart
for(int i=0; i< 10; i++){
    print(i);
}

var numbers = [1,2,3];
// цикл for-in для списков
for(var number in numbers){
    print(number);
}

Коллекции

Списки

``dart’’ // упорядоченная группа объектов var list = [1, 2, 3];

print(list.length); //Печать: 3 print(list[1]); //Печать: 2

// другие способы объявления и инициализации списка

List cities = [“New York”, “Mumbai”, “Tokyo”];

// Для создания списка, являющегося константой времени компиляции const constantCities = const [“New York”, “Mumbai”, “Tokyo”];



### Наборы

``dart
// Набор в Dart - это неупорядоченная коллекция уникальных элементов.
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

// для создания пустого множества
var names = <String>{};
Set<String> names = {}; // Это тоже работает.
//var names = {}; // Создается карта, а не набор.

Карты

``Дарт. // карта - это объект, связывающий ключи и значения var person = Map<String, String>(); // Чтобы инициализировать карту, сделайте следующее: person[‘firstName’] = ‘Nicola’; person[’lastName’] = ‘Tesla’;

print(person); //Печать: {firstName: Nicola, LastName: Tesla} print(person[’lastName’]); //Print: Tesla

var nobleGases = { // Ключ: Значение 2: ‘гелий’, 10: ‘неон’, 18: ‘аргон’, };




Функции {.cols-2}
------------

### Функции
``dart
// функции в dart являются объектами и имеют тип
int add(int a, int b){
    return a+b;
}

// функции можно присваивать переменным
int sum = add(2,3); // возвращается: 5

// могут передаваться в качестве аргументов другим функциям
int totalSum = add(2, add(2,3)); // возвращается : 7

Синтаксис стрелки (=>)

``dart // Функции, содержащие только одно выражение, можно использовать сокращенный синтаксис bool isFav(Product product) => favProductsList.contains(product);


### Анонимные (лямбда) функции
``dart
// маленькие однострочные функции, не имеющие имени
int add(a,b) => a+b;

// лямбда-функции в основном передаются в качестве параметра другим функциям
const list = ['яблоки', 'бананы', 'апельсины'];
list.forEach(
(item) => print('${list.indexOf(item)}: $item'));
//Печати: 0: яблоки 1: бананы 2: апельсины

Классы и объекты

Класс

``dart class Cat { Строковое имя;

// метод
void voice(){
    print("Meow");
}

}



### Объект
``dart
// экземпляр класса
// ниже myCat является объектом класса Cat

void main(){
    Cat myCat = Cat();
    myCat.name = "Kitty";
    myCat.voice(); // Печатает: Meow
}

Конструкторы

``dart class Cat { String name; Cat(this.name); } void main(){ Cat myCat = Cat(“Kitty”); print(myCat.name); // Печатает: Kitty }



### Абстрактные классы
``dart
// Абстрактный класс - класс, который не может быть инстанцирован
// Этот класс объявлен абстрактным и поэтому не может быть инстанцирован.
abstract class AbstractContainer {
  // Определяем конструкторы, поля, методы...

  void updateChildren(); // Абстрактный метод.
}

Getters Setters

``dart // предоставляем доступ к свойствам объекта на чтение и запись class Cat { String name;

// геттер
String get catName {
    return name;
}

// setter
void set catName(String name){
    this.name = name;
}

}



Неявные интерфейсы {.cols-2}
------------

### Базовый интерфейс
``dart''
// Человек. Неявный интерфейс содержит greet().
class Person {
  // Находится в интерфейсе, но виден только в этой библиотеке.
  final String _name;

  // Не в интерфейсе, так как это конструктор.
  Person(this._name);

  // В интерфейсе.
  String greet(String who) => 'Привет, $who. Я - $_name.';
}

// Реализация интерфейса Person.
class Impostor implements Person {
  String get _name => '';

  String greet(String who) => 'Привет $who. Ты знаешь, кто я?';
}

String greetBob(Person person) => person.greet('Bob');

void main() {
  print(greetBob(Person('Kathy'))); // Здравствуйте, Боб. Я Кэти.
  print(greetBob(Impostor())); // Привет, Боб. Знаешь ли ты, кто я?
}

Расширение класса

``dart класс Phone {

void use(){
    _call();
    _sendMessage();
}

} // Использование extends для создания подкласса class SmartPhone extends Phone { void use(){ // Используйте super для обращения к суперклассу super.use(); _takePhotos(); _playGames(); } }


Исключения
------------

### Бросок
``dart''
// бросает или поднимает исключение
throw IntegerDivisionByZeroException();

// Вы также можете бросать произвольные объекты
throw "Товара нет в наличии!";

Catch

``dart

try { int c = 3/0; print(c); } on IntegerDivisionByZeroException { // Конкретное исключение print(‘Невозможно разделить целое число на 0.’) } on Exception catch (e) { // Любое другое исключение print(‘Неизвестное исключение: $e’) } catch (e) { // Тип не указан, обрабатывает все print(‘Что-то действительно неизвестное: $e’); }

### Наконец-то
``Дарт
// Чтобы обеспечить выполнение некоторого кода независимо от того, будет ли выброшено исключение или нет
try {
  cookFood();
} catch (e) {
  print('Error: $e'); // Сначала обрабатываем исключение.
} finally {
  cleanKitchen(); // Затем выполнить уборку.
}

Фьючерсы

Async Await

``дарт’’ // функции, которые являются асинхронными: они возвращаются после выполнения возможно длительной операции // Ключевые слова async и await поддерживают асинхронное программирование

Future login() { String userName=“Temidjoy”; return Future.delayed( Duration(seconds: 4), () => userName); }

// Асинхронный main() async { print(‘Authenticating please wait…’); print(await userName()); }




Разное {.cols-2}
------------

### Нуль и нулевое знание

``dart
int x; // Начальное значение любого объекта равно null

// Оператор null aware

x ??=6; // Оператор присваивания ??=, который присваивает значение переменной только в том случае, если эта переменная в данный момент равна null
print(x); //Печать: 6

x ??=3;
print(x); //Печать: 6 - результат по-прежнему равен 6

print(null ?? 10); // Печать: 10. Выведите значение слева, если оно не равно null, иначе верните значение справа

Тернарный оператор

``dart // condition ? exprIfTrue : exprIfFalse bool isAvailable;

isAvailable ? orderproduct() : addToFavourite();



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

```dart
// для вставки нескольких значений в коллекцию.
var list = [1, 2, 3];
var list2 = [0, ...list];

print(list2.length); //Печать: 4

Каскадная нотация (…)

``dart’’ // позволяет выполнять последовательность операций над одним и тем же объектом

// вместо того, чтобы делать следующее var user = User(); user.name = “Nicola”; user.email = “[email protected]”; user.age = 24;

// можно сделать так var user = User() ..name = “Nicola” ..email = “[email protected]” ..age = 24;


### Условный доступ к свойствам
``dart
userObject?.userName

//Приведенный фрагмент кода эквивалентен следующему:
(userObject != null) ? userObject.userName : null

//Вы можете объединить несколько вариантов использования ?. в одно выражение
userObject?.userName?.toString()

// Предшествующий код возвращает null и никогда не вызывает toString(), если userObject или userObject.userName равны null