В предыдущих главах мы изучали отдельные аспекты Flutter: компоненты, виджеты, работу с данными и Сетью и другие. Но до сих пор мы рассматривали их как отдельные темы, не затрагивая вопрос о том, как всё это должно объединяться в единое целое. Пришло время поговорить об архитектуре приложений
— том фундаменте, на котором строится качественный и поддерживаемый код.
Архитектура приложения — это не просто распределение файлов по папкам, а система принципов организации кода. Правильно выбранная архитектура призвана решать практические задачи: облегчить тестирование, упростить расширение функциональности, сделать код понятным для всех участников команды и снизить вероятность внесения регрессий при обновлениях.
У Flutter, как и у любой другой технологии, есть свои особенности, которые влияют на выбор архитектурных решений. Реактивный подход к обновлению UI, устройство фреймворка, структуры виджетов и их обновления — всё это создаёт уникальный контекст для архитектурных решений. Именно поэтому недостаточно просто перенести архитектурные паттерны из веб-разработки или нативного Android/iOS.
Экосистема Flutter развивается, и вместе с ней эволюционируют способы построения архитектуры — адаптируются уже известные подходы и появляются новые решения, заточенные именно под Flutter. В этой главе мы рассмотрим основные архитектурные концепции, применимые к Flutter-разработке:
-
Основы Clean Architecture: базовый подход, разбиение на слои data — domain — presentation.
-
Организацию файловой структуры проекта: «сперва слои» и «сперва фичи».
-
Принцип инверсии управления и связывание зависимостей.
-
Разновидности инверсии управления: ServiceLocator, Dependency Injection, Scopes.
-
Связывание зависимостей: стандартными средствами Flutter, а также с помощью библиотек Provider, GetIt и Injectable.
-
Управление состоянием в приложении: зачем это делать и как применять библиотеки Bloc и Redux.
-
Архитектурные фреймворки — их особенности и ограничения
Прежде чем перейти к первому параграфу, хотим заострить ваше внимание на нескольких важных вещах.
-
Во-первых, тему архитектуры невозможно покрыть одним исчерпывающим гайдом или главой. Поэтому мы в первую очередь стараемся охватить эту тему «вширь»: расставить акценты на важных принципах и обозначить широкий спектр доступных инструментов, не фиксируя единственно верные подходы или библиотеки.
-
Во-вторых, чтобы научиться проектировать хорошие архитектурные решения, недостаточно теории. Вам потребуется практика. Потому что хорошая архитектура — это не та, которая следует всем модным трендам, а та, которая решает конкретные проблемы вашего приложения и команды. И роль этой главы — обратить ваше внимание на важные аспекты, которые помогут вам укрепить теорию и покажут, как применять знания на практике.
А теперь давайте приступим.