Библиотека dart:core — основная стандартная библиотека Dart, импортируется неявно и автоматически. Она предоставляет базовые фундаментальные возможности языка. Ниже рассмотрены её основные функции и примеры кода, сгруппированные по модулям.
Разработчику не нужно прописывать инструкцию импорта; эта библиотека загружается автоматически по умолчанию.
I. Вывод в консоль
Верхнеуровневая функция print(): автоматически вызывает метод toString() объекта для вывода текстовых данных.
void main() {
var tea = "milk tea";
print(tea);
print('I drink $tea.');
}Code language: Dart (dart)
II. Числовые типы: num / int / double
- Иерархия наследования:
intиdoubleнаследуются отnum - Преобразование строки в число:
parse(); int поддерживает параметр radix для указания системы счисления - Преобразование числа в строку:
toString(): базовое преобразованиеtoStringAsFixed(n): сохраняет n знаков после запятойtoStringAsPrecision(n): n значащих цифр
void main() {
// Преобразование строки в число
assert(int.parse('42') == 42);
assert(int.parse('42', radix:16) == 66);
assert(double.parse('0.5') == 0.5);
// Преобразование числа в строку
assert(123.456.toStringAsFixed(2) == '123.46');
assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}
III. Строки String & Регулярные выражения RegExp
- Объекты String неизменяемы (все методы изменения возвращают новые строки); хранят кодовые единицы UTF-16
- Распространённые методы: поиск, выделение подстроки, разделение, изменение регистра, удаление пробелов
void main() {
var str = 'Never odd or even';
// Проверки
assert(str.contains('odd'));
assert(str.startsWith('Never'));
assert(str.endsWith('even'));
assert(str.indexOf('odd') == 6);
// Подстрока и разделение
assert(str.substring(6,9) == 'odd');
var parts = 'a b c'.split(' ');
// Удаление пробелов и проверка на пустоту
assert(' abc '.trim() == 'abc');
assert(''.isEmpty);
assert(' '.isNotEmpty);
// Перевод в верхний регистр
assert('dart'.toUpperCase() == 'DART');
// Для конкатенации используйте StringBuffer (лучшая производительность)
var sb = StringBuffer();
sb.write('Hello ');
sb.writeAll(['A','B','C'], ',');
print(sb.toString());
}
Регулярные выражения RegExp
void main() {
var reg = RegExp(r'\d+'); // Ищет последовательности цифр
var text = 'llamas live 15 to 20 years';
assert(reg.hasMatch(text));
// Перебор всех глобальных совпадений
for(var m in reg.allMatches(text)){
print(m.group(0));
}
// Замена совпавших фрагментов
var res = text.replaceAll(reg, 'XX');
print(res);
}
Примечание: Кодовая единица не всегда соответствует видимому символу. Для сложных символов Unicode (комбинации эмодзи) используйте внешний пакет
characters.
IV. Коллекции (List / Set / Map)
1. List: упорядоченный, допускает дубликаты, доступ по индексу
void main() {
var fruits = ['apple','orange'];
fruits.add('kiwi');
fruits.addAll(['grape']);
fruits.removeAt(0);
fruits.sort((a,b)=>a.compareTo(b)); // Сортировка элементов
// Ограничение по типу
var strList = <String>[];
}
2. Set: неупорядоченный, уникальные элементы, доступ по индексу отсутствует
void main() {
var set = <String>{};
set.addAll(['gold','xenon']);
set.add('gold'); // Повторное добавление не даёт эффекта
assert(set.contains('xenon'));
// Операция пересечения множеств
var set2 = Set.from(['xenon','argon']);
var inter = set.intersection(set2);
}
3. Map: коллекция пар «ключ–значение»; ключи уникальны
void main() {
var map = {54: 'xenon'};
print(map[54]);
assert(map.containsKey(54));
map.remove(54);
// Задать значение только при отсутствии ключа
map.putIfAbsent('name', () => 'Dart');
// Обход записей
map.forEach((k,v)=>print('$k:$v'));
}
4. Универсальные операции Iterable (List и Set реализуют Iterable)
Часто используемые высшего порядка: forEach, map, where, any, every
void main() {
var list = ['green','black','chamomile'];
list.forEach(print);
// map вычисляется лениво; toList запускает расчёт немедленно
var upperList = list.map((e)=>e.toUpperCase()).toList();
// Фильтрация элементов
var filter = list.where((e)=>e == 'chamomile');
assert(list.any((e)=>e == 'chamomile'));
assert(!list.every((e)=>e.contains('tea')));
}
V. Работа с URI (Uri)
Используется для кодирования, декодирования, разбора и построения URL
encodeFull: кодирует только пробелы и похожие символы, сохраняет служебные символы URL/ : ? &encodeComponent: экранирует все специальные символы (подходит для кодирования значений параметров)
void main() {
// Разбор ссылки
var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
print(uri.scheme);
print(uri.host);
print(uri.queryParameters);
// Построение ссылки
var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}
VI. Дата и время DateTime & Duration
DateTime: момент времени, поддерживает локальное время и UTCDuration: временной интервал, используется для сложения/вычитания моментов и расчёта разницы
void main() {
var now = DateTime.now();
var y2k = DateTime.utc(2000);
// Сложение и вычитание времени
var nextYear = y2k.add(const Duration(days:366));
var diff = nextYear.difference(y2k);
print(diff.inDays);
// Метка времени (миллисекунды с эпохи Unix 1970-01-01 UTC)
print(y2k.millisecondsSinceEpoch);
}
Важно: Сдвиги по дням могут приводить к ошибкам при переходе на летнее время. Рекомендуется использовать UTC.
VII. Полезные интерфейсы и базовые классы
1. Comparable: позволяет сравнивать объекты для сортировки
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}
2. Пользовательские ключи для Map: переопределите == и hashCode
Правило: Равные объекты должны иметь одинаковый hashCode
class Person {
final String first, last;
Person(this.first,this.last);
@override
int get hashCode => Object.hash(first, last);
@override
bool operator ==(Object other) =>
other is Person && other.first == first && other.last == other.last;
}
- 3. Iterable + Iterator
Реализация Iterable даёт возможность использовать циклы for-in с кастомной логикой обхода.
VIII. Обработка исключений
- Error: критический сбой, как правило, не перехватывается (пример: NoSuchMethodError)
- Exception: предсказуемая аномалия, которую можно перехватить; поддерживается создание собственных исключений
class FooException implements Exception {
final String? msg;
const FooException([this.msg]);
@override
String toString() => msg ?? 'FooException';
}
IX. Слабые ссылки и финализаторы
WeakReference: слабая ссылка, не препятствует сборщику мусора освободить целевой объектFinalizer / NativeFinalizer: запускает обратный вызов при сборке объекта для освобождения нативных ресурсовFinalizable: предотвращает преждевременную очистку объекта сборщиком мусора
Основная стандартная библиотека dart:core