Шаблон для инициализации проекта в Surf.
Версия flutter >= 2.5.0
При инициализации проекта нужно:
- Найти по поиску rick_and_morty и в нужных местах заменить на название вашего проекта.
- Проинициализировать FirebaseCrashlytics(найти можно через TODO(init-project)).
- assets
- fonts
- icons
- images
- lib
- api
- data
- service
- {name}
- assets
- res
- themes
- colors
- strings
- config
- features
- {name/common}
- di
- domain
- entity
- repository
- mappers
- service
- screens
- {screen_name}
- widget
- wm
- model
- {screen_name}
- widgets
- {name/common}
- utils
- api
- scripts
- test
- tools
Содержит необходимые ресурсы(картинки, шрифты, иконки).
- api - слой данных и взаимодействия с Rest API. В ней находятся файлы сгенерированные при помощи SurfGen.
- assets - строковое представление необходимых ресурсов, темы, цвета, строки.
- config - конфигурации проекта, например окружение(environment).
- features - фичи используемые или реализуемые в проекте. В ней создаются папки с названиями
фич, в которых находятся все, что к этой фиче относится. В папке common находятся сущности расшаренные между несколькими фичами или нужные всему приложению,
старайтесь избегать добавления туда файлов без четкой необходимости, добавляйте в нее файлы
только тогда, когда это действительно нужно. Структура фич:
- di - контейнеры внедрения зависимостей.
- domain - содержит:
- entity - бизнес модели данных.
- repository - репозитории, относящиеся к фиче.
- mappers - мапперы данные-модель и обратно.
- service - бизнес логика.
- screens - экраны, относящиеся к фиче, каждый экран добавляется в отдельную папку с
названием экрана, в которой отдельными файлами лежат:
- widget - ElementaryWidget.
- wm - WidgetModel.
- model - ElementaryModel.
- widgets - виджеты, относящиеся к фиче.
- utils - необходимые утилиты.
Скрипты, необходимые для сборки артефакта проекта. Часть скриптов уже добавлена.
Тесты приложения.
Скрипты и туллинг для разработки(например, api_generator).
- flutter_surf_lint_rules
- dart_code_metrics (инструкция по сбору метрик проекта, настройка проекта уже выполнена)
Используем архитектуру выстроенную вокруг Elementary. Экраны, а так же части интерфейса с собственной логикой описываются по принципу mvvm-паттерна. Несмотря на возможность реализации бизнес логики непосредственно в модели, модель оставляем лишь как первую точку доступа к бизнес-логики, саму же бизнес-логику реализуем в сервисах. При необходимости использования менеджера состояния на уровне сервисов можем реализовать и использовать надежные подходы - BLoC или Redux.
Навигация выстроена вокруг использования пакета AutoRoute. Для глобальной навигации по приложению используются класс AppRouter и для вложенной - StackRouter. Несмотря на то что возможно обращение к StackRouter напрямую по контексту внутри WidgetModel, следует в явном виде передавать его в конструктор WidgetModel. Использование StackRouter из контекста позволяет получать актуальный стек навигации и управлять им рамках данного роутера. В свою очередь, AppRouter хранится в AppScope зависимостях и достается оттуда.
По умолчанию используем SurfGen.
Руководство по инициализации SurfGen на проекте(часть пунктов уже сделаны, проверьте их актуальность и соберите исполняемый файл(пункт 4)).
Руководство по использованию SurfGen на проекте.
В качестве DI используем Provider.
Зависимости группируются в сущности-контейнеры с интерфейсом, описывающим набор поставляемых зависимостей. Эта сущность поставляется функционалу при помощи виджета DiScope, в который оборачивается соответствующий функционал.
Например, AppScope - базовая сущность всего приложения, которая содержит зависимости, живущие все время, все приложение мы оборачиваем в DiScope и передаем фабрику возвращающую AppScope.
Если какому-то функционалу нужны зависимости, требующиеся только ему, они выносятся в отдельную сущность, которая будет оборачивать этот функционал.
Пример использования шаблона с навигацией