Skip to content

ruinalsu/onboarding_rick_and_morty

Repository files navigation

Шаблон

Шаблон для инициализации проекта в Surf.

Требования

Версия flutter >= 2.5.0

Инициализация

При инициализации проекта нужно:

  1. Найти по поиску rick_and_morty и в нужных местах заменить на название вашего проекта.
  2. Проинициализировать 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
        • widgets
    • utils
  • scripts
  • test
  • tools

assets

Содержит необходимые ресурсы(картинки, шрифты, иконки).

lib - кодовая часть проекта, в ней есть такие папки как:

  • api - слой данных и взаимодействия с Rest API. В ней находятся файлы сгенерированные при помощи SurfGen.
  • assets - строковое представление необходимых ресурсов, темы, цвета, строки.
  • config - конфигурации проекта, например окружение(environment).
  • features - фичи используемые или реализуемые в проекте. В ней создаются папки с названиями фич, в которых находятся все, что к этой фиче относится. В папке common находятся сущности расшаренные между несколькими фичами или нужные всему приложению, старайтесь избегать добавления туда файлов без четкой необходимости, добавляйте в нее файлы только тогда, когда это действительно нужно. Структура фич:
    • di - контейнеры внедрения зависимостей.
    • domain - содержит:
      • entity - бизнес модели данных.
      • repository - репозитории, относящиеся к фиче.
      • mappers - мапперы данные-модель и обратно.
    • service - бизнес логика.
    • screens - экраны, относящиеся к фиче, каждый экран добавляется в отдельную папку с названием экрана, в которой отдельными файлами лежат:
      • widget - ElementaryWidget.
      • wm - WidgetModel.
      • model - ElementaryModel.
    • widgets - виджеты, относящиеся к фиче.
  • utils - необходимые утилиты.

scripts

Скрипты, необходимые для сборки артефакта проекта. Часть скриптов уже добавлена.

test

Тесты приложения.

tools

Скрипты и туллинг для разработки(например, api_generator).

Аналитика

Подключены:

Архитектура

Используем архитектуру выстроенную вокруг Elementary. Экраны, а так же части интерфейса с собственной логикой описываются по принципу mvvm-паттерна. Несмотря на возможность реализации бизнес логики непосредственно в модели, модель оставляем лишь как первую точку доступа к бизнес-логики, саму же бизнес-логику реализуем в сервисах. При необходимости использования менеджера состояния на уровне сервисов можем реализовать и использовать надежные подходы - BLoC или Redux.

Навигация

Навигация выстроена вокруг использования пакета AutoRoute. Для глобальной навигации по приложению используются класс AppRouter и для вложенной - StackRouter. Несмотря на то что возможно обращение к StackRouter напрямую по контексту внутри WidgetModel, следует в явном виде передавать его в конструктор WidgetModel. Использование StackRouter из контекста позволяет получать актуальный стек навигации и управлять им рамках данного роутера. В свою очередь, AppRouter хранится в AppScope зависимостях и достается оттуда.

ApiGen

По умолчанию используем SurfGen.

Руководство по инициализации SurfGen на проекте(часть пунктов уже сделаны, проверьте их актуальность и соберите исполняемый файл(пункт 4)).

Руководство по использованию SurfGen на проекте.

DI

В качестве DI используем Provider.

Зависимости группируются в сущности-контейнеры с интерфейсом, описывающим набор поставляемых зависимостей. Эта сущность поставляется функционалу при помощи виджета DiScope, в который оборачивается соответствующий функционал.

Например, AppScope - базовая сущность всего приложения, которая содержит зависимости, живущие все время, все приложение мы оборачиваем в DiScope и передаем фабрику возвращающую AppScope.

Если какому-то функционалу нужны зависимости, требующиеся только ему, они выносятся в отдельную сущность, которая будет оборачивать этот функционал.

Примеры реализации

Пример использования шаблона с навигацией