@android_broadcast · Post #9343 · 18.07.2025 г., 18:24
🤯Вышел Dagger 2.57 и из полезных изменений там... НИЧЕГО. Просто работают под капотом. Может над поддержкой KSP, может еще над чем Вам нужен Dagger? #dagger#di
TGINSIGHT SIMILAR POSTS
Изходен канал @clockstackwheels · Post #217 · 12.02
Попробовал Obsidian. Это такой заметочник. И в итоге буду переходить на него с Notion. Вообще, с заметочниками дела плохи. Когда-то появился Evernote и занял лидирующее положение на рынке даже при всём своём неудобстве. Он кривой, кроссплатформенность реализована плохо (на части платформ то те, то другие функции недоступны), система организации урезана и приводит к беспорядку, а в клиентах много визуального мусора в UI. И тем не менее, это был один из первых облачных заметочников — важный шаг для рынка. Удивительно, как долго человечество шло к идее, что нужно сделать «Блокнот», но под все платформы, включая телефоны, и с синхронизацией через сеть. Потом пришел Notion, который поначалу топтался на месте из-за сомнительной ценовой политики. Но в результате правильных реформ стал процветающим стартапом, использующимся сейчас в огромном количестве команд и проектов. Даже смог позволить себе сделать безлимитную бесплатную версию. По сравнению с Evernote это был глоток свежего воздуха: мусора в UI на порядки меньше, функциональность одинаковая на всех платформах, полноценная древовидная организация любой глубины, почти нормальная поддержка Markdown. Впрочем, что-то не дало авторам пойти дальше и избавить свой сервис от серьёзных UX-косяков. Только ленивый не ругает Notion за ужасно низкую скорость работы. Он долго грузится, долго открывает файлы и относительно долго реагирует на ввод — для заметочника это критически важно. На всех платформах использовали гибридную разработку (HTML внутри контейнера как будто от нормального нативного приложения) со всеми худшими её чертами: проект тяжёлый и неповоротливый. Это не говоря уже о том, что и десктопное и мобильное приложение по сути окно в веб. Оно не будет работать без интернета, а сессия сбрасывается раз в несколько дней. В итоге вы хотите добавить заметку, открываете клиент, и он мало того что грузится долго, так ещё и показывает вам окно авторизации. Нужно переходить в браузер, ждать, пока авторизация пройдёт там, возвращаться в клиент... в общем, вы уже забудете, что за заметку хотели. После пары лет использования Notion я поймал себя на том, что на телефоне открываю встроенные системные заметки, а потом копирую текст оттуда в Telegram, чтобы он был доступен отовсюду. На компьютере же быстрее открыть Notepad++. Короче, Notion со своей задачей быть заметочником на каждый день не справляется. И вот, Obsidian. По сути это продвинутый блокнот с поддержкой Markdown. Ладно, у него есть какая-то фишка с организацией заметок по методу Zettelkasten, но я пока туда не смотрел, да и сам метод требует определённого подхода, который я пока что не применяю. Так что это блокнот, умеющий выводить дерево и отображать Markdown-форматирование. Он очень быстрый, грузится не молниеносно, но адекватно, и сам интерфейс работает очень шустро. Не знаю, HTML там или нет (по виду кажется, что да), но авторы явно поработали над оптимизацией. Конечно же, есть приложения под телефоны, и они тоже весьма комфортны по скорости. Что касается синхронизации, то это платная функция, и, на мой взгляд, необоснованно дорогая: $8 в месяц (сама программа бесплатная). Здесь бы разговор можно было закончить — при всех прелестях сервис без синхронизации между устройствами в 2022 году это как обувь на одну ногу. Но мне повезло: моё NAS-хранилище умеет создавать виртуальное облако. Да, возможно у какого-то из облаков на рынке тоже есть все нужные функции, но, например, Яндекс Диск на телефоне синхронизирует только видео и фотки, а произвольные папки не может. А вот Synology прям спасло. Что ещё хорошего. Notion был перегружен лишними функциями. Но если они всё-таки нужны, у Obsidian отличная система плагинов, поддерживаемых независимыми разработчиками. Уже есть множество решений на любой вкус. Например, в Notion я мог пошарить другому человеку выбранную заметку. А здесь нашёл плагин, который трансформирует заметку в Github Gist. Удобно: Markdown там совместимый, Gist бесплатный и без рекламы. Короче, пока нравится. Вот этот пост сейчас пишу в нём на компьютере, а начал на телефоне днём. То, что нужно. #web#tools
Търсене: #dagger
@android_broadcast · Post #9343 · 18.07.2025 г., 18:24
🤯Вышел Dagger 2.57 и из полезных изменений там... НИЧЕГО. Просто работают под капотом. Может над поддержкой KSP, может еще над чем Вам нужен Dagger? #dagger#di
@android_broadcast · Post #8888 · 02.04.2025 г., 06:00
Разработчик из Ozon делится опытом, как организовали с помощью фич языка Kotlin хранилище Dagger-компонентов, доступное из любого модуля, управляющее их жизненным циклом и забравшее другую рутину на себя. #android#dagger#di
@android_broadcast · Post #8910 · 06.04.2025 г., 17:51
Как найти неиспользуемые зависимости в Dagger Component (EN,11м) С помощью Dagger SPI автор написал анализатор графа Dagger c целью поиска неиспользуемых зависимостей и описал подход в статье. Также подход можно использовать для визуализации графа зависимостей, считать разные метрики графа и пр. 🐱Исходный код на GitHub 🔗Альтернативная ссылка #dagger#di#opensource
Hashtags
@android_broadcast · Post #8639 · 05.02.2025 г., 16:15
🤯Не нужно делать инжект всех зависимостей в конструктор Встретил код в проекте: 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#лучшиепрактики
Hashtags
@android_broadcast · Post #9806 · 18.01.2026 г., 12:22
🤯Dagger Hilt блокирует переход на AGP 9.0 UPD. 21 января вышел Dagger 2.59 с поддержкой AGP Android Gradle Plugin 9.0 официально зафиксировал новый стабильный конфигурационный API (вышла стабильная версия с релизом AS Otter FD 3) — это одно из самых значимых изменений в инфраструктуре Android и Kotlin Multiplatform за последние годы. Цели понятны и правильные лучше работа с кэшем и общая скорость сборок. Подробнее про все изменения я писал в отдельном посте Google несколько релизов подряд аккуратно готовил экосистему к этому переходу, заранее добавив новый API и дав время авторам плагинов адаптироваться. Но на практике всё упирается в плагины. Я столкнулся с тем, что Gradle-плагин Dagger Hilt до сих пор использует старую модель конфигурации и несовместим с новым DSL из AGP 9.0. В результате проект нельзя перевести на новую версию без отключения Hilt или включения режим совместимости. Иронично, что именно официальный инструмент от Google сейчас становится блокером для обновления. Да, в AGP оставили compatibility-флаги, позволяющие продолжать сборку по старым правилам. Это спасает проекты от немедленного падения, но полностью отключает все ключевые преимущества AGP 9.0 — configuration cache, ускоренную конфигурацию и новую модель плагинов. 💬 Вы уже пробовали миграцию на AGP 9.0? Что блокирует? Делитесь в комментариях мнением. UPD. По заявлениям подписчиков также есть проблемы в работе KAPT и KSP #Android#AndroidDev#Gradle#Dagger#Hilt
@android_broadcast · Post #9550 · 08.10.2025 г., 11:50
🤖 Если вы искали альтернативу Dagger/Hilt, но с поддержкой Kotlin Multiplatform, то как раз вышла свежая версия Koin Annotations, которая значительно упрощает миграцию! #dagger#hilt#koin
@android_broadcast · Post #8901 · 05.04.2025 г., 10:43
🤖Альтернативный способ обработке 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
Hashtags
@android_broadcast · Post #9569 · 17.10.2025 г., 07:58
‼️Не тяните зависимости из графа сразу! Одна из частых ошибок при использовании DI — получать все зависимости из графа сразу (например, в конструкторе класса). Так делать не стоит 😬 Получение зависимости из графа — это каскадный процесс, и он должен выполняться только в момент использования. Поэтому я всегда рекомендую инжектить зависимости для Dagger/Hilt через Lazy (не путайте с kotlin.Lazy) или Provider. class ViewModel @Inject constructor( // Зависимость получается из графа сразу при создании private val useCase: DataUseCase, // Получаем зависимость из графа каждый раз при обращении Provider.get() private val useCaseFactory: Provider<DataUseCase>, // Получаем зависимость из графа при первом обращении // и затем она кэшируется в Lazy объекте private val useCaseLazy: Lazy<DataUseCase>, ) 💡 Чтобы перейти на Lazy без боли в существующем коде — можно использовать делегаты свойств в Kotlin: // Вариант использования без Lazy class ViewModel @Inject constructor( private val useCase: DataUseCase ) // Миграция на Lazy без потери API совместимости class ViewModel @Inject constructor( useCaseFactory: Lazy<DataUseCase>, ) { private val useCase: DataUseCase by useCaseFactory } И небольшой хелпер, чтобы это работало красиво 👇 // Функция расширения для использования property делегата operator fun <T> Lazy<T>.getValue(thisRef: T, property: KProperty<*>): T = get() Таким образом, вы снижаете нагрузку на DI граф, откладываете инициализацию и избегаете ненужных каскадов при старте компонентов. #di#dagger#hilt#лучшиепрактики
Hashtags
@android_broadcast · Post #9738 · 09.12.2025 г., 12:05
🚀Cash App перевел Android-приложение на Metro — новый DI фреймворк для Kotlin Команда Cash App (Block) успешно мигрировала своё Android-приложение с Anvil/Dagger на Metro — современный фреймворк для dependency injection, разработанный Zac Sweers. Metro — это compile-time DI фреймворк, вдохновленный Dagger и Anvil, но реализованный как Kotlin compiler plugin. Он Kotlin-first, поддерживает K2 и работает значительно быстрее традиционных решений. Вобрал в себя всё лучшее от Dagger, Anvil и Kotlin-Inject Почему перешли на Metro? - Скорость сборки — ускорение инкрементальных сборок на ~60% - Поддержка Kotlin K2 — возможность использовать новейший компилятор Kotlin - Упрощение стека — отказ от kapt и Java-ориентированных инструментов - Современный подход — Kotlin-first дизайн и улучшенный DX - Более строгая валидация DI-графа - Улучшена безопасность типов (нуллабельность) - Поддержка KMP 📊 Результаты по скорости сборки: - Инкрементальные сборки → ускорение на 58-60% - Чистые сборки → ускорение на 17% - ABI-изменения → сборка за 11.9s вместо 28.8s Миграция 1500 модулей проводилась постепенно с двойной поддержкой двух DI фреймворков для безопасного перехода. В зависимости от настройки Gradle менялся DI и генерация кода. Впервые вижу подход, когда был описан граф для 2 разных DI с целью постепенной миграции. Миграцию с Koin на Metro так не сделать, но вот с Koin Annotations на Metro вполне может получится. #DI#KMP#Dagger#Metro#Android#AndroidDev#Anvil