Ask me anything
Ithy Logo
Sign in to save

Откройте для себя современные Android-репозитории: MVI, Compose, Hilt и многомодульность

Ваш гид по Kotlin-проектам с передовой архитектурой, включая Compose Destinations, без KMP.

android-kotlin-mvi-compose-multimodule-qgyt21v2

В современной Android-разработке выбор правильной архитектуры и стека технологий играет решающую роль. Вы ищете Kotlin-проекты, которые не только используют многомодульный подход (с разделением на app, feature и core модули), но и в своих feature-модулях применяют паттерн MVI (Model-View-Intent), декларативный UI фреймворк Jetpack Compose, библиотеку Compose Destinations для навигации и Hilt для внедрения зависимостей, при этом не являясь Kotlin Multiplatform (KMP) проектами. Найти репозитории, идеально соответствующие всем этим критериям, может быть непросто, особенно с явным использованием Compose Destinations. Однако существует множество проектов, которые либо близки к этому, либо служат отличной основой для интеграции недостающих компонентов.

Ключевые моменты

  • Многомодульная архитектура (app, feature, core) способствует лучшей организации кода, повышает его переиспользуемость, ускоряет время сборки и облегчает параллельную разработку командами.
  • Сочетание MVI для управления состоянием, Jetpack Compose для создания пользовательского интерфейса и Hilt для внедрения зависимостей является мощным и современным стеком для создания масштабируемых и тестируемых Android-приложений.
  • Compose Destinations — это популярная библиотека, которая упрощает навигацию в Jetpack Compose, делая ее типобезопасной и сокращая количество шаблонного кода. Не все проекты могут явно ее использовать, но многие из них легко адаптируются для ее интеграции.
  • Все рассматриваемые проекты ориентированы исключительно на Android и написаны на Kotlin, без использования Kotlin Multiplatform.

Рекомендуемые репозитории GitHub

Хотя найти 10 репозиториев, идеально и явно соответствующих каждому вашему критерию (особенно наличию Compose Destinations "из коробки" во всех), является сложной задачей, ниже представлен список проектов, которые либо максимально близки к вашему запросу, либо служат превосходной отправной точкой. Они демонстрируют многомодульность, MVI, Compose и Hilt. Во многих случаях Compose Destinations можно интегрировать с минимальными усилиями.

1. kib-sources/odc-android-app

Этот репозиторий представляет собой многомодульный проект с более чем 20 модулями, включая app, 14 core-модулей и 6 feature-модулей. Используется архитектура MVI (а также MVVM), Hilt для внедрения зависимостей, Jetpack Compose и Material 3. Проект отличается четким разделением модулей и использованием собственных Gradle Convention Plugins. Хотя Compose Destinations в явном виде не указан, проект современный и поддерживает продвинутые подходы к навигации в Compose.

Перейти к репозиторию kib-sources/odc-android-app

2. basaransuleyman/Multi-Module-Clean-Architecture-Android-Kotlin

Данный проект явно демонстрирует многомодульную архитектуру (с модулями типа app, feature и core), принципы Clean Architecture, паттерн MVI (наряду с MVVM), Jetpack Compose для UI и Hilt для DI. Для навигации используется Navigation Component, который лежит в основе Compose Destinations, что делает интеграцию последней более простой.

Перейти к репозиторию basaransuleyman/Multi-Module-Clean-Architecture-Android-Kotlin

3. Atwa/MVI-Compose-Sample

Это пример Android-приложения, использующего MVI, Jetpack Compose, Coroutines, Retrofit, Hilt и Room. Проект имеет многомодульную структуру с разделением "по фичам" (package by feature), где есть модуль feature. Навигация реализована с использованием Navigation Component, что является хорошей базой для Compose Destinations.

Перейти к репозиторию Atwa/MVI-Compose-Sample

4. naeemdev/Jetpack-Compose-MVI-Architecture

Этот репозиторий фокусируется на демонстрации архитектуры MVI в связке с Jetpack Compose. Проекты такого типа часто реализуются с многомодульной структурой (app, feature, core) и используют Hilt для внедрения зависимостей. Для точного подтверждения наличия Compose Destinations и специфичной модульной структуры рекомендуется изучить исходный код репозитория.

Перейти к репозиторию naeemdev/Jetpack-Compose-MVI-Architecture

5. EduDev06/MVIComposeProject

Проект, который демонстрирует применение MVI с Jetpack Compose в рамках многомодульной архитектуры. Он включает разделение на feature и core модули и использует Hilt для управления зависимостями. Это отличная основа для дальнейшей кастомизации и добавления Compose Destinations для навигации.

Перейти к репозиторию EduDev06/MVIComposeProject

6. RivuChk/Jetpack-Compose-MVI-Demo

Это демонстрационное приложение, иллюстрирующее применение паттерна MVI и Jetpack Compose. Хотя изначально оно может не иметь строгой многомодульной структуры app, feature, core, его архитектура хорошо подходит для такой организации. В проекте используется Hilt. Интеграция Compose Destinations возможна для улучшения навигации.

Перейти к репозиторию RivuChk/Jetpack-Compose-MVI-Demo


Что если Compose Destinations не указан явно?

Многие качественные проекты, использующие MVI, Compose и Hilt в многомодульной среде, могут применять стандартную библиотеку Jetpack Compose Navigation. Compose Destinations создана для упрощения работы с ней, предлагая генерацию кода и типобезопасность. Если понравившийся вам репозиторий не использует Compose Destinations, его часто можно интегрировать:

  • Убедитесь, что проект использует Jetpack Compose Navigation.
  • Добавьте зависимости Compose Destinations и KSP (Kotlin Symbol Processing) плагин.
  • Аннотируйте ваши Composable-функции экранов с помощью @Destination.
  • Создайте навигационный граф с помощью @NavGraph или @RootNavGraph.

Официальный репозиторий raamcosta/compose-destinations и его документация являются лучшими источниками информации по интеграции.

Официальный репозиторий Compose Destinations

Официальная документация Compose Destinations


Визуализация архитектурных компонентов

Представленная ниже ментальная карта иллюстрирует ключевые компоненты и их взаимосвязи в запрашиваемой архитектуре Android-приложения. Она показывает, как многомодульность структурирует проект, и какие технологии используются в рамках feature-модулей.

mindmap root["Современная Android Архитектура на Kotlin"] id1["Многомодульность"] id1_1["app (Основной модуль приложения)"] id1_2["feature (Функциональные модули)"] id1_2_1["MVI (Model-View-Intent)"] id1_2_2["Jetpack Compose (Пользовательский интерфейс)"] id1_2_3["Compose Destinations (Навигация)"] id1_2_4["Hilt (Внедрение зависимостей)"] id1_3["core (Общие модули: утилиты, базовые классы, DI)"] id2["Ключевые технологии"] id2_1["Kotlin (Язык программирования)"] id2_2["Android (Платформа, не KMP)"] id3["Преимущества"] id3_1["Масштабируемость"] id3_2["Тестируемость"] id3_3["Поддерживаемость"] id3_4["Разделение ответственностей"]

Ментальная карта современной Android-архитектуры.


Сравнение аспектов архитектуры

Радарная диаграмма ниже представляет собой обобщенное сравнение различных аспектов архитектуры для гипотетических типов проектов. Это помогает визуализировать, как различные проекты могут соответствовать идеальным критериям или какие области могут потребовать доработки. Оценки (от 1 до 5, где 5 – наилучший показатель) являются иллюстративными и основаны на общем понимании подобных архитектур.

Радарная диаграмма, сравнивающая ключевые архитектурные аспекты.


Глубже в Навигацию с Compose Destinations

Библиотека Compose Destinations значительно упрощает реализацию навигации в Jetpack Compose. Она использует аннотации и кодогенерацию (через KSP) для создания типобезопасных навигационных путей, устраняя необходимость в ручном определении строк маршрутов и обработке аргументов. Это особенно полезно в многомодульных проектах, где навигация между различными feature-модулями может стать сложной. Встроенное видео ниже подробно рассказывает об использовании Compose Destinations.

Видеоурок по использованию Compose Destinations для навигации в Jetpack Compose.


Преимущества выбранного стека технологий

Выбор многомодульной архитектуры в сочетании с MVI, Jetpack Compose, Compose Destinations и Hilt предоставляет разработчикам мощный инструментарий для создания современных, поддерживаемых и масштабируемых Android-приложений. Каждый компонент этого стека вносит свой вклад в общую эффективность и качество разработки.

Пример графа зависимостей в многомодульном проекте

Пример графа зависимостей, иллюстрирующий связи между модулями в многомодульном Android-приложении.

В таблице ниже представлено краткое описание каждой технологии и ее преимуществ в контексте данного архитектурного стека.

Технология / Принцип Описание Преимущества в данном стеке
Многомодульность (app, feature, core) Разделение проекта на независимые, но связанные модули, каждый из которых отвечает за определенную функциональность или слой. Улучшенная организация и структура кода, повышение переиспользуемости компонентов, сокращение времени сборки за счет компиляции только измененных модулей, возможность параллельной разработки.
MVI (Model-View-Intent) Архитектурный паттерн, основанный на однонаправленном потоке данных (unidirectional data flow) и неизменяемом состоянии (immutable state). Обеспечивает предсказуемое управление состоянием, упрощает отладку, повышает тестируемость логики представления и бизнес-логики, четко разделяет ответственности.
Jetpack Compose Современный декларативный UI-фреймворк от Google для создания нативных пользовательских интерфейсов Android. Ускоряет и упрощает разработку UI, требует меньше шаблонного кода по сравнению с XML, предоставляет мощные возможности для создания кастомных и анимированных интерфейсов, отлично интегрируется с Kotlin.
Compose Destinations Библиотека, упрощающая навигацию в Jetpack Compose за счет использования аннотаций и кодогенерации KSP. Обеспечивает типобезопасную навигацию, автоматически генерирует навигационный код, упрощает передачу аргументов между экранами, сокращает количество boilerplate-кода для навигации.
Hilt Библиотека для внедрения зависимостей (Dependency Injection) для Android, построенная на основе Dagger. Упрощает настройку и использование DI в Android-проектах, легко интегрируется с компонентами Jetpack (например, ViewModel), сокращает объем шаблонного кода для DI, улучшает тестируемость.

Часто задаваемые вопросы (FAQ)

В чем заключаются преимущества многомодульной архитектуры (app, feature, core)?

Многомодульная архитектура предлагает несколько ключевых преимуществ:

  • Улучшенная организация: Код разделен на логические блоки, что облегчает понимание и навигацию по проекту.
  • Масштабируемость: Легче добавлять новые функции (feature-модули) или изменять существующие, не затрагивая другие части приложения.
  • Переиспользуемость кода: Общие компоненты и логика (в core или общих feature модулях) могут использоваться в различных частях приложения.
  • Сокращение времени сборки: Gradle может кэшировать и пересобирать только измененные модули, что ускоряет инкрементальные сборки.
  • Независимая разработка и тестирование: Команды могут работать над разными модулями параллельно, а модули можно тестировать изолированно.
  • Инкапсуляция: Четкие границы между модулями помогают скрыть детали реализации и предоставлять только необходимые API.
Почему стоит использовать архитектурный паттерн MVI в связке с Jetpack Compose?

MVI (Model-View-Intent) хорошо сочетается с декларативной природой Jetpack Compose:

  • Однонаправленный поток данных: MVI обеспечивает предсказуемый поток данных (события от View к Intent, обработка в Model/ViewModel, обновление состояния, рендеринг View). Это упрощает отладку и понимание логики обновления UI.
  • Неизменяемое состояние (Immutable State): Состояние в MVI обычно неизменяемо. Compose эффективно работает с неизменяемыми данными, перерисовывая только те части UI, которые зависят от изменившегося состояния.
  • Четкое разделение ответственностей: MVI помогает разделить логику представления, бизнес-логику и UI, что улучшает тестируемость каждого компонента.
  • Управление сложными состояниями: MVI хорошо подходит для управления сложными состояниями UI, особенно когда есть множество пользовательских взаимодействий и асинхронных операций.
  • Реактивность: Использование потоков данных (например, Kotlin Flow или RxJava) в MVI естественным образом интегрируется с реактивной моделью Compose.
Что такое Compose Destinations и какие проблемы он решает в навигации?

Compose Destinations — это библиотека для Jetpack Compose, которая упрощает реализацию навигации. Она работает поверх стандартной библиотеки Navigation Compose, но предлагает ряд улучшений:

  • Типобезопасность: Генерирует типобезопасные функции для навигации и передачи аргументов, что снижает вероятность ошибок во время выполнения из-за неправильных маршрутов или типов аргументов.
  • Кодогенерация: Использует KSP (Kotlin Symbol Processing) для генерации навигационного кода на основе аннотаций (@Destination, @NavGraph), что уменьшает количество шаблонного кода, который пришлось бы писать вручную.
  • Упрощенная передача аргументов: Делает передачу сложных объектов в качестве аргументов навигации более простой и безопасной.
  • Улучшенная читаемость: Навигационная логика становится более декларативной и легкой для понимания.
  • Поддержка вложенной навигации и диалогов: Предоставляет удобные средства для работы со сложными навигационными графами.

Основная проблема, которую решает Compose Destinations, — это снижение сложности и количества ошибок при работе с навигацией в Compose, особенно в крупных и многомодульных проектах.

Какую роль играет Hilt в проектах с такой архитектурой?

Hilt — это библиотека для внедрения зависимостей (Dependency Injection, DI) для Android, построенная на основе Dagger. В проектах с многомодульной архитектурой, MVI и Compose, Hilt играет ключевую роль:

  • Упрощение DI: Hilt значительно упрощает настройку и использование DI по сравнению с Dagger, предоставляя стандартные компоненты и аннотации для Android-классов (например, @HiltViewModel, @AndroidEntryPoint).
  • Интеграция с Jetpack: Легко интегрируется с компонентами Jetpack, такими как ViewModel, что важно для MVI, где ViewModel часто содержит логику управления состоянием.
  • Поддержка многомодульности: Hilt хорошо работает в многомодульных проектах, позволяя определять зависимости в одних модулях (например, `core` или `data`) и внедрять их в другие (например, `feature` модули).
  • Улучшение тестируемости: DI упрощает замену реальных зависимостей на тестовые двойники (mock-объекты) при написании юнит-тестов и интеграционных тестов.
  • Сокращение шаблонного кода: Hilt автоматизирует большую часть кода, необходимого для DI, позволяя разработчикам сосредоточиться на бизнес-логике.
Можно ли легко интегрировать Compose Destinations в проект, если он изначально использует стандартную Jetpack Compose Navigation?

Да, интеграция Compose Destinations в проект, который уже использует стандартную Jetpack Compose Navigation, обычно проходит достаточно гладко, так как Compose Destinations работает поверх нее. Основные шаги включают:

  1. Добавление зависимостей: Подключите библиотеку Compose Destinations и плагин KSP (Kotlin Symbol Processing) в ваши `build.gradle` файлы.
  2. Аннотирование экранов: Замените ручное определение маршрутов аннотированием ваших Composable-функций экранов с помощью аннотации @Destination. Укажите маршрут, тип навигации (например, для диалогов), и аргументы.
  3. Создание навигационного графа: Определите навигационные графы с помощью аннотаций @NavGraph или @RootNavGraph на Composable-функции, которая будет содержать ваш `NavHost` (или его аналог от Compose Destinations).
  4. Обновление вызовов навигации: Замените вызовы `navController.navigate("route/argument")` на типобезопасные вызовы, сгенерированные Compose Destinations (например, `navigator.navigate(ProfileScreenDestination(userId = 123))`).
  5. Удаление старого кода: После миграции можно удалить старый код, связанный с ручным определением маршрутов и обработкой аргументов.

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


Рекомендуемые запросы для дальнейшего изучения


Источники

composedestinations.rafaelcosta.xyz
Compose Destinations Documentation - Rafael Costa

Last updated May 19, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI