1/Путь к первому мобильному приложению. Часть 1.1 - Изучаем язык Dart: Основы и типы данных

Основы

Dart - это объектно-ориентированный язык программирования, созданный компанией Google.

Функция main ( ) { ... } является входной точкой и именно с неё начинает своё выполнение все программы на Dart, по-умолчанию возвращает тип void и может принимать список строк, т.е. List<String> arguments.

К примеру:

void main ( ) {
...
}

Комментирование кода может быть в одну строку, так и многострочным.

// Комментарий
/*
Комментарий
*/

В качестве демонстрации работы кода рекомендую использовать сайт https://dartpad.dev/

Типы данных

Числовые: int (от -263 до 263 - 1) и double (в соответствии со стандартом IEEE 754)

// Числовые
int numberInteger = 5;
print ( numberInteger.runtimeType ); // int
double numberDouble = 12.2;
print ( numberDouble.runtimeType ); // double
var numberVarInteger = 7;
print ( numberVarInteger.runtimeType ); // int
var numberVarDouble = 14.4;
print ( numberVarDouble.runtimeType ); // double
num numberNumInteger = 9;
print ( numberNumInteger.runtimeType ); // int
num numberNumDouble = 16.6;
print ( numberNumDouble.runtimeType ); // double

Строковые: String (само значение можно указывать как в двойных так и в одинарных кавычках) и Runes (кодировка UTF-32)

// Строковые
String strLang = "Язык Dart";
print ( strLang.runtimeType ); // String
var strLesson = 'Урок';
print ( strLesson.runtimeType ); // String

int numLesson = 1;
print ( '$strLang - ${strLesson.toUpperCase()} $numLesson' ); // Язык Dart - УРОК 1

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

Логические: bool

// Boolean
bool boolValue = 1 == int.parse('1');
print ( boolValue.runtimeType ); // bool
print ( boolValue ); // true
var boolVar = '1' == int.parse('1');
print ( boolVar.runtimeType ); // bool
print ( boolVar ); // false

print ( 2.2 == double.parse('2.2') ); // true
print ( "2.2" == double.parse('2.2') ); // false
print ( 2 == double.parse('2.0') ); // true
print ( 2.0 == double.parse('2.0') ); // true
print ( 1 == '1' ); // false
print ( 1.toString() == '1' ); // true
print ( 3.1416.toString() == '3.14' ); // false
print ( 3.1416.toStringAsFixed(2) == '3.14' ); // true
print ( 3.1416.toStringAsFixed(0) == '3' ); // true

Из примеров выше видно что в Dart есть разница представлено ли значение 1 (к примеру) в виде int, либо String ('1').

Массивы (Коллекции): List [ value ], Set { uniqValue }, Map { uniqKey : value }

// Привычные массивы в Dart это коллекции и делятся они на три группы
  
// Списки (List) - коллекция элементов с доступом по ключу (порядку)
var listInteger = [1,2,3];
print ( listInteger.runtimeType ); // JSArray<int>
var listNum = [1,2.2,3];
print ( listNum.runtimeType ); // JSArray<num>
var listDouble = [1.1,2.2,3.3];
print ( listDouble.runtimeType ); // JSArray<double>
var listObject = [1,'2',3];
print ( listObject.runtimeType ); // JSArray<Object>
var listString = ['1','2','3'];
print ( listString.runtimeType ); // JSArray<String>
var listAdd = <Object>[];
listAdd.add('newElement');
print ( listAdd.runtimeType ); // JSArray<Object>

// Множества (Set) - неупорядоченная коллекция уникальных элементов
var setInteger = {1,2,3};
print ( setInteger.runtimeType ); // _LinkedHashSet<int>
var setString = {'word', 'hello', 'world', 'hi', 'dart'};
print ( setString.runtimeType ); // _LinkedHashSet<String>
var setAdd = <String>{};
setAdd.add('newElement');
print ( setAdd.runtimeType ); // _LinkedHashSet<Object>
  
// Словари (Map) - объект связывающий ключ и значение
var mapString = {
  'two': 'два',
  'four': 'четыре',
  'eight': 'восемь'
};
print ( mapString.runtimeType ); // JsLinkedHashMap<String, String>
var mapInteger = {
  2: 'two',
  4: 'four',
  8: 'eight',
};
print ( mapInteger.runtimeType ); // JsLinkedHashMap<int, String>
var mapAdd = Map();
mapAdd['two'] = 'два';
mapAdd['four'] = 'четыре';
mapAdd['eight'] = 'восемь';
print ( mapAdd.runtimeType ); // JsLinkedHashMap<dynamic, dynamic>

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

Из приведённого кода выше разберём с чем уже столкнулись:

value.runtimeType - получить тип данных
value.toUpperCase - перевести строку в верхний регистр
int.parse('2') - получить из строки число типа int
double.parse('2.1') - получить из строки чисто типа double
value.toString() - преобразовать в строку
value.toStringAsFixed(2) - преобразовать в строку с округление до 2 знаков после запятой

Для того чтобы задать переменную перед ней указываем ключевое слово var (тип определится автоматически из числа всех), num (тип определится автоматически из числа числовых), либо указываем конкретный тип данных.

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

Если переменная задана, но ей не присвоено значение - она равна null.