Перейти к основному содержимому

Dart — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Dart". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.

Вопрос. dart не находится после установки Flutter SDK — только flutter работает.

Ответ. Dart входит в состав Flutter: добавьте в PATH каталог flutter/bin/cache/dart-sdk/bin или установите отдельный Dart SDK с dart.dev. Проверьте dart --version. Подробнее здесь — первая программа.

Вопрос. dart run script.dart — "Couldn't resolve package" для файла в одной папке.

Ответ. Для зависимостей нужен pubspec.yaml и dart pub get. Одиночный файл без пакетов запускайте как dart run script.dart из его каталога или создайте проект dart create. Подробнее здесь — первая программа.

Вопрос. Код из статьи про dart:io не компилируется для web.

Ответ. dart:io недоступен в браузере — только VM и нативные платформы. Для web используйте dart:html / package:http. Подробнее здесь — консоль и HTTP, runtime.

Вопрос. Null check operator used on a null value — программа падает в runtime.

Ответ. Оператор ! принудительно снимает nullable; при null будет исключение. Используйте ?., ?? или проверку if (x != null). Подробнее здесь — типы, основы.

Вопрос. Присвоил null переменной — компилятор: "A value of type 'Null' can't be assigned to 'String'".

Ответ. Тип должен быть nullable: String?, а не String. Null safety включён по умолчанию в Dart 3. Подробнее здесь — типы.

Вопрос. late String name — "LateInitializationError: Field has not been initialized".

Ответ. late обещает присвоение до первого чтения. Инициализируйте в конструкторе, initState (Flutter) или через late final x = .... Подробнее здесь — классы и ООП.

Вопрос. final list = [1, 2]; list.add(3) работает — final же "константа"?

Ответ. final фиксирует ссылку на объект, но содержимое изменяемой коллекции можно менять. Неизменяемый список — const или List.unmodifiable. Подробнее здесь — основы.

Вопрос. async функция вернула Future, а я ждал число сразу.

Ответ. Результат появится позже — нужен await внутри другой async функции или .then(). В main используйте void main() async { ... }. Подробнее здесь — async.

Вопрос. Забыл await при записи файла — программа завершилась, файл пустой.

Ответ. writeAsString возвращает Future; без await процесс может выйти до завершения I/O. Подробнее здесь — простые приложения, консоль и HTTP.

Вопрос. Unhandled Exception в Future — стек указывает на event loop, а не на мой код.

Ответ. Оборачивайте асинхронный код в try/catch внутри async или используйте .catchError на Future. Подробнее здесь — async.

Вопрос. HTTP-запрос в Flutter "завис" — UI не реагирует.

Ответ. Сетевой вызов на главном isolate блокирует UI. Используйте async/await (не блокирующий HttpClient в синхронном коде) или compute/Isolate.run для тяжёлой работы. Подробнее здесь — async, Flutter.

Вопрос. HttpClient — "Bad state: HttpClient is closed".

Ответ. Клиент закрыли через close(), а потом снова вызвали getUrl. Создайте новый экземпляр или закрывайте в finally после последнего запроса. Подробнее здесь — консоль и HTTP.

Вопрос. Локальный HttpServer на 8080 — "Address already in use".

Ответ. Порт занят предыдущим запуском или другим сервисом. Завершите процесс или смените порт в HttpServer.bind. Подробнее здесь — простые приложения.

Вопрос. jsonDecode — "type 'String' is not a subtype of type 'int'".

Ответ. JSON числа могут прийти как double; поля вручную приводите через (j['id'] as num).toInt() или используйте fromJson с проверками. Подробнее здесь — простые приложения.

Вопрос. Switch по enum — компилятор требует default после добавления нового значения.

Ответ. Для exhaustive switch (Dart 3) все варианты enum должны быть покрыты — это защита от забытых веток. Добавьте case для нового значения. Подробнее здесь — паттерны Dart 3.

Вопрос. Pattern matching по record — "The matched value isn't compatible with this pattern".

Ответ. Имена полей и типы в pattern должны точно совпадать с record. Используйте (a: var x, b: var y) для именованных полей. Подробнее здесь — паттерны Dart 3.

Вопрос. ~/ и / дали разные результаты на двух int.

Ответ. / для int в Dart 3 даёт double (3/2 = 1.5); ~/ — целочисленное деление (1). Подробнее здесь — синтаксис.

Вопрос. Приватное поле _name видно из другого файла в том же проекте.

Ответ. В Dart приватность — на уровне библиотеки (файла), не класса. Для настоящей инкапсуляции используйте отдельные файлы/part. Подробнее здесь — классы и ООП.

Вопрос. extends vs implements — дублировал весь интерфейс вручную.

Ответ. implements требует реализовать все члены; extends наследует реализацию. Для mixin-поведения — with. Подробнее здесь — классы и ООП.

Вопрос. Flutter: изменил переменную в State, UI не обновился.

Ответ. После изменения состояния вызовите setState(() { ... }). Без этого framework не перестроит виджеты. Подробнее здесь — Flutter.

Вопрос. Hot reload не подхватил изменение в main() или static field.

Ответ. Hot reload не переинициализирует глобальное состояние и некоторые static. Сделайте hot restart (Shift+R) или полный перезапуск. Подробнее здесь — Flutter.

Вопрос. pub get failed — version solving failed на конфликт SDK.

Ответ. Проверьте environment: sdk: в pubspec.yaml и версию Flutter/Dart. Обновите зависимости или ослабьте constraint. Подробнее здесь — первая программа, Flutter.

Вопрос. print в production Flutter засоряет логи — чем заменить?

Ответ. Используйте debugPrint, log из dart:developer или пакет logger; в release print часто отключают. Подробнее здесь — основы.

Вопрос. Сравнил два списка через == — false, хотя элементы одинаковые.

Ответ. Для списков == сравнивает элементы по deep equality если элементы поддерживают ==; разные экземпляры List с теми же элементами — equal. Для объектов без переопределения == сравниваются ссылки. Подробнее здесь — типы.

Вопрос. Stream подписался, события не приходят — забыл listen.

Ответ. Stream ленивый до подписки. Вызовите stream.listen(...) или используйте await for. Не забудьте cancel на subscription. Подробнее здесь — async.

Вопрос. Пришёл из JavaScript — dynamic везде, компилятор молчит, потом падает в runtime.

Ответ. dynamic отключает статические проверки. Для учебного кода задавайте конкретные типы и nullable явно. Подробнее здесь — типы.

Вопрос. readAsLines проглотил последнюю строку без \n в конце файла.

Ответ. Это нормальное поведение — последняя строка без завершающего перевода всё равно попадает в список. При записи добавляйте \n явно, как в простых приложениях. Подробнее здесь — консоль и HTTP.

Вопрос. Хочу только Flutter — можно пропустить консоль и dart:io?

Ответ. Для UI можно, но async, типы и null safety одинаковы; консольные примеры быстрее отладить без эмулятора. Минимум — основы, async, первая программа. Подробнее здесь — оглавление.

Вопрос. Dart и Flutter — в чём разница, нужно ли учить Dart для Flutter?

Ответ. Flutter — UI-фреймворк; Dart — язык, на котором пишут и виджеты, и логику. Без Dart Flutter не освоить. Подробнее здесь — Flutter, основы.

Вопрос. Как установить Dart SDK отдельно от Flutter на Windows?

Ответ. Скачайте SDK с dart.dev или используйте flutter/bin/cache/dart-sdk/bin из Flutter. Проверка — dart --version. Подробнее здесь — первая программа.

Вопрос. Dart null safety — что такое String и String??

Ответ. String не принимает null; String? — nullable. Операторы ?., ??, ! для безопасной работы. Подробнее здесь — типы, основы.

Вопрос. Dart async await tutorial — как начать с нуля?

Ответ. Объявите Future-функцию, вызовите с await внутри async main или handler. Пример HTTP — async, консоль и HTTP.

Вопрос. Dart vs JavaScript — что лучше для веба?

Ответ. JS — нативный язык браузера; Dart в web компилируется в JS или Wasm, силён во Flutter и typed backend. Сравнение runtime — 3.md, JavaScript.

Вопрос. Dart vs Kotlin для Android — что выбирают в 2025?

Ответ. Нативный Android — Kotlin; кроссплатформа iOS+Android — Flutter на Dart. Подробнее здесь — Flutter, Kotlin.

Вопрос. Как запустить Dart консольное приложение hello world?

Ответ. dart create -t console myapp, затем dart run bin/myapp.dart или один файл dart run hello.dart. Подробнее здесь — первая программа.

Вопрос. Future vs Stream в Dart — когда что использовать?

Ответ. Future — одно значение позже (HTTP, файл); Stream — поток событий (WebSocket, клавиатура). Подробнее здесь — async.

Вопрос. Dart isolate — как сделать многопоточность?

Ответ. Изолаты не делят память; тяжёлые задачи — Isolate.run или compute во Flutter. Подробнее здесь — runtime, async.

Вопрос. Flutter hot reload не работает — что проверить?

Ответ. Изменения в main, static и native code требуют hot restart. Убедитесь, что проект в debug mode. Подробнее здесь — Flutter.

Вопрос. pubspec.yaml — как добавить зависимость в Dart проект?

Ответ. Секция dependencies: + dart pub get. Версии и SDK constraint в environment:. Подробнее здесь — первая программа, Flutter.

Вопрос. Dart read file example — как прочитать txt?

Ответ. await File('path').readAsString() или readAsLines() из dart:io. Подробнее здесь — консоль и HTTP, простые приложения.

Вопрос. jsonEncode jsonDecode Dart — без пакетов?

Ответ. Модуль dart:convert встроен; для моделей — toJson/fromJson. Пример — простые приложения.

Вопрос. Dart switch expression — синтаксис Dart 3?

Ответ. switch (x) { case 1 => 'a', _ => 'b' } и pattern matching по records/sealed types. Подробнее здесь — паттерны Dart 3, синтаксис.

Вопрос. StatelessWidget vs StatefulWidget Flutter разница?

Ответ. Stateless — UI без изменяемого состояния; Stateful — есть State и setState при обновлении. Подробнее здесь — Flutter, ООП.

Вопрос. Сколько учить Dart перед Flutter?

Ответ. Минимум: основы, типы, async, 7 — 1–2 недели; параллельно можно открыть Flutter. Маршрут — intro.

Вопрос. Dart HTTP client example GET запрос?

Ответ. HttpClient, getUrl, close в finally — см. консоль и HTTP и простые приложения.

Вопрос. Dart server backend — можно ли без Flutter?

Ответ. Да: dart:io HttpServer, фреймворки Shelf, Serverpod. Минимальный сервер — простые приложения, 9.md.

Вопрос. Где бесплатно учить Dart на русском для начинающих?

Ответ. Раздел Dart энциклопедии: оглавление, первая программа, Flutter для мобильной ветки.

Вопрос. Dart 3 records и patterns — зачем нужны?

Ответ. Records — лёгкие именованные кортежи; patterns — разбор данных в switch без boilerplate. Подробнее здесь — паттерны Dart 3, типы.

Вопрос. Dart web — почему dart:io не работает в Chrome?

Ответ. Браузерная сборка использует другие библиотеки; dart:io только на VM/desktop/mobile native. Подробнее здесь — runtime, консоль и HTTP.

Вопрос. Dart list map where filter — аналог Python?

Ответ. list.map((e) => ...).where((e) => ...).toList() — цепочки итерables. Подробнее здесь — типы, основы.


Что запомнить

Dart — язык от Google со статической типизацией, null safety и встроенной асинхронностью. Dart VM поддерживает JIT (разработка) и AOT (релиз); изоляты (isolates) не делят память — обмен через сообщения.

Основные особенности Dart:

  • Null safety — типы T и T?, операторы ?., ??, !.
  • Async/await и Future/Stream — основа I/O и Flutter.
  • Sound typing — ошибки типов ловятся анализатором до запуска.
  • Dart 3 — records, patterns, exhaustive switch, sealed classes.
  • Две платформы — VM/dart:io для консоли и серверов; web-кompиляция без dart:io.

Маршрут: историяruntimeосновытипыasyncпервая программаООПконсоль и HTTPFlutter.

Три практических правила:

  1. Каждый I/O — с await; каждый HttpClient — с close() в finally.
  2. Nullable обрабатывайте явно, без злоупотребления !.
  3. Flutter UI меняется только через setState / state management.

Куда идти дальше

ТемаРаздел
Мобильная разработкаFlutter
Сравнение с TypeScriptJavaScript — о разделе
HTTP теорияHTTP как основа веб-интеграций

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


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").