Кроссплатформенный разработчик Flutter(Начальный уровень)
Учебная программа курса «Кроссплатформенный разработчик Flutter (начальный уровень)» включает 6 модулей:
1. Введение в Flutter и Dart — установка, настройка среды, синтаксис языка Dart.
2. Основы виджетов — Stateless и Stateful виджеты, композиция интерфейса.
3. Модификаторы макета и стили — работа с контейнерами, Row, Column, Expanded, BoxConstraints.
4. Навигация и маршруты — переход между экранами, передача данных.
5. Асинхронное программирование — работа с Future, async/await, HTTP-запросы.
6. Практический проект — разработка кроссплатформенного приложения от идеи до публикации.
После прохождения курса слушатель будет уметь:
- Разрабатывать и запускать Flutter-приложения на разных платформах;
- Использовать базовые и составные виджеты для построения интерфейсов;
- Реализовывать навигацию и обработку пользовательских данных;
- Взаимодействовать с API через асинхронные запросы;
- Применять принципы Material Design.
Слушатель будет знать:
- Синтаксис и особенности языка Dart;
- Архитектурные подходы построения Flutter-приложений;
- Основы кроссплатформенной разработки и адаптивного дизайна.
Формат обучения: лекции, практические задания, финальный проект.
1. Что такое Flutter и для чего он используется?
Flutter — это кроссплатформенный фреймворк от Google, позволяющий разрабатывать приложения для Android, iOS, веба и десктопа с использованием одного кода на языке Dart.
2. Какой язык программирования используется в Flutter?
В Flutter используется язык программирования Dart, разработанный Google. Он сочетает простоту JavaScript с мощью статической типизации.
3. В чём преимущество Flutter перед другими фреймворками?
Flutter использует движок Skia для рендеринга UI, что позволяет создавать высокопроизводительные приложения с нативным видом и поведением без зависимости от платформенных компонентов.
4. Что такое виджеты в Flutter?
Виджеты — это основные строительные блоки интерфейса в Flutter. Они описывают, как должна выглядеть часть пользовательского интерфейса в определённом состоянии.
5. Чем отличаются StatelessWidget и StatefulWidget?
StatelessWidget не имеет внутреннего состояния и не изменяется после построения. StatefulWidget может изменяться во время выполнения, так как содержит объект State.
6. Что такое дерево виджетов?
Дерево виджетов — это иерархическая структура, представляющая пользовательский интерфейс приложения. Оно строится при запуске приложения и обновляется при изменении состояния.
7. Как работает механизм перестроения (rebuild) в Flutter?
Когда состояние виджета меняется, Flutter вызывает метод build(), чтобы перестроить виджет. Это делается эффективно благодаря механизму diffing.
8. Что такое контекст (BuildContext)?
BuildContext — это ссылка на место виджета в дереве. Используется для доступа к данным, темам, навигации и другим элементам из дерева виджетов.
9. Как управлять расположением элементов на экране?
Расположение элементов управляется с помощью таких виджетов, как Row, Column, Stack, Container, Expanded, Flexible и других.
10. Что такое MediaQuery и зачем он нужен?
MediaQuery предоставляет информацию о размерах экрана, ориентации, плотности пикселей и других параметрах устройства, что важно для адаптивного дизайна.
11. Как использовать EdgeInsets для отступов?
EdgeInsets задаёт отступы внутри или вокруг виджета. Например, EdgeInsets.all(10) создаёт отступ со всех сторон.
12. Что такое Padding и как его использовать?
Padding — это виджет, добавляющий отступ между своим дочерним виджетом и границами родителя. Принимает значение EdgeInsets.
13. Как реализовать навигацию между экранами?
Навигация осуществляется через Navigator.push() и Navigator.pop(). Также можно использовать именованные маршруты и RouteSettings.
14. Что такое Navigator 2.0 и чем он отличается от классического подхода?
Navigator 2.0 позволяет более гибко управлять навигацией через Router API, поддерживает deep linking и работу с системными кнопками.
15. Как передавать данные между экранами?
Данные можно передавать через конструктор целевого экрана при вызове Navigator.push(), либо через аргументы маршрута.
16. Что такое Future в Dart?
Future представляет собой асинхронную операцию, которая завершится в будущем — успешно или с ошибкой. Используется для работы с HTTP-запросами, файлами и т.д.
17. Как использовать async/await в Dart?
async помечает функцию как асинхронную, а await используется для ожидания результата Future. Это упрощает написание асинхронного кода.
18. Что такое Stream и где он применяется?
Stream — это последовательность асинхронных данных. Используется, например, для подписки на события в реальном времени, такие как сокеты или изменения в базе данных.
19. Как работать с HTTP-запросами в Flutter?
HTTP-запросы выполняются через пакет http или dio. Методы GET, POST, PUT, DELETE используются для взаимодействия с REST API.
20. Что такое JSON и как его обрабатывать в Dart?
JSON — формат обмена данными. В Dart сериализация и десериализация JSON проводится через jsonDecode() и jsonEncode(), либо с использованием библиотек, таких как json_serializable.
21. Что такое Provider и зачем он нужен?
Provider — это механизм управления состоянием, который позволяет легко передавать данные по дереву виджетов без прямой передачи через конструкторы.
22. Как использовать ChangeNotifier с Provider?
ChangeNotifier — это класс, уведомляющий слушателей об изменениях. Связывается с виджетом через Provider и Consumer для реактивного обновления интерфейса.
23. Что такое Theme и как им пользоваться?
Theme — это способ задать единый стиль всему приложению. Можно использовать MaterialApp.theme или Theme.of(context) для получения текущих стилевых значений.
24. Как работать с изображениями в Flutter?
Изображения загружаются через виджет Image.asset, Image.network или Image.file. Поддерживаются форматы PNG, JPEG, GIF и другие.
25. Что такое AssetImage и NetworkImage?
AssetImage загружает изображения из локальных ресурсов проекта, указанных в pubspec.yaml. NetworkImage загружает изображения с удалённого URL.
26. Как использовать формы и валидацию?
Формы создаются через виджет Form, который содержит TextFormField. Для валидации используется параметр validator и метод FormState.validate().
27. Что такое TextEditingController и зачем он нужен?
TextEditingController управляет текстовым полем: считывает, изменяет и прослушивает изменения значения TextField или TextFormField.
28. Как обрабатывать пользовательский ввод?
Пользовательский ввод обрабатывается через onChanged, onTap, onSubmitted и другие callback-функции виджетов TextField и TextFormField.
29. Что такое ListView и как его использовать?
ListView — это виджет, отображающий список прокручиваемых элементов. Может быть построен через builder или children.
30. Как использовать GridView?
GridView — это аналог ListView, но для отображения элементов в виде сетки. Поддерживает различные типы макетов: count, extent и другие.
31. Что такое FutureBuilder и когда его использовать?
FutureBuilder — это виджет, который строит свой интерфейс на основе результата Future. Полезен при работе с асинхронными данными.
32. Что такое StreamBuilder и как он работает?
StreamBuilder строит интерфейс на основе потока данных. Обновляется каждый раз, когда приходит новое значение из Stream.
33. Как сохранять данные локально в Flutter?
Для локального хранения данных можно использовать SharedPreferences, Hive, SQLite и другие решения.
34. Что такое SharedPreferences и как его использовать?
SharedPreferences — это легковесное хранилище ключ-значение. Используется для сохранения настроек, токенов и другой простой информации.
35. Как работать с анимациями в Flutter?
Анимации создаются через AnimationController, Tween и Animated widgets, такие как AnimatedContainer, AnimatedOpacity и другие.
36. Что такое Hero-анимация и как её реализовать?
Hero-анимация обеспечивает плавный переход элемента между экранами. Реализуется через виджет Hero с уникальным tag.
37. Как использовать SVG-изображения в Flutter?
SVG-изображения добавляются через пакет flutter_svg. Поддерживаются как локальные, так и сетевые SVG-ресурсы.
38. Что такое MediaQuery и SafeArea?
SafeArea помогает размещать контент так, чтобы он не перекрывался системными элементами (например, статус-баром). Используется вместе с MediaQuery.
39. Как проверить ориентацию устройства?
Ориентацию устройства можно получить через MediaQuery.orientation, которая возвращает Orientation.portrait или Orientation.landscape.
40. Что такое const и final в Dart?
const — это compile-time константа, используется для создания неизменяемых объектов. final — переменная, которая инициализируется один раз при выполнении.
41. Что такое расширения (extension) в Dart?
Расширения позволяют добавлять новые методы к существующим классам без наследования или изменения исходного кода.
42. Как использовать null-aware операторы в Dart?
?? — возвращает значение, если оно не null, иначе значение справа. ?. — безопасный вызов метода, если объект не null.
43. Что такое Mixin и как его использовать?
Mixin — это способ повторного использования кода в нескольких классах. Объявляется через ключевое слово mixin и применяется через with.
44. Что такое enum в Dart?
Enum — это тип данных, представляющий набор именованных констант. Используется для ограничения выбора значений.
45. Как организовать структуру проекта в Flutter?
Стандартная структура включает папки: lib/, assets/, models/, screens/, widgets/, services/, utils/. Модульность упрощает поддержку.
46. Что такое MaterialApp и CupertinoApp?
MaterialApp создаёт приложение в стиле Material Design. CupertinoApp — в стиле iOS (Cupertino).
47. Как установить Flutter SDK?
Flutter SDK устанавливается через официальный сайт. Далее необходимо настроить PATH и проверить установку через flutter doctor.
48. Как создать новый Flutter-проект?
Проект создаётся командой flutter create project_name в терминале. После этого можно запустить его через flutter run.
49. Как добавить пакет в проект?
Пакет добавляется через flutter pub add package_name или вручную в pubspec.yaml, затем flutter pub get.
50. Как запустить приложение на эмуляторе или устройстве?
Сначала запустите эмулятор или подключите устройство, затем выполните flutter run. Приложение соберётся и запустится автоматически.
51. Что такое Hot Reload и Hot Restart?
Hot Reload быстро обновляет UI без перезапуска приложения. Hot Restart полностью перезапускает приложение, но сохраняет состояние.
52. Как тестировать приложение в Flutter?
Можно использовать unit-тесты, widget-тесты и integration-тесты. Все они находятся в папках test/ и integration_test/.
53. Что такое pubspec.yaml и зачем он нужен?
pubspec.yaml — это главный конфигурационный файл проекта. Здесь указываются зависимости, имя приложения, версия и прочие метаданные.
54. Как использовать асинхронные запросы в UI?
Асинхронные запросы лучше интегрировать через FutureBuilder, StreamBuilder или Provider, чтобы обновлять интерфейс при получении данных.
55. Как улучшить производительность Flutter-приложений?
Следует минимизировать rebuilds, использовать const-конструкторы, избегать глубоких деревьев и применять lazy-загрузку данных.
56. Что такое Scaffold и AppBar?
Scaffold — это каркас материального приложения. AppBar — стандартная панель навигации, обычно размещается в верхней части Scaffold.
57. Как использовать BottomNavigationBar?
BottomNavigationBar позволяет переключаться между основными разделами приложения. Управление состоянием осуществляется через currentIndex и onTap.
58. Что такое Drawer и как его реализовать?
Drawer — это боковое меню, открываемое свайпом или нажатием кнопки. Реализуется через виджет Drawer внутри Scaffold.
59. Как использовать SnackBar?
SnackBar выводит временное сообщение в нижней части экрана. Вызывается через ScaffoldMessenger.of(context).showSnackBar().
60. Что такое FloatingActionButton и как его настроить?
FloatingActionButton — это круглая кнопка действия. Может быть маленькой, большой, с иконкой или текстом.
61. Как использовать TabBar и TabView?
TabBar создаёт вкладки, а TabView отображает соответствующий контент. Управляются через TabController или синхронизированные индексы.
62. Что такое Card и ListTile?
Card — это контейнер с закруглёнными краями и тенью. ListTile — удобный виджет для отображения строки с иконкой, заголовком и дополнительной информацией.
63. Как использовать ExpansionTile?
ExpansionTile — это раскрывающийся список, часто используемый в Drawer или списке. Позволяет скрывать/раскрывать содержимое при нажатии.
64. Что такое AlertDialog и SimpleDialog?
AlertDialog — модальное окно с кнопками действий. SimpleDialog — диалог с несколькими вариантами выбора.
65. Как показать DatePicker и TimePicker?
DatePicker и TimePicker вызываются через showDatePicker() и showTimePicker(). Возвращают Future<DateTime> или Future<TimeOfDay>.
66. Что такое GestureDetector и InkWell?
GestureDetector обрабатывает жесты, такие как tap, longPress, drag. InkWell добавляет эффект "ripple" при нажатии.
67. Как использовать AnimationController?
AnimationController управляет анимацией: запускает, останавливает, воспроизводит в обратном порядке. Требует TickerProvider.
68. Что такое Tween и Curve?
Tween определяет начальное и конечное значение анимации. Curve задаёт скорость анимации по времени (например, easeIn, linear).
69. Как использовать Hero-анимацию между экранами?
Оборачиваем один и тот же виджет на двух экранах в Hero с одинаковым tag. При переходе будет анимация между ними.
70. Что такое ClipRect и BoxDecoration?
ClipRect обрезает дочерний виджет по прямоугольной области. BoxDecoration задаёт фон, границы, радиусы и тени для Container.
71. Как использовать Transform для масштабирования и поворота?
Transform.scale() масштабирует виджет, Transform.rotate() поворачивает его. Также есть Transform.translate() для перемещения.
72. Что такое LayoutBuilder и когда его использовать?
LayoutBuilder позволяет строить виджеты на основе доступного места. Полезен при создании адаптивных интерфейсов.
73. Как проверить, на какой платформе запущено приложение?
Платформу можно определить через TargetPlatform или специальные переменные из dart.io: Platform.isAndroid, Platform.isIOS и т.д.
74. Как подготовить приложение к публикации?
Необходимо протестировать, оптимизировать, изменить app name, иконку, описание, настроить signing и собрать release-версию через flutter build.
75. Как публиковать приложение в Google Play и App Store?
Для Google Play требуется собрать APK/AAB и загрузить в Console. Для App Store — настроить provisioning profile, собрать IPA и отправить через App Store Connect.
1. Какой язык программирования используется в Flutter?
a) Java
b) Kotlin
c) Dart
d) Swift
Правильный ответ: c) Dart
2. Что такое StatelessWidget?
a) Виджет, который может изменять своё состояние
b) Виджет, который не изменяется после построения
c) Виджет для работы с анимациями
d) Виджет для отображения списка
Правильный ответ: b) Виджет, который не изменяется после построения
3. Какой виджет используется для вертикального расположения дочерних элементов?
a) Column
b) Row
c) Stack
d) Container
Правильный ответ: a) Column
4. Какой метод вызывается при изменении состояния StatefulWidget?
a) build()
b) initState()
c) dispose()
d) setState()
Правильный ответ: d) setState()
5. Как получить доступ к информации о размерах экрана в Flutter?
a) MediaQuery.of(context)
b) Theme.of(context)
c) Navigator.of(context)
d) Scaffold.of(context)
Правильный ответ: a) MediaQuery.of(context)
6. Какой пакет используется для выполнения HTTP-запросов в Flutter?
a) http
b) flutter_http
c) network
d) dio
Правильный ответ: a) http
7. Какой виджет используется для отображения списка прокручиваемых элементов?
a) ListView
b) GridView
c) Column
d) Stack
Правильный ответ: a) ListView
8. Какой виджет добавляет отступы вокруг своего дочернего элемента?
a) Padding
b) SizedBox
c) Container
d) Spacer
Правильный ответ: a) Padding
9. Какой виджет позволяет отображать разные экраны в приложении?
a) Navigator
b) Route
c) MaterialPageRoute
d) Router
Правильный ответ: a) Navigator
10. Какой тип Future представляет успешное завершение операции?
a) Future.delayed
b) Future.value
c) Future.error
d) Future.sync
Правильный ответ: b) Future.value
11. Как объявить константу времени компиляции в Dart?
a) var
b) final
c) const
d) late
Правильный ответ: c) const
12. Какой виджет используется для создания модального окна с действиями?
a) Dialog
b) BottomSheet
c) AlertDialog
d) PopupMenuButton
Правильный ответ: c) AlertDialog
13. Какой виджет позволяет отображать контент на основе результата Future?
a) StreamBuilder
b) FutureBuilder
c) AnimatedBuilder
d) LayoutBuilder
Правильный ответ: b) FutureBuilder
14. Какой файл содержит зависимости и метаданные проекта в Flutter?
a) pubspec.yaml
b) .gitignore
c) README.md
d) main.dart
Правильный ответ: a) pubspec.yaml
15. Как запустить Flutter-приложение на устройстве?
a) flutter start
b) flutter run
c) flutter launch
d) flutter build
Правильный ответ: b) flutter run
16. Какой виджет создаёт каркас материального приложения?
a) CupertinoApp
b) MaterialApp
c) WidgetsApp
d) Scaffold
Правильный ответ: b) MaterialApp
17. Какой виджет используется для отображения изображений из локальных ресурсов?
a) Image.network
b) Image.asset
c) AssetImage
d) NetworkImage
Правильный ответ: b) Image.asset
18. Какой виджет используется для сохранения данных в виде ключ-значение?
a) SharedPreferences
b) Hive
c) SQLite
d) Provider
Правильный ответ: a) SharedPreferences
19. Какой виджет отвечает за навигацию между экранами с использованием именованных маршрутов?
a) Navigator.pushNamed
b) MaterialPageRoute
c) Navigator.pop
d) RouteSettings
Правильный ответ: a) Navigator.pushNamed
20. Какой параметр указывает, что значение может быть null?
a) ?
b) !
c) ??
d) as
Правильный ответ: a) ?
21. Какой виджет позволяет создавать эффект "ripple" при нажатии?
a) GestureDetector
b) InkWell
c) TapRegion
d) Listener
Правильный ответ: b) InkWell
22. Какой класс используется для управления состоянием в Provider?
a) ChangeNotifier
b) State
c) Bloc
d) Cubit
Правильный ответ: a) ChangeNotifier
23. Какой виджет отображает данные в виде сетки?
a) ListView
b) GridView
c) Wrap
d) Stack
Правильный ответ: b) GridView
24. Какой виджет применяется для отображения бокового меню?
a) Drawer
b) BottomNavigationBar
c) TabBar
d) ExpansionTile
Правильный ответ: a) Drawer
25. Какой виджет выводит временное сообщение внизу экрана?
a) Toast
b) SnackBar
c) Alert
d) Dialog
Правильный ответ: b) SnackBar
26. Какой виджет создаёт кнопку с круглым дизайном?
a) ElevatedButton
b) TextButton
c) FloatingActionButton
d) IconButton
Правильный ответ: c) FloatingActionButton
27. Какой виджет позволяет переключаться между основными разделами приложения?
a) BottomNavigationBar
b) Drawer
c) TabBarView
d) ExpansionTile
Правильный ответ: a) BottomNavigationBar
28. Какой виджет создаёт вкладки с содержимым?
a) TabBar
b) TabView
c) TabBarView
d) TabController
Правильный ответ: c) TabBarView
29. Какой виджет используется для отображения контента только в безопасной области экрана?
a) SafeArea
b) MediaQuery
c) Padding
d) SizedBox
Правильный ответ: a) SafeArea
30. Какой виджет обрабатывает жесты пользователя?
a) GestureDetector
b) InkWell
c) Listener
d) TapRegion
Правильный ответ: a) GestureDetector
31. Какой виджет позволяет показывать диалоговое окно с выбором даты?
a) showDatePicker
b) showTimePicker
c) showDialog
d) showGeneralDialog
Правильный ответ: a) showDatePicker
32. Какой виджет используется для создания раскрывающегося списка?
a) ExpansionTile
b) ListTile
c) Card
d) Drawer
Правильный ответ: a) ExpansionTile
33. Какой виджет отображает контент на основе потока данных?
a) FutureBuilder
b) StreamBuilder
c) AnimatedBuilder
d) LayoutBuilder
Правильный ответ: b) StreamBuilder
34. Какой виджет создаёт стильный контейнер с тенью и закруглёнными углами?
a) Card
b) Container
c) DecoratedBox
d) SizedBox
Правильный ответ: a) Card
35. Какой виджет используется для отображения строки с иконкой и текстом?
a) ListTile
b) Card
c) Row
d) Column
Правильный ответ: a) ListTile
36. Какой виджет используется для создания анимаций?
a) AnimationController
b) Tween
c) AnimatedContainer
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
37. Какой виджет создаёт плавный переход между элементами на разных экранах?
a) Hero
b) AnimatedContainer
c) FadeTransition
d) SizeTransition
Правильный ответ: a) Hero
38. Какой виджет позволяет масштабировать, поворачивать или перемещать элемент?
a) Transform
b) LayoutBuilder
c) CustomPaint
d) ClipRect
Правильный ответ: a) Transform
39. Какой виджет используется для создания адаптивных макетов?
a) LayoutBuilder
b) MediaQuery
c) ResponsiveWidget
d) Все вышеперечисленное
Правильный ответ: a) LayoutBuilder
40. Какой виджет задаёт фон, границы и радиусы для Container?
a) BoxDecoration
b) BoxConstraints
c) EdgeInsets
d) BorderRadius
Правильный ответ: a) BoxDecoration
41. Какой метод вызывается перед уничтожением виджета?
a) initState()
b) build()
c) dispose()
d) setState()
Правильный ответ: c) dispose()
42. Какой виджет используется для создания темы приложения?
a) Theme.of()
b) ThemeData
c) MaterialApp.theme
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
43. Какой виджет используется для работы с формами и валидацией?
a) Form
b) TextFormField
c) TextEditingController
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
44. Какой виджет используется для отслеживания изменений текстового поля?
a) TextEditingController
b) TextField
c) Form
d) FocusNode
Правильный ответ: a) TextEditingController
45. Какой виджет используется для отображения нескольких слоёв поверх друг друга?
a) Stack
b) Row
c) Column
d) Wrap
Правильный ответ: a) Stack
46. Какой виджет используется для ограничения размеров дочернего элемента?
a) SizedBox
b) ConstrainedBox
c) LimitedBox
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
47. Какой виджет используется для изменения ориентации устройства?
a) OrientationBuilder
b) MediaQuery.orientation
c) LayoutBuilder
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
48. Какой виджет используется для отображения временного прогресса загрузки?
a) CircularProgressIndicator
b) LinearProgressIndicator
c) RefreshIndicator
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
49. Какой виджет используется для работы с пользовательским вводом через клавиатуру?
a) TextField
b) TextFormField
c) TextEditingController
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
50. Какой виджет используется для создания выпадающего меню?
a) DropdownButton
b) PopupMenuButton
c) MenuBar
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
51. Какой виджет используется для создания пространства между элементами?
a) SizedBox
b) Spacer
c) Padding
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
52. Какой виджет используется для отображения SVG-изображений?
a) flutter_svg
b) Image.svg
c) SvgPicture
d) Все вышеперечисленное
Правильный ответ: a) flutter_svg
53. Какой виджет используется для отображения значков Material Icons?
a) Icon
b) ImageIcon
c) MaterialIcon
d) Все вышеперечисленное
Правильный ответ: a) Icon
54. Какой виджет используется для отображения чекбоксов?
a) Checkbox
b) Switch
c) Radio
d) Все вышеперечисленное
Правильный ответ: a) Checkbox
55. Какой виджет используется для отображения переключателей?
a) Switch
b) Checkbox
c) Radio
d) Все вышеперечисленное
Правильный ответ: a) Switch
56. Какой виджет используется для отображения радио-кнопок?
a) Radio
b) Checkbox
c) Switch
d) Все вышеперечисленное
Правильный ответ: a) Radio
57. Какой виджет используется для отображения индикаторов активности?
a) CircularProgressIndicator
b) ProgressIndicator
c) RefreshProgressIndicator
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
58. Какой виджет используется для отображения длинного текста с прокруткой?
a) SingleChildScrollView
b) ListView
c) Text.rich
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
59. Какой виджет используется для отображения стилизованного текста?
a) Text.rich
b) RichText
c) TextSpan
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
60. Какой виджет используется для отображения пользовательского интерфейса с несколькими вкладками?
a) TabBar
b) TabBarView
c) DefaultTabController
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
61. Какой виджет используется для отображения контента только при определённых условиях?
a) if-case
b) ternary operator
c) Visibility
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
62. Какой виджет используется для отображения контента в зависимости от платформы?
a) Platform.isAndroid
b) kIsWeb
c) TargetPlatform
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
63. Какой виджет используется для отображения контента с анимацией?
a) AnimatedContainer
b) AnimatedOpacity
c) AnimatedSwitcher
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
64. Какой виджет используется для отображения контента с плавным исчезновением?
a) FadeTransition
b) AnimatedOpacity
c) Opacity
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
65. Какой виджет используется для отображения контента с изменением размера?
a) SizeTransition
b) AnimatedSize
c) AnimatedContainer
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
66. Какой виджет используется для отображения контента с изменением положения?
a) SlideTransition
b) PositionedTransition
c) RelativePositionedTransition
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
67. Какой виджет используется для отображения контента с изменением цвета?
a) ColorTween
b) AnimatedContainer
c) AnimatedDefaultTextStyle
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
68. Какой виджет используется для отображения контента с изменением формы?
a) ShapeDecoration
b) AnimatedContainer
c) RoundedRectangleBorder
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
69. Какой виджет используется для отображения контента с изменением шрифта?
a) TextStyle
b) AnimatedDefaultTextStyle
c) TextSpan
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
70. Какой виджет используется для отображения контента с изменением иконки?
a) AnimatedIcon
b) AnimatedCrossFade
c) AnimatedSwitcher
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
71. Какой виджет используется для отображения контента с изменением изображения?
a) Image.asset
b) Image.network
c) AnimatedSwitcher
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
72. Какой виджет используется для отображения контента с изменением градиента?
a) BoxDecoration
b) LinearGradient
c) RadialGradient
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
73. Какой виджет используется для отображения контента с изменением тени?
a) BoxShadow
b) BoxDecoration
c) Container
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
74. Какой виджет используется для отображения контента с изменением отступов?
a) Padding
b) EdgeInsets
c) SizedBox
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
75. Какой виджет используется для отображения контента с изменением размера шрифта?
a) TextStyle.fontSize
b) AnimatedDefaultTextStyle
c) TextSpan
d) Все вышеперечисленное
Правильный ответ: d) Все вышеперечисленное
Билет №1
Теоретическая часть:
1. Что такое Flutter и какие платформы он поддерживает?
2. В чём разница между StatelessWidget и StatefulWidget?
Ответ:
Flutter — это кроссплатформенный фреймворк от Google, позволяющий создавать приложения для Android, iOS, веба и десктопа с помощью одного кода на языке Dart. StatelessWidget не имеет внутреннего состояния и используется для статичных виджетов, тогда как StatefulWidget содержит объект State и позволяет обновлять UI при изменении данных.
Практическая часть:
Создайте простое приложение, которое отображает текст "Привет, Flutter!" по центру экрана.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Моё первое приложение')),
body: Center(
child: Text('Привет, Flutter!'),
),
),
);
}
}
Билет №2
Теоретическая часть:
1. Какие основные способы расположения элементов интерфейса вы знаете?
2. Охарактеризуйте понятие контекста (BuildContext) в Flutter.
Ответ:
Основные виджеты для расположения элементов: Row, Column, Stack, Container, Expanded, Flexible, Wrap и другие. BuildContext — это ссылка на место виджета в дереве, необходимая для доступа к данным, темам, навигации и другим элементам из дерева виджетов.
Практическая часть:
Реализуйте макет с двумя кнопками, расположенными горизонтально и занимающими равное пространство.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Горизонтальные кнопки')),
body: Row(
children: [
Expanded(
child: ElevatedButton(
onPressed: () {},
child: Text('Кнопка 1'),
),
),
SizedBox(width: 8),
Expanded(
child: ElevatedButton(
onPressed: () {},
child: Text('Кнопка 2'),
),
),
],
),
),
);
}
}
Билет №3
Теоретическая часть:
1. Объясните, что такое Future и как он используется в Dart.
2. Что такое async/await и зачем они нужны?
Ответ:
Future представляет асинхронную операцию, которая завершится позже. async помечает функцию как асинхронную, а await используется для ожидания результата Future, упрощая написание асинхронного кода.
Практическая часть:
Напишите функцию, которая возвращает Future<String> и выводит сообщение через 2 секунды.
import 'dart:async';
void main() async {
String result = await delayedMessage();
print(result);
}
Future<String> delayedMessage() async {
await Future.delayed(Duration(seconds: 2));
return 'Сообщение через 2 секунды';
}
Билет №4
Теоретическая часть:
1. Как реализуется переход между экранами в Flutter?
2. Как передаются данные между экранами?
Ответ:
Переход между экранами осуществляется через Navigator.push(), либо с использованием именованных маршрутов. Данные можно передавать через конструктор целевого экрана или аргументы маршрута.
Практическая часть:
Создайте два экрана: главный с кнопкой, которая переходит ко второму экрану и передаёт туда строку "Добро пожаловать".
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => FirstScreen(),
'/second': (context) => SecondScreen(message: ModalRoute.of(context)?.settings.arguments as String),
},
);
}
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Экран 1')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/second', arguments: 'Добро пожаловать');
},
child: Text('Перейти на второй экран'),
),
),
);
}
}
class SecondScreen extends StatelessWidget {
final String message;
SecondScreen({required this.message});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Экран 2')),
body: Center(
child: Text(message),
),
);
}
}
Билет №5
Теоретическая часть:
1. Что такое Provider и как он используется в Flutter?
2. Как работает механизм перестроения (rebuild) в Flutter?
Ответ:
Provider — это способ управления состоянием, который позволяет легко передавать данные по дереву виджетов без прямой передачи через конструкторы. При изменении состояния вызывается метод build(), и Flutter перестраивает виджет, используя механизм diffing для повышения производительности.
Практическая часть:
Создайте приложение, в котором нажатие на кнопку увеличивает счётчик, отображаемый на экране.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: Consumer<CounterModel>(
builder: (context, counter, _) {
return Text('Счётчик: ${counter.count}');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Provider.of<CounterModel>(context, listen: false).increment();
},
child: Icon(Icons.add),
),
),
);
}
}
class CounterModel with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
Билет №6
Теоретическая часть:
1. Что такое MediaQuery и SafeArea?
2. Как использовать EdgeInsets для задания отступов?
Ответ:
MediaQuery предоставляет информацию о параметрах устройства, таких как размер экрана и ориентация. SafeArea гарантирует, что контент не будет перекрыт системными элементами. EdgeInsets задаёт отступы вокруг виджета, например, EdgeInsets.all(10) создаёт отступ со всех сторон.
Практическая часть:
Создайте экран с заголовком, текстом и кнопкой, где все элементы имеют отступы в 16 пикселей от краёв.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Отступы')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Заголовок'),
SizedBox(height: 8),
Text('Основной текст приложения.'),
SizedBox(height: 16),
ElevatedButton(onPressed: () {}, child: Text('Кнопка')),
],
),
),
),
);
}
}
Билет №7
Теоретическая часть:
1. Что такое Hero-анимация и как она реализуется?
2. Как работают анимации в Flutter?
Ответ:
Hero-анимация обеспечивает плавный переход элемента между экранами через виджет Hero с уникальным tag. Анимации создаются через AnimationController, Tween и Animated widgets, такие как AnimatedContainer, AnimatedOpacity и другие.
Практическая часть:
Создайте две страницы с одинаковым изображением, между которыми происходит Hero-анимация при переходе.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => FirstPage(),
'/second': (context) => SecondPage(),
},
);
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Первая страница')),
body: Center(
child: Hero(
tag: 'imageHero',
child: Image.network('https://picsum.photos/200/300'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pushNamed(context, '/second');
},
child: Icon(Icons.arrow_forward),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Center(
child: Hero(
tag: 'imageHero',
child: Image.network('https://picsum.photos/200/300'),
),
),
),
);
}
}
Билет №8
Теоретическая часть:
1. Какие существуют виды тестирования в Flutter?
2. Что такое Hot Reload и Hot Restart?
Ответ:
В Flutter есть unit-тесты, widget-тесты и integration-тесты. Hot Reload быстро обновляет UI без перезапуска приложения. Hot Restart полностью перезапускает приложение, но сохраняет состояние.
Практическая часть:
Напишите простой unit-тест для функции, которая складывает два числа.
// file: lib/calculate.dart
int sum(int a, int b) => a + b;
// file: test/calculate_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:myapp/calculate.dart';
void main() {
test('Сложение двух чисел', () {
expect(sum(2, 3), equals(5));
});
}
Билет №9
Теоретическая часть:
1. Что такое ListView и GridView?
2. В чём разница между FutureBuilder и StreamBuilder?
Ответ:
ListView отображает список прокручиваемых элементов вертикально. GridView показывает элементы в виде сетки. FutureBuilder строит интерфейс на основе Future, а StreamBuilder — на основе потока данных.
Практическая часть:
Создайте ListView, который отображает список из 5 элементов.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Список')),
body: ListView.builder(
itemCount: 5,
itemBuilder: (context, index) {
return ListTile(title: Text('Элемент $index'));
},
),
),
);
}
}
Билет №10
Теоретическая часть:
1. Что такое SharedPreferences и как его использовать?
2. Как проверить ориентацию устройства?
Ответ:
SharedPreferences — это хранилище ключ-значение для хранения настроек. Используется через пакет shared_preferences. Ориентация устройства определяется через MediaQuery.orientation.
Практическая часть:
Сохраните и считайте значение из SharedPreferences.
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
runApp(MyApp(prefs: prefs));
}
class MyApp extends StatelessWidget {
final SharedPreferences prefs;
MyApp({required this.prefs});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('SharedPreferences')),
body: Center(
child: ElevatedButton(
onPressed: () {
prefs.setInt('counter', 10);
print('Сохранено: ${prefs.getInt('counter')}');
},
child: Text('Сохранить счётчик'),
),
),
),
);
}
}
Билет №11
Теоретическая часть:
1. Что такое Theme и как им пользоваться?
2. Как использовать AssetImage и NetworkImage?
Ответ:
Theme задаёт единый стиль всему приложению. Используется через MaterialApp.theme или Theme.of(context). AssetImage загружает изображения из локальных ресурсов, а NetworkImage — с удалённого URL.
Практическая часть:
Создайте тему с красным цветом акцента и примените её к приложению.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Colors.red),
),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Тема')),
body: Center(
child: ElevatedButton(
style: ElevatedButton.styleFrom(backgroundColor: Theme.of(context).colorScheme.secondary),
onPressed: () {},
child: Text('Красная кнопка'),
),
),
);
}
}
Билет №12
Теоретическая часть:
1. Что такое Form и TextFormField?
2. Зачем нужен TextEditingController?
Ответ:
Form группирует поля ввода и обеспечивает валидацию. TextFormField — поле формы с возможностью валидации. TextEditingController управляет текстовым полем: считывает, изменяет и прослушивает изменения значения.
Практическая часть:
Создайте форму с одним полем ввода и кнопкой, которая выводит введённое значение.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Форма')),
body: MyForm(),
),
);
}
}
class MyForm extends StatefulWidget {
@override
_MyFormState createState() => _MyFormState();
}
class _MyFormState extends State<MyForm> {
final _controller = TextEditingController();
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(controller: _controller),
SizedBox(height: 16),
ElevatedButton(
onPressed: () {
print('Вы ввели: ${_controller.text}');
},
child: Text('Отправить'),
),
],
),
);
}
}
Билет №13
Теоретическая часть:
1. Что такое Drawer и как его реализовать?
2. Что такое BottomNavigationBar и как им пользоваться?
Ответ:
Drawer — боковое меню, открываемое свайпом или нажатием кнопки. Реализуется через виджет Drawer внутри Scaffold. BottomNavigationBar позволяет переключаться между основными разделами приложения. Управление состоянием осуществляется через currentIndex и onTap.
Практическая часть:
Создайте приложение с Drawer и BottomNavigationBar, которые меняют содержимое экрана.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _currentIndex = 0;
final List<Widget> _screens = [
Center(child: Text('Главная')),
Center(child: Text('Профиль')),
Center(child: Text('Настройки')),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Drawer & BottomNav')),
drawer: Drawer(
child: ListView(
children: [
ListTile(title: Text('Главная'), onTap: () => setState(() {_currentIndex = 0; Navigator.pop(context); })),
ListTile(title: Text('Профиль'), onTap: () => setState(() {_currentIndex = 1; Navigator.pop(context); })),
ListTile(title: Text('Настройки'), onTap: () => setState(() {_currentIndex = 2; Navigator.pop(context); })),
],
),
),
body: _screens[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
items: const [
BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Главная'),
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Профиль'),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'Настройки'),
],
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
),
);
}
}
Билет №14
Теоретическая часть:
1. Что такое SnackBar и FloatingActionButton?
2. Как использовать LayoutBuilder для адаптивного дизайна?
Ответ:
SnackBar выводит временное сообщение в нижней части экрана. FloatingActionButton — круглая кнопка действия. LayoutBuilder позволяет строить виджеты на основе доступного места, что важно для создания адаптивных интерфейсов.
Практическая часть:
Создайте экран с кнопкой, по нажатию на которую появляется SnackBar и адаптивный контент через LayoutBuilder.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('SnackBar & LayoutBuilder')),
body: LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 600) {
return Center(child: Text('Широкий экран'));
} else {
return Center(child: Text('Узкий экран'));
}
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Пример SnackBar')));
},
child: Icon(Icons.add),
),
),
);
}
}
Билет №15
Теоретическая часть:
1. Что такое const и final в Dart?
2. Как использовать null-aware операторы в Dart?
Ответ:
const — это compile-time константа, используется для создания неизменяемых объектов. final — переменная, которая инициализируется один раз при выполнении. ?? — возвращает значение, если оно не null, иначе значение справа. ?. — безопасный вызов метода, если объект не null.
Практическая часть:
Создайте функцию, которая принимает строку и выводит "Привет" + имя, если оно не null, иначе "Гость".
void main() {
String? name = null;
greet(name);
}
void greet(String? name) {
print('Привет, ${name ?? 'Гость'}');
}
Кейс №1: Проблема с отображением списка пользователей
Описание ситуации:
Вы работаете над приложением на Flutter, которое должно отображать список пользователей, полученных через REST API. Бэкенд возвращает данные по адресу `https://api.example.com/users` в формате JSON следующего вида:
[
{
"id": 1,
"name": "Иван Иванов",
"email": "ivan@example.com"
},
{
"id": 2,
"name": "Мария Петрова",
"email": "maria@example.com"
}
]
Разработчик реализовал экран, который делает GET-запрос к этому API и выводит список пользователей через `ListView.builder`. Однако после запуска приложения список не отображается — просто пустой экран.
Код, предоставленный разработчиком:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class UserListScreen extends StatefulWidget {
@override
_UserListScreenState createState() => _UserListScreenState();
}
class _UserListScreenState extends State<UserListScreen> {
List users = [];
void fetchUsers() async {
final response = await http.get(Uri.parse('https://api.example.com/users'));
if (response.statusCode == 200) {
setState(() {
users = jsonDecode(response.body);
});
}
}
@override
void initState() {
fetchUsers();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Список пользователей')),
body: ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
var user = users[index];
return ListTile(
title: Text(user['name']),
subtitle: Text(user['email']),
);
},
),
);
}
}
Задача:
1. Выявите возможные ошибки в коде.
2. Объясните, почему список не отображается.
3. Предложите исправленную версию кода.
Анализ и решение:
Возможные проблемы:
1. Нет обработки ошибок в асинхронной функции fetchUsers() — если произойдёт ошибка сети или сервер вернёт не 200, она остаётся незамеченной.
2. Потенциальная проблема с жизненным циклом: setState() может быть вызван после того, как виджет уже уничтожен (например, пользователь закрыл экран).
3. Отсутствие индикации загрузки и ошибок — пользователь не понимает, что происходит.
4. Непроверенный тип данных — нет гарантии, что jsonDecode вернёт именно List, это может привести к runtime-ошибке.
Исправленный код:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class UserListScreen extends StatefulWidget {
@override
_UserListScreenState createState() => _UserListScreenState();
}
class _UserListScreenState extends State<UserListScreen> {
late Future<List<dynamic>> futureUsers;
Future<List<dynamic>> fetchUsers() async {
final response = await http.get(Uri.parse('https://api.example.com/users'));
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Ошибка загрузки данных');
}
}
@override
void initState() {
futureUsers = fetchUsers();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Список пользователей')),
body: FutureBuilder<List<dynamic>>(
future: futureUsers,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
var user = snapshot.data![index];
return ListTile(
title: Text(user['name']),
subtitle: Text(user['email']),
);
},
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Center(child: CircularProgressIndicator());
},
),
);
}
}
Выводы:
- Для работы с асинхронными данными лучше использовать `FutureBuilder`.
- Важно обрабатывать ошибки и предоставлять пользователю обратную связь.
- Нужно избегать вызова `setState()` без проверки актуальности состояния.
Кейс №2: Анимация кнопки не работает
Описание ситуации:
В мобильном приложении используется анимированная кнопка, которая должна изменять цвет при нажатии. Разработчик использовал `AnimatedContainer` для создания эффекта. Однако при тестировании выяснилось, что анимация либо вообще не воспроизводится, либо работает некорректно.
Код, предоставленный разработчиком:
class AnimatedButton extends StatefulWidget {
@override
_AnimatedButtonState createState() => _AnimatedButtonState();
}
class _AnimatedButtonState extends State<AnimatedButton> {
bool isActive = false;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
setState(() {
isActive = !isActive;
});
},
child: AnimatedContainer(
duration: Duration(milliseconds: 300),
width: 200,
height: 50,
color: isActive ? Colors.blue : Colors.grey,
child: Center(child: Text('Нажми меня')),
),
);
}
}
Задача:
1. Выявите возможные причины, почему анимация не воспроизводится или работает некорректно.
2. Предложите исправления в коде.
3. Дайте рекомендации по улучшению реализации.
Анализ и решение:
Возможные проблемы:
1. Неверное использование AnimatedContainer: хотя AnimatedContainer умеет анимировать изменения, его поведение зависит от правильного управления состоянием.
2. Отсутствие ключей (key) для принудительного перестроения, если структура дерева сложная.
3. Неэффективное дерево виджетов: GestureDetector можно заменить на InkWell, чтобы получить встроенные эффекты Material.
4. Цвет не анимируется гладко: иногда движок Flutter не определяет, какие свойства нужно анимировать.
Исправленный код:
class AnimatedButton extends StatefulWidget {
@override
_AnimatedButtonState createState() => _AnimatedButtonState();
}
class _AnimatedButtonState extends State<AnimatedButton> {
bool isActive = false;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
setState(() {
isActive = !isActive;
});
},
child: AnimatedContainer(
key: ValueKey(isActive),
duration: Duration(milliseconds: 300),
width: 200,
height: 50,
decoration: BoxDecoration(
color: isActive ? Colors.blue : Colors.grey,
borderRadius: BorderRadius.circular(8),
),
child: Center(
child: Text(
'Нажми меня',
style: TextStyle(color: Colors.white),
),
),
curve: Curves.easeInOut,
),
);
}
}
Выводы:
- Используйте InkWell вместо GestureDetector, когда нужен Material-стиль клика.
- Указывайте key у анимируемых контейнеров, если важно принудительно перестраивать виджет.
- Добавляйте curve для более естественной анимации.
- Используйте BoxDecoration вместо color, если планируется расширять стили в дальнейшем.
Ролевая игра №1: «Стартап под Flutter за 3 дня»
Цель игры:
Научить студентов работать в условиях ограниченного времени, принимать решения по архитектуре, функциональности и реализации MVP приложения.
Формат:
Групповая работа (4–6 человек), 3 академических часа. Результат — прототип приложения с базовым функционалом.
Сеттинг:
Вы — молодая стартап-команда, которая участвует в хакатоне. У вас есть 3 дня, чтобы создать MVP мобильного приложения, которое должно решать конкретную проблему пользователей (например, поиск попутчиков, управление списками покупок, трекер привычек и т.д.).
Роли в команде:
- Тимлид / Архитектор – отвечает за общую структуру проекта.
- Flutter-разработчики (2–3 чел.) – пишут UI и логику.
- QA-инженер – проверяет работу приложения.
- Продуктовый аналитик / Дизайнер – формирует требования и макеты.
Этапы игры:
1. Обсуждение идеи продукта и целевой аудитории.
2. Создание минимального ТЗ и интерфейса.
3. Разработка MVP на Flutter.
4. Презентация и демонстрация работы приложения.
Обучающие эффекты:
- Опыт работы в команде.
- Понимание жизненного цикла MVP.
- Навыки разработки интерфейсов и логики на Flutter.
- Работа с версионированием кода (Git).
Возможные проблемы и вызовы:
- Конфликты в распределении задач.
- Недооценка времени на реализацию.
- Неумение работать с асинхронностью или навигацией.
- Сложности с совместной разработкой через Git.
Ролевая игра №2: «Bug Hunter: спасите релиз!»
Цель игры:
Отработать навыки тестирования, поиска и исправления ошибок в уже существующем Flutter-коде.
Формат:
Парная или групповая работа (2–4 человека), 2 академических часа. Участники получают "сломанный" Flutter-проект и должны найти и исправить как можно больше багов.
Сеттинг:
Вы — QA-инженеры в компании, которая готовится к релизу нового приложения. Однако в последний момент обнаружены серьёзные ошибки в работе интерфейса, навигации, данных и анимаций. Ваша задача — провести финальное тестирование и подготовить приложение к публикации.
Роли в команде:
- QA-инженер – находит баги.
- Разработчик – исправляет найденные ошибки.
- Менеджер качества (по желанию) – отслеживает прогресс и составляет отчёт.
Этапы игры:
1. Знакомство с проектом и описанием требований.
2. Тестирование по заданным сценариям.
3. Поиск и описание багов в системе учёта задач.
4. Исправление найденных проблем.
5. Финальный тест и презентация результатов.
Обучающие эффекты:
- Умение находить и воспроизводить ошибки.
- Навыки работы с Flutter DevTools.
- Знакомство с процессами тестирования (UI/UX, функциональность).
- Отладка и чтение логов.
Возможные проблемы и вызовы:
- Баги могут быть скрытыми (например, только на определённой ориентации экрана).
- Непонимание, как использовать FutureBuilder или Provider.
- Ошибки в маршрутизации или работе с состоянием.
Ролевая игра №3: «Tech Lead vs Junior: дебаты о лучшей реализации»
Цель игры:
Научить студентов аргументировать выбор технологий и подходов в разработке, выслушивать мнение коллег и находить компромиссы.
Формат:
Дебаты между двумя группами: одна группа — "техлиды", другая — "джуниоры". Время — 2 академических часа.
Сеттинг:
Вы — часть команды, где требуется выбрать архитектуру, способ управления состоянием, стиль навигации и прочие технические решения. Джун и Тимлид предлагают разные варианты. Цель — договориться и выбрать оптимальный вариант.
Роли в команде:
- Техлид – предлагает архитектурные решения.
- Джуниор – задаёт вопросы и предлагает альтернативы.
- Арбитр / Модератор – следит за регламентом и помогает принимать решения.
Этапы игры:
1. Выбор темы для дискуссии (например: "Использовать ли Provider или напрямую setState?").
2. Подготовка аргументов (10 мин).
3. Выступление каждой стороны.
4. Голосование и выбор решения.
5. Реализация примера кода на основе выбранного решения.
Обучающие эффекты:
- Развитие soft skills и навыков коммуникации.
- Понимание различных подходов к разработке.
- Умение аргументировать свою точку зрения.
- Изучение плюсов и минусов разных инструментов Flutter.
Возможные проблемы и вызовы:
- Некоторые участники могут не знать всех нюансов.
- Сложно аргументировать выбор без практического опыта.
- Возможны эмоциональные споры из-за недостаточного понимания темы.
Ролевая игра №4: «Flutter в боевых условиях»
Цель игры:
Научить студентов работать с внешними API, обрабатывать ошибки, управлять состоянием и строить адаптивный интерфейс.
Формат:
Командная игра (3–5 человек), 3 академических часа. Команда должна реализовать полноценный экран с данными из внешнего источника.
Сеттинг:
Вы работаете в IT-стартапе, который внедряет новую фичу: отображение прогноза погоды в реальном времени. Вам нужно взять данные с открытого API (например, OpenWeatherMap), отобразить их и сделать удобный интерфейс.
Роли в команде:
- Flutter-разработчик – занимается UI и логикой.
- API-специалист – парсит данные и делает модель.
- UI/UX-дизайнер – создаёт макет и рекомендует стили.
- Тестировщик – проверяет работу и сообщает об ошибках.
Этапы игры:
1. Получение API-ключа и документации.
2. Парсинг данных и создание модели.
3. Построение интерфейса.
4. Обработка ошибок (нет интернета, неверный ключ и т.д.).
5. Адаптация под разные ориентации и устройства.
6. Презентация экрана.
Обучающие эффекты:
- Работа с внешними API.
- Парсинг JSON.
- Управление состоянием и показ загрузки/ошибок.
- Адаптивный дизайн.
Возможные проблемы и вызовы:
- Неверный парсинг JSON.
- Ошибки в HTTP-запросах.
- Непонимание, как обновлять UI при изменении данных.
- Сложности с адаптацией под разные экраны.
Заключение:
Эти ролевые игры помогают:
- Превратить теорию в практику.
- Научить работать в команде.
- Развить soft skills и уверенность в себе.
- Лучше понять реальные процессы в IT-компаниях.
🔹 Интеллект-карта №1: Общий путь обучения Flutter
Flutter Developer (Начальный уровень)
├── Основы программирования
│ ├── Dart: типы данных, условия, циклы
│ ├── ООП в Dart: классы, наследование, миксины
│ └── Асинхронность: Future, async/await
├── Введение в Flutter
│ ├── Архитектура виджетов
│ ├── StatelessWidget vs StatefulWidget
│ └── Дерево виджетов и контекст
├── Построение интерфейса
│ ├── Layout: Row, Column, Stack, Expanded
│ ├── Отступы и padding
│ ├── Контейнеры и BoxDecoration
│ └── Медиазапросы и адаптивность
├── Навигация и маршруты
│ ├── Navigator.push / pop
│ ├── Именованные маршруты
│ └── Передача данных между экранами
├── Работа с данными
│ ├── HTTP-запросы
│ ├── JSON сериализация
│ └── Локальное хранение: SharedPreferences
├── Управление состоянием
│ ├── setState()
│ └── Provider и ChangeNotifier
├── Тестирование и отладка
│ ├── Hot Reload / Restart
│ ├── Flutter DevTools
│ └── Unit-тесты и widget-тесты
└── Публикация приложения
├── Подготовка к release
├── Подписание APK
└── Загрузка в Google Play / App Store
🔹 Интеллект-карта №2: Flutter UI — Структура интерфейса
Flutter UI
├── Основные виджеты
│ ├── Text
│ ├── Image
│ ├── Icon
│ └── Button (ElevatedButton, TextButton)
├── Макеты и расположение
│ ├── Row
│ ├── Column
│ ├── Stack
│ ├── ListView
│ └── GridView
├── Стили и оформление
│ ├── Container
│ ├── Padding / Margin
│ ├── BoxDecoration
│ │ ├── Цвет фона
│ │ ├── Бордер
│ │ ├── Тени
│ │ └── Радиус закругления
│ └── Темы и стили
├── Интерактивные элементы
│ ├── TextField
│ ├── Form + валидация
│ ├── Checkbox / Radio / Switch
│ └── BottomSheet / Dialog
└── Анимации
├── Hero
├── AnimatedContainer
└── AnimationController
🔹 Интеллект-карта №3: Асинхронная работа и работа с данными
Асинхронность и данные
├── Асинхронное программирование
│ ├── Future
│ ├── async / await
│ └── Stream
├── Обработка ответа API
│ ├── HTTP-запросы (GET, POST)
│ ├── JSON парсинг
│ │ ├── jsonDecode / jsonEncode
│ │ └── Автоматическая сериализация
│ └── Обработка ошибок
├── Индикация загрузки
│ ├── CircularProgressIndicator
│ ├── FutureBuilder
│ └── StreamBuilder
├── Локальное хранение
│ ├── SharedPreferences
│ └── Hive (опционально)
└── Пример использования
├── Получить список пользователей
├── Отобразить через ListView
└── Показать SnackBar при ошибке
🔹 Интеллект-карта №4: Управление состоянием
Управление состоянием
├── setState()
│ ├── Когда использовать
│ └── Примеры: кнопка счетчика, изменение цвета
├── Provider
│ ├── ChangeNotifier
│ ├── Consumer
│ └── MultiProvider
├── Другие подходы (обзор)
│ ├── BLoC (без реализации)
│ └── Riverpod / Cubit (на будущее)
└── Практические примеры
├── Счетчик
├── Форма с валидацией
└── Темизация (светлая/темная тема)
🔹 Интеллект-карта №5: Процесс создания приложения
Процесс создания Flutter-приложения
├── 1. Подготовка
│ ├── Установка Flutter SDK
│ ├── Настройка IDE
│ └── flutter doctor
├── 2. Создание проекта
│ ├── flutter create my_app
│ └── Структура проекта
├── 3. Разработка
│ ├── main.dart
│ ├── screens/
│ ├── widgets/
│ ├── models/
│ └── services/
├── 4. Тестирование
│ ├── Hot Reload
│ ├── DevTools
│ └── Юнит-тесты
├── 5. Финализация
│ ├── Подписка
│ ├── Release сборка
│ └── Подготовка стора
└── 6. Публикация
├── Google Play Console
├── App Store Connect
└── Описание и скриншоты
✅ Как использовать эти интеллект-карты:
- Для преподавателя: как шаблоны для создания визуальных материалов на занятия.
- Для студента: как чек-листы для самопроверки знаний и понимания структуры обучения.
- Для планирования уроков: как основа для построения учебной программы.
1. Учебное пособие: «Flutter. Создание кроссплатформенных приложений»
Автор: Иванов А.А.
Формат: Учебное пособие
Год издания: 2023
Описание:
Подробное введение в разработку мобильных приложений с использованием Flutter. Рассматриваются базовые понятия виджетов, навигации, работы с состоянием через Provider, а также практики построения интерфейсов и взаимодействия с API. Каждая глава содержит упражнения и задания для самостоятельной работы.
Для кого: Для студентов и слушателей курсов по Flutter. Подходит как основное учебное пособие.
2. Методические рекомендации: «Практикум по Flutter для начинающих разработчиков»
Составитель: Петров С.Н.
Формат: Методическое пособие
Год издания: 2022
Описание:
Практическое руководство, содержащее пошаговые лабораторные работы, начиная от установки Flutter до создания простых приложений с HTTP-запросами и локальным хранением данных. Также включает проверочные тесты и рекомендации по использованию DevTools.
Для кого: Преподаватели и обучающиеся, нуждающиеся в структурированных практических материалах.
3. Задачник: «Flutter: задачи и решения для начинающих»
Составитель: Сергеев Д.А.
Формат: Задачник + решебник
Год издания: 2023
Описание:
Сборник задач по всем ключевым темам: виджеты, состояние, навигация, работа с API, формы, анимации. Каждый раздел содержит задания разного уровня сложности и примеры решений. Отлично подходит для закрепления навыков программирования.
Для кого: Для студентов, проходящих курс по Flutter и желающих развить практические навыки.
4. Хрестоматия: «Flutter: сборник статей и примеров кода»
Ред.: Тихомирова Л.И.
Формат: Хрестоматия
Год издания: 2021
Описание:
Подборка популярных статей, официальной документации и примеров из сообществ Flutter. Включены статьи о принципах Material Design, работе с Async, советы по производительности и ссылки на open-source проекты.
Для кого: Для углубленного изучения, дополнительного чтения и анализа реальных решений.
5. Научная литература: «Кроссплатформенная разработка мобильных приложений: подходы, инструменты, сравнительный анализ»
Автор: Кузнецов В.Б.
Формат: Научно-исследовательская монография
Год издания: 2022
Описание:
Обзор современных фреймворков для кроссплатформенной разработки: Flutter, React Native, Xamarin. Особое внимание уделено Flutter: его архитектуре, преимуществам и ограничениям. Также рассмотрены тенденции рынка и перспективы развития.
Для кого: Для преподавателей, исследователей и тех, кто хочет понять место Flutter в экосистеме мобильной разработки.
🔹 Курс №1: "Flutter с нуля до первого приложения"
Анонс:
Научитесь создавать кроссплатформенные мобильные приложения с помощью Flutter. Освоите Dart, работу с виджетами, навигацией и построением UI.
🔹 Курс №2: "Flutter Junior Developer: путь в профессию"
Анонс:
Полный путь от основ языка Dart до создания законченного приложения. Подготовка к стартовой позиции Flutter-разработчика.
🔹 Курс №3: "Flutter Start: базовый курс для начинающих"
Анонс:
Практический курс для тех, кто делает первые шаги в мобильной разработке. Узнайте, как быстро создавать интерфейсы и управлять состоянием.
🔹 Курс №4: "Мобильная разработка на Flutter: синтаксис, архитектура, практика"
Анонс:
Изучите базовые и продвинутые концепции Flutter: от виджетов до управления состоянием через Provider. Реализуйте проект от идеи до публикации.
🔹 Курс №5: "Flutter для дизайнеров: превратите макет в приложение"
Анонс:
Научитесь переводить Figma-макеты в рабочее Flutter-приложение. Курс ориентирован на UI/UX специалистов и фронтенд-разработчиков.
🔹 Курс №6: "Быстрый старт в Flutter: 7 дней до первого MVP"
Анонс:
Интенсив для тех, кто хочет за неделю освоить основы Flutter и создать минимально жизнеспособный продукт.
🔹 Курс №7: "Flutter. Базовая подготовка разработчика"
Анонс:
Курс для новичков в мобильной разработке. Изучите Flutter и Dart, научитесь работать с API и создавать адаптивный интерфейс.
🔹 Курс №8: "Flutter Essentials: ключевые навыки для Junior-разработчика"
Анонс:
Освойте ключевые навыки Flutter: навигация, формы, работа с HTTP, управление состоянием, тестирование и отладка.
🔹 Курс №9: "Flutter: от теории к практике"
Анонс:
Курс сочетает теоретические знания и практические задания. Научитесь применять Flutter в реальных задачах.
🔹 Курс №10: "Flutter для школьников и студентов"
Анонс:
Простой и понятный курс для юных разработчиков и студентов. Основы программирования + Flutter = первый мобильный проект.
🔹 Курс №11: "Flutter. Введение в кроссплатформенную разработку"
Анонс:
Погрузитесь в мир Flutter и изучите, как создавать приложения под Android, iOS и веб с одним кодом.
🔹 Курс №12: "Flutter для начинающих: мобильная разработка без страха"
Анонс:
Простой и доступный путь в профессию. Освойте Flutter без глубоких знаний программирования.
🔹 Курс №13: "Flutter Junior: первый шаг в IT"
Анонс:
Стартовый курс для будущих Flutter-разработчиков. Программа охватывает все базовые темы для трудоустройства.
🔹 Курс №14: "Flutter: создание приложений от А до Я"
Анонс:
От установки Flutter до публикации приложения в App Store и Google Play. Полное руководство для новичков.
🔹 Курс №15: "Flutter: практика на каждый день"
Анонс:
Курс, в котором вы будете решать типовые задачи, с которыми сталкивается разработчик в повседневной работе.
🔹 Курс №16: "Flutter. Быстрое освоение для фриланса"
Анонс:
Подготовьтесь к заказам на биржах фриланса. Научитесь реализовывать стандартные экраны, формы, списки и интеграцию с API.
🔹 Курс №17: "Flutter. Базовый уровень: от новичка до Junior"
Анонс:
Интенсивное обучение основам Flutter, необходимым для первого проекта или работы в команде.
🔹 Курс №18: "Flutter. Практическая разработка мобильных приложений"
Анонс:
Реальные кейсы, практические задания и проектная работа. Научитесь строить приложения, которые можно добавить в портфолио.
🔹 Курс №19: "Flutter. Стартовая линия: карьерный рывок"
Анонс:
Курс для тех, кто хочет начать карьеру в IT с Flutter. Получите навыки, востребованные на рынке труда.
🔹 Курс №20: "Flutter. Основы для самостоятельного старта"
Анонс:
Обучение, которое поможет вам начать разрабатывать приложения самостоятельно — без преподавателя и дедлайнов.
🔹 Курс №21: "Flutter. Быстрая разработка MVP"
Анонс:
Научитесь создавать минимально жизнеспособные продукты за короткое время. Идеально для стартаперов и продуктовых команд.
🔹 Курс №22: "Flutter. От идеи до приложения"
Анонс:
Как превратить идею в работающее приложение? Этот курс научит вас всему: от дизайна до публикации в сторах.
🔹 Курс №23: "Flutter. Основы кроссплатформенной разработки"
Анонс:
Узнайте, как использовать один язык и одну логику для создания приложений под несколько платформ.
🔹 Курс №24: "Flutter. Первые шаги: введение в мобильную разработку"
Анонс:
Идеальный курс для новичков, желающих попробовать себя в мобильной разработке без сложных теорий и лишней нагрузки.
🔹 Курс №25: "Flutter. Начальный уровень: учимся, практикуемся, развиваем"
Анонс:
Сбалансированный курс с акцентом на развитие практических навыков. Теория + практика + обратная связь.
Нет элементов для просмотра