IT Academy
Справочник курса

Flutter и кроссплатформенная разработка

Все объяснения, задачи и лабораторная в одном месте.

Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.

1. Dart, async и package ecosystem

Объяснение

Dart Future описывает один будущий результат, Stream — последовательность. async не переносит CPU-вычисление в другой isolate. Null safety требует явно моделировать отсутствие значения.

Задача для самостоятельного решения

Почему большая синхронная обработка в async-функции тормозит UI?

Показать разбор ответа

До реального ожидания она занимает UI isolate. Тяжёлые вычисления нужно дробить или переносить в isolate, учитывая стоимость передачи данных.

2. Widget tree, layout и themes

Объяснение

Widget описывает конфигурацию интерфейса, Element поддерживает положение и состояние, RenderObject занимается геометрией и рисованием. Layout передаёт ограничения вниз и размеры вверх.

Задача для самостоятельного решения

Почему бесконечная ширина приводит к ошибке layout?

Показать разбор ответа

Дочерний компонент не получил конечной границы для расчёта. Проверьте родительские constraints; использование Expanded уместно только в подходящем Flex-контексте.

3. State management и navigation

Объяснение

Состояние должно иметь владельца и жизненный цикл. Навигация связывает маршрут с данными. Производное значение вычисляют из источника, а сетевое состояние включает loading и error.

Задача для самостоятельного решения

Где хранить корзину между экранами?

Показать разбор ответа

В модели выше отдельных страниц с явным API изменений. Локальное состояние страницы исчезает при её удалении из дерева.

4. Networking, serialization и storage

Объяснение

Декодирование JSON проверяет структуру, а бизнес-валидация — смысл. Локальное хранение требует миграции при смене схемы. Секреты не следует хранить как обычную настройку интерфейса.

Задача для самостоятельного решения

Что делать с неизвестным полем в ответе API?

Показать разбор ответа

Если контракт допускает расширение, игнорировать его, сохраняя проверки обязательных полей. Жёсткая зависимость от точного набора полей ломает совместимость.

5. Platform channels и device APIs

Объяснение

Platform channel связывает Dart и нативный код. Пересечение границы имеет стоимость и может завершиться ошибкой платформы. Разрешения и доступность API отличаются между ОС.

Задача для самостоятельного решения

Как работать, если функция устройства отсутствует?

Показать разбор ответа

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

6. Tests, performance и release

Объяснение

Widget-тест проверяет интерфейс в контролируемой среде, integration-тест — работу на устройстве. Release-производительность отличается от debug. Отрисовку нужно измерять на целевых устройствах.

Задача для самостоятельного решения

Почему оценивать FPS в debug недостаточно?

Показать разбор ответа

Отладочные проверки и JIT меняют стоимость работы. Используйте profile/release режим и сценарий с реальными объёмами данных.

Практика

Лабораторная работа

Подготовка

Flutter project; фрагмент класса используется как домашний экран MaterialApp.

Учебный пример

class Counter extends StatefulWidget {
  const Counter({super.key});
  @override State<Counter> createState() => _CounterState();
}
class _CounterState extends State<Counter> {
  int count = 0;
  @override Widget build(BuildContext context) => ElevatedButton(
    onPressed: () => setState(() => count++),
    child: Text('Нажатий: $count'),
  );
}

Как работает пример и что ожидать

setState сообщает framework об изменении, затем build описывает новое представление. State живёт вместе с соответствующим Element и не является долговременным хранилищем. Нужны стандартные imports Flutter Material и обёртка MaterialApp в проекте.

Итоговая работа

Добавьте repository, локальную базу и сеть с typed parsing. Проверьте Android/iOS различия, отсутствие native API и большой шрифт. Напишите widget-тест счётчика и integration-тест сохранения после перезапуска.

Проверка результата

1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.

Как оценить работу

По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.