Разбор(9м) как под капотом работает Dagger, Koin, Hilt и как написать свой простой DI
#di #underthehood
#di #underthehood
❤21👍9👎6🔥5
С выходом новой версии Koin хочу напомнить вам про его боли и проблемы, которые он несет за собой. Смотрите видео
Telegram
Android Broadcast
📱 За что я ненавижу Koin или чего стоит избегать при его использовании (12 мин)
Я использую Koin еще с самой первой версии, он неплохо справляется с небольшими проектами, но дальше требует работы как самурай. В видео для патронов рассказываю, что не так…
Я использую Koin еще с самой первой версии, он неплохо справляется с небольшими проектами, но дальше требует работы как самурай. В видео для патронов рассказываю, что не так…
👍10 7
Media is too big
VIEW IN TELEGRAM
Обзор библиотеки Kotlin Inject - DI для KMP, API которого аналогично Dagger. В видео происходит демонстрация возможностей, сравнение с другими DI и личное мнение о том стоит ли использовать эту библиотеку в проде.
Видео доступно платным подписчикам на Boosty и через Tribute бота в Telegram
#видео #kmp #dagger #di #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍6 5
Forwarded from Kotlin Multiplatform Broadcast
Вышел Koin Annotations 1.4.0 Stable
👉 Создание модулей на старте
👉 Поддержка WASM
👉 Поддержка Qualifier
👉 Поддержка object модулей
👉 Сканирование множества модулей для поиска объявление зависимостей
👉 Обновили документацию для KMP
👉 Улучшили валидацию объявлений во время компиляции
👉 Рефакторинг кодогенерации для KMP проектов для решения багов и улучшения скорости работы
#koin #di #wasm
👉 Создание модулей на старте
👉 Поддержка WASM
👉 Поддержка Qualifier
👉 Поддержка object модулей
👉 Сканирование множества модулей для поиска объявление зависимостей
👉 Обновили документацию для KMP
👉 Улучшили валидацию объявлений во время компиляции
👉 Рефакторинг кодогенерации для KMP проектов для решения багов и улучшения скорости работы
#koin #di #wasm
👍15❤1
Автор Koin поделился результатами замерами скорости работы Koin и Hilt. Для этого взяли оригинальную версию приложения Now In Android и собственную с миграцией на Koin.
Тест делался через простой замер времени от и до, автор намеренно отказался от Jetpack Benchmark, который обеспечивает прогрев и стабильность результатов. Такой подход у меня вызывает вопросы. Мне также было бы интересно увидеть замеры после оптимизации кода через R8
Результаты на картинке, подробности в статье, а дальше уже всё решать вам.
UPD В комментариях уже накопали как выкрутили замеры в пользу Koin
#di #koin #dagger #benchmark
Тест делался через простой замер времени от и до, автор намеренно отказался от Jetpack Benchmark, который обеспечивает прогрев и стабильность результатов. Такой подход у меня вызывает вопросы. Мне также было бы интересно увидеть замеры после оптимизации кода через R8
Результаты на картинке, подробности в статье, а дальше уже всё решать вам.
UPD В комментариях уже накопали как выкрутили замеры в пользу Koin
#di #koin #dagger #benchmark
👍19 2
Вышел Dagger 2.53 c breaking changes для Kotlin
👉 Все
👉 Обязательно использование
👉
👉 Удалена поддержка Java 7
‼️ Ничего полезного в Dagger не добавляют уже давно, так что сидите на той версии что вас устраивает и работает.
#dagger #di
👉 Все
Binds
теперь потребуют объявления с nullable типами 👉 Обязательно использование
JvmSuppressWildcards
в Multibinding Map для generic типа значения👉
Binds
методы теперь не могут использовать Scope, когда они делегирует @Produces имплементации👉 Удалена поддержка Java 7
‼️ Ничего полезного в Dagger не добавляют уже давно, так что сидите на той версии что вас устраивает и работает.
#dagger #di
👍14🔥11🤯6 2
В этом видео я собрал самые горячие новости и интересные события в мире Android
#AndroidBroadcast #Android #Kotlin #JetpackViewModel #Compose #DI #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17 10❤3🔥2🤯2
Вышел Dagger 2.54
Релиз который мы заслужили - переделки и багфиксы. Зачем вообще обновлять Dagger я не понимаю 😞
#dagger #di
Релиз который мы заслужили - переделки и багфиксы. Зачем вообще обновлять Dagger я не понимаю 😞
#dagger #di
🤯15👍8
🚀 Ускорение загрузки Koin при запуске Android приложения (EN,8м)
В Koin 4 добавили интеграцию с Jetpack Startup для запуска инициализации Koin
и доступна инициализация фича модулей
Также показывается отложення загрузка модулей с помощью корутин
Подробнее про ленивые модули и фоновую загрузку в документации
#android #koin #di #jetpack #производительность #coroutines #AndroidBroadcast #БазаЗнаний
В Koin 4 добавили интеграцию с Jetpack Startup для запуска инициализации Koin
class MainApplication : Application(), KoinStartup {
override fun onKoinStartup(): KoinAppDeclaration = {
androidContext(this@MainApplication)
allowOverride(false)
modules(AppModule().module)
defaultModule()
}
}
и доступна инициализация фича модулей
// Initializer из Jetpack Startup
class FirstModuleInitializer : Initializer<Unit> {
override fun create(context: Context) {
loadKoinModules(firstModule)
}
override fun dependencies() =
mutableListOf(KoinInitializer::class.java)
}
Также показывается отложення загрузка модулей с помощью корутин
val m1 = lazyModule {
singleOf(::ClassA) { bind<IClassA>() }
}
startKoin {
// загрузка модулей в фоне с помощью Kotlin Coroutines
lazyModules(m1)
}
val koin = KoinPlatform.getKoin()
// Ожидания выполнения задач загрузки модулей
koin.waitAllStartJobs()
// или ставим в очередь лямбду на выполнение после
koin.runOnKoinStarted { koin ->
// Код выполнится после загрузки lazy modules
}
Подробнее про ленивые модули и фоновую загрузку в документации
#android #koin #di #jetpack #производительность #coroutines #AndroidBroadcast #БазаЗнаний
1👍26🔥8 3❤2
🤯 Не нужно делать инжект всех зависимостей в конструктор
Встретил код в проекте:
sendDataUseCase не нужен сразу при создании объекта, а нужен только если пользователь нажмёт на кнопку "Send" в UI, что может и не произойти. Так как эта зависимость нужна в конструкторе, то при получении в DI будет сразу происходить создание этой зависимости, что приводит к ненужной нагрузке.
Я рекомендую делать отложенное получение зависимостей с помощью механизма Provider или Lazy. Первый будет ходить за зависимостью в граф каждый раз, а второй - при первом обращении и сохранит её.
Если вы используете Koin на момент написания поста (актуальная версия 4.0), делать отложенный инжект в конструктор возможности нет:
Результат оптимизации
✅ более быстрый старт экранов (зависит от сложности графов)
✅ уменьшение расхода памяти
❌ KOIN потеря явной зависимости в конструкторе. Мне бы очень хотелось увидеть аналог Provider и Lazy в Koin через конструктор, но пока приходится делать свои обертки 😔
#dagger #di #лучшиепрактики
Встретил код в проекте:
class MyViewModel(
...
private val sendDataUseCase: SendDataUseCase,
...
): ViewModel() {
// Вызывается, когда пользователь в UI нажмёт на "Send"
fun onSendClicked(...) {
viewModelScope.launch {
sendDataUseCase.invoke(...) // либо sendDataUseCase(...)
}
}
}
sendDataUseCase не нужен сразу при создании объекта, а нужен только если пользователь нажмёт на кнопку "Send" в UI, что может и не произойти. Так как эта зависимость нужна в конструкторе, то при получении в DI будет сразу происходить создание этой зависимости, что приводит к ненужной нагрузке.
Я рекомендую делать отложенное получение зависимостей с помощью механизма Provider или Lazy. Первый будет ходить за зависимостью в граф каждый раз, а второй - при первом обращении и сохранит её.
// При использовании Dagger или Hilt
class MyViewModel(
...
private val sendDataUseCase: javax.inject.Provider<SendDataUseCase>, // или dagger.Lazy
...
): ViewModel() {
fun onSendClicked(...) {
viewModelScope.launch {
sendDataUseCase.get()
.invoke(...)
}
}
}
Если вы используете Koin на момент написания поста (актуальная версия 4.0), делать отложенный инжект в конструктор возможности нет:
// При использовании Koin
class MyViewModel(): ViewModel() {
// отложенное получение зависимости в Koin
private val sendDataUseCase: SendDataUseCase by inject()
fun onSendClicked(...) {
viewModelScope.launch {
// аналог Provider - получение зависимости каждый раз из графа
val sendDataUseCase: SendDataUseCase = getKoin().get()
sendDataUseCase.invoke(...)
}
}
}
Результат оптимизации
✅ более быстрый старт экранов (зависит от сложности графов)
✅ уменьшение расхода памяти
❌ KOIN потеря явной зависимости в конструкторе. Мне бы очень хотелось увидеть аналог Provider и Lazy в Koin через конструктор, но пока приходится делать свои обертки 😔
#dagger #di #лучшиепрактики
🔥64👍21❤4
Forwarded from Kotlin Multiplatform Broadcast
Koin Annotations — надстройка над Koin для описания зависимостей с помощью аннотаций и последующей генерации части графа для них.
Что нового в движке:
👉 Совместимость с KSP2
👉 Улучшена работа компилятора DI кода
👉 Улучшена генерация кода
👉 Полноценная поддержка KMP проектов
👉 Шаринг описаний зависимостей между модулями проектов
👉 Работает с Koin 4.0, Kotlin 2.0.21 и KSP 2.0.21-1.0.28
Новые фичи для разработчиков:
👉 Создание собственных аннотаций квалификаторов
👉 Автоматические биндинги
👉 ComponentScan работает сквозь Gradle модули
👉 Аннотации над ViewModel (работает с Jetpack и KMP)
@KoinViewModel
class MyViewModel(deps: Deps): ViewModel()
Ссылка без VPN
#kotlin #kmp #di #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👎7👍5❤1
Сравнение Dagger 2, Dagger Hilt и Koin (4м)
Быстрый рассказ про популярные DI для Android. Полезно тем, кто выбирает свой первый DI или сомневается в выборе
#android #di
Быстрый рассказ про популярные DI для Android. Полезно тем, кто выбирает свой первый DI или сомневается в выборе
#android #di
👍51👎12🎉3
Media is too big
VIEW IN TELEGRAM
Обзор библиотеки Kotlin Inject - DI для KMP, API которого аналогично Dagger. В видео происходит демонстрация возможностей, сравнение с другими DI и личное мнение о том стоит ли использовать эту библиотеку в проде.
#видео #kmp #di
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍31👎9
Вышел Dagger 2.56
В новой версии Dagger нет новых фичей, а вот то что может сломать код есть
👉 В рамках поддержки Jakarta: удалили старый способ создания Factory (возможно, отвалится код под старые версии Dagger) и больше нельзя использоваться dagger.internal.Provider
👉 В Kotlin исходниках при использовании для multibinding теперь НАДО использовать Set/MAP из kotlin.collections, а не версии из java.util
🛠 Исправили немного багов
#di #java
В новой версии Dagger нет новых фичей, а вот то что может сломать код есть
👉 В рамках поддержки Jakarta: удалили старый способ создания Factory (возможно, отвалится код под старые версии Dagger) и больше нельзя использоваться dagger.internal.Provider
👉 В Kotlin исходниках при использовании для multibinding теперь НАДО использовать Set/MAP из kotlin.collections, а не версии из java.util
🛠 Исправили немного багов
#di #java
👍15
Как найти неиспользуемые зависимости в Dagger Component (EN,11м)
С помощью Dagger SPI автор написал анализатор графа Dagger c целью поиска неиспользуемых зависимостей и описал подход в статье. Также подход можно использовать для визуализации графа зависимостей, считать разные метрики графа и пр.
🐱 Исходный код на GitHub
🔗 Альтернативная ссылка
#dagger #di #opensource
С помощью Dagger SPI автор написал анализатор графа Dagger c целью поиска неиспользуемых зависимостей и описал подход в статье. Также подход можно использовать для визуализации графа зависимостей, считать разные метрики графа и пр.
🔗 Альтернативная ссылка
#dagger #di #opensource
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍25
Forwarded from Kotlin Multiplatform Broadcast
Metro - Новый DI фреймворк на чистом Kotlin (ещё в разработке)
#kotlin #di #ksp
@DependencyGraph
interface AppGraph {
val httpClient: HttpClient
@Provides
private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}
@Inject
class HttpClient(private val fileSystem: FileSystem)
@Inject
@Composable
fun App(circuit: Circuit)
#kotlin #di #ksp
👍20
🤯 Вышел Dagger 2.57 и из полезных изменений там... НИЧЕГО. Просто работают под капотом. Может над поддержкой KSP, может еще над чем
Вам нужен Dagger?
#dagger #di
Вам нужен Dagger?
#dagger #di
🤔36👍14🤯5
🤯 Команда Anvil решила прекратить развитие проекта в пользу другого решения
Anvil - Kotlin плагина для расширения возможностей Dagger 2 и упрощения работы с ним решили прекратить развивать. Коллега автором решения сделал Metro и компания будет переходить на него и участвовать в его развитии.
#di #kmp
Anvil - Kotlin плагина для расширения возможностей Dagger 2 и упрощения работы с ним решили прекратить развивать. Коллега автором решения сделал Metro и компания будет переходить на него и участвовать в его развитии.
Metro - это compile-time DI фреймворк с поддержкой KMP, который вдохновлялся Dagger, Anvil, Kotlin-Inject.
#di #kmp
🏆27🤔14🔥3👍1