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 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.