Руководство (EN, 4 мин) как использовать Jetpack Compose Navigation и Dagger 2 с отложенной (ленивой) инициализацией модулей
#compose #dagger #navigation
#compose #dagger #navigation
Подробности в новой странице документации
#dagger @android_broadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Dagger 2.49 в котором продолжают работу над поддержкой KSP. Теперь dagger.android научили работать с KSP, хоть он и deprecated, но какие-то проекты его могут использовать и для миграции на KSP надо чтоб все части Dagger поддерживали новый инструмент для генерации кода.
#dagger
#dagger
Вышел Dagger 2.50
👉 Готовятся к поддержке
👉 Значение флага
#dagger
👉 Готовятся к поддержке
jakarta.inject.Provider
👉 Значение флага
-Adagger.explicitBindingConflictsWithInject
теперь выступленое в enabled по умолчанию#dagger
Обновление Android Jetpack:
🎉 Hilt 1.2.0 - добавлена поддержка Assited Inject в
🎉 Test Uiautomator 2.3.0 - поддержка множества дисплеев, новые селекторы, кастомные Condition позволят реализовать собственные условия ожидания
👉 Benchmark 1.3.0-alpha01 - множество улучшений и исправления багов
👉 Lifecycle 2.8.0-alpha02 - ViewModel переписалин на Kotlin, Lifecycle API стало мультиплатформенным, новые API
👉 Lint 1.0.0-alpha01 - Lint проверки для авторов Gradle плагинов
Больше подробностей тут
#jetpack #jetpackupdate #dagger #hilt
🎉 Hilt 1.2.0 - добавлена поддержка Assited Inject в
hiltViewModel()
and hiltNavGraphViewModels()
🎉 Test Uiautomator 2.3.0 - поддержка множества дисплеев, новые селекторы, кастомные Condition позволят реализовать собственные условия ожидания
👉 Benchmark 1.3.0-alpha01 - множество улучшений и исправления багов
👉 Lifecycle 2.8.0-alpha02 - ViewModel переписалин на Kotlin, Lifecycle API стало мультиплатформенным, новые API
dropUnlessResumed()
и dropUnlessStarted()
👉 Lint 1.0.0-alpha01 - Lint проверки для авторов Gradle плагинов
Больше подробностей тут
#jetpack #jetpackupdate #dagger #hilt
В Hilt 1.2.0 теперь можно делать такое c ViewModel
Для тех кто не знаком с Assisted Injection читайте документацию Dagger
#hilt #di #dagger
Для тех кто не знаком с Assisted Injection читайте документацию Dagger
#hilt #di #dagger
Вышел Dagger 2.51:
👉
👉 Новая фича позволит корректно делать обфускацию ViewModel с аннотацией
👉 Аннотация @SkipTestInjection для пропуска инжекта в Hilt Android тестах
🛠 Исправление багов
#dagger
👉
@LazyClassKey
- аннотация с поддержкой использования классов в Map Key, но в отличие от @ClassKey
класс будет загружаться отложено👉 Новая фича позволит корректно делать обфускацию ViewModel с аннотацией
@HiltViewModel
👉 Аннотация @SkipTestInjection для пропуска инжекта в Hilt Android тестах
🛠 Исправление багов
#dagger
Статья (3м) с описанием как упростить inject параметров с помощью библиотеки автора Anvil Utils
#anvil #dagger #di
#anvil #dagger #di
Передача данных между фрагментом и BottomSheetDialogFragment с использованием Dagger и Navigation Component (2м) - статья с рецептом с упором на код
#fragment #dagger #jetpack #di
#fragment #dagger #jetpack #di
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
Автор 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
Вышел 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
Вышел Dagger 2.54
Релиз который мы заслужили - переделки и багфиксы. Зачем вообще обновлять Dagger я не понимаю 😞
#dagger #di
Релиз который мы заслужили - переделки и багфиксы. Зачем вообще обновлять Dagger я не понимаю 😞
#dagger #di
🤯 Не нужно делать инжект всех зависимостей в конструктор
Встретил код в проекте:
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 #лучшиепрактики
В статье рассказывается в чем сложность с обработкой одноразовых событий, которые надо передать из ViewModel в UI.
Автор рассматривает способ через callback интерфейс в конструкторе ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
// inject the interface
private val toastMessages: ToastMessages,
) : ViewModel() {
fun doSomething() {
viewModelScope.launch {
try {
// execute async operation here
} catch (e: CustomException) {
// initiate a one-off event
toastMessages.showToast(e.localizedMessage)
}
}
}
}
🔗 Альтернативная ссылка на статью
#android #viewmodel #dagger #hilt
Please open Telegram to view this post
VIEW IN TELEGRAM
Как найти неиспользуемые зависимости в 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