Android Broadcast
14.1K subscribers
3.47K photos
316 videos
11 files
5.78K links
Подборка новостей и статей для Android разработчиков.

Связь с автором @android_broadcast_bot
Реклама @android_broadcast_bot

РКН https://abdev.by/rkn_tg_ab
Download Telegram
Руководство (EN, 4 мин) как использовать Jetpack Compose Navigation и Dagger 2 с отложенной (ленивой) инициализацией модулей

#compose #dagger #navigation
❗️ Вышел Dagger 2.48 с поддержкой KSP. Пока в Альфа статусе

Подробности в новой странице документации

#dagger @android_broadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Dagger 2.49 в котором продолжают работу над поддержкой KSP. Теперь dagger.android научили работать с KSP, хоть он и deprecated, но какие-то проекты его могут использовать и для миграции на KSP надо чтоб все части Dagger поддерживали новый инструмент для генерации кода.

#dagger
Улучшения Hilt в Dagger 2.49
👉 сделали поддержку @AssitedInject в @HiltViewModel
👉 С помощью аннотации @ActivityRetainedSavedState можно получить SavedStateHandle из ActivityRetainedComponent

#dagger #hilt #jetpack
Вышел Dagger 2.50
👉 Готовятся к поддержке jakarta.inject.Provider 
👉 Значение флага -Adagger.explicitBindingConflictsWithInject теперь выступленое в enabled по умолчанию

#dagger
Обновление Android Jetpack:
🎉 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
Вышел Dagger 2.51:
👉 @LazyClassKey - аннотация с поддержкой использования классов в Map Key, но в отличие от @ClassKey класс будет загружаться отложено
👉 Новая фича позволит корректно делать обфускацию ViewModel с аннотацией @HiltViewModel
👉 Аннотация @SkipTestInjection для пропуска инжекта в Hilt Android тестах
🛠 Исправление багов

#dagger
Статья (3м) с описанием как упростить inject параметров с помощью библиотеки автора Anvil Utils

#anvil #dagger #di
Выпустили Anvil-KSP - форк Anvil, но работающий на основе KSP. Автор решения подробнее рассказывает о нем в статье(EN, 4м)

#ksp #di #dagger #sqaure
Media is too big
VIEW IN TELEGRAM
📺 Обзор Kotlin Inject (27 мин) или как будет выглядеть Dagger на Kotlin Multiplatform

Обзор библиотеки 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
Вышел Dagger 2.53 c breaking changes для Kotlin
👉 Все Binds теперь потребуют объявления с nullable типами
👉 Обязательно использование JvmSuppressWildcards в Multibinding Map для generic типа значения
👉 Binds методы теперь не могут использовать Scope, когда они делегирует @Produces имплементации
👉 Удалена поддержка Java 7

‼️ Ничего полезного в Dagger не добавляют уже давно, так что сидите на той версии что вас устраивает и работает.

#dagger #di
Разбор (15м) классов, который использует Dagger 2 для построения графа зависимостей, в процессе генерации кода. Рекомендую всем чтобы понять устройство Dagger и DI подхода в целом.

#android #dagger
Вышел Dagger 2.54

Релиз который мы заслужили - переделки и багфиксы. Зачем вообще обновлять Dagger я не понимаю 😞

#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 #лучшиепрактики
Разработчик из Ozon делится опытом, как организовали с помощью фич языка Kotlin хранилище Dagger-компонентов, доступное из любого модуля, управляющее их жизненным циклом и забравшее другую рутину на себя.

#android #dagger #di
🤖 Альтернативный способ обработке one-off событий из ViewModel (EN, 10м)

В статье рассказывается в чем сложность с обработкой одноразовых событий, которые надо передать из 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
Please open Telegram to view this post
VIEW IN TELEGRAM