Google выпустила мажорное обновление библиотек Lifecycle. Этот релиз сфокусирован на улучшении интеграции с Compose.
rememberLifecycleOwner для ComposeНовый композабл позволяет создавать изолированные
LifecycleOwner внутри UI. Идеально для компонентов, которым нужно независимое управление состоянием — например, для HorizontalPager, где только активная страница должна быть в состоянии RESUMED.@Composable
fun MyComposable() {
val lifecycleOwner = rememberLifecycleOwner(
maxLifecycle = Lifecycle.State.RESUMED,
parentLifecycleOwner = LocalLifecycleOwner.current,
)
CompositionLocalProvider(
LocalLifecycleOwner provides lifecycleOwner
) {
// Дочерние композаблы теперь имеют собственный жизненный цикл
}
}
Новый артефакт
lifecycle-viewmodel-navigation3 предоставляет готовый декоратор для автоматической привязки ViewModel к отдельным экранам в Navigation 3.NavDisplay(
backStack = backStack,
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator(), // Добавляем эту строку
),
entryProvider = entryProvider { /* ... */ }
)
Удобства для разработчиков:
👉 Идиоматичный Kotlin API для создания кастомных
CreationExtras CreationExtras {
this[MY_CUSTOM_KEY] = "myValue"
}
👉 Метод
savedStateHandle.saved() теперь нативно поддерживает nullable типы👉 Конструкторы SavedStateHandle помечены как
@VisibleForTesting⚠️ Важное изменение
Повышение
minSdk с API 21 до API 23 — убедитесь, что ваше приложение соответствует новым требованиям.#Jetpack #Lifecycle #Compose #Navigation #ViewModel #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥10🤯4👍2🙏1
Что дает библиотека
👉 Единый кроссплатформенный API для замены разрозненных решений
👉 Централизованная система управления всей навигацией в приложении
👉 Базовый слой для будущих навигационных решений Android
Пример использования:
val myHandler = object : NavigationEventHandler<NavigationEventInfo>(
initialInfo = CurrentInfo,
isBackEnabled = true
) {
override fun onBackStarted(event: NavigationEvent) {
// Подготовка к навигации
}
override fun onBackProgressed(event: NavigationEvent) {
// Анимации на основе event.progress
}
override fun onBackCompleted() {
// Завершение навигации
}
}
👉 Готовая интеграция с Compose
val navEventState = rememberNavigationEventState(
currentInfo = CurrentInfo,
backInfo = PreviousInfo
)
NavigationBackHandler(
state = navEventState,
isBackEnabled = true,
onBackCompleted = { /* Действие при завершении */ }
)
👉 Диспетчеры могут образовывать родительско-дочерние цепочки:
// Compose
val childDispatcher = rememberNavigationEventDispatcher(
parent =
LocalNavigationEventDispatcherOwner
.current
.navigationEventDispatcher
)
👉 Нативная поддержка Predictive Back из Android
👉 Библиотека уже используется в Activity 1.12.0 как базовый слой
#Jetpack #Navigation #Compose #KMP #PredictiveBack #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥35❤4
С релизом Compose Material 3 — версии 1.4.0 Google сделала радикальный шаг: библиотека androidx.compose.material.icons исключена из Material3 и больше не рекомендуется к использованию.
Что произошло
👉 Material Icons удалены из актуального релиза Material3 1.4.0
👉 Поддержка библиотеки прекращена
👉 Можно подключить вручную, но это временная мера для тех, кто не успел мигрировать
Google предлагает переходить на Vector Drawable XML в Android или Compose Multiplatform ресурсах. Скачивайте иконки с вкладки Android на странице Material Symbols и храните в ресурсах проекта
Преимущества использования Material Symbole:
Источник - официальная документация Android Jepack
Благодарю подписчика Evgeny F. за то, что обратил внимание на изменение.
#Android #AndroidJetpack #Material3 #Compose #CMP
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83🤯41👍23🙏4❤2🤝2
Media is too big
VIEW IN TELEGRAM
Гугл выпустил Navigation 3 — это новая глава в построении навигации для Android-приложений. Всё, что вы знали, теперь стало мощнее, гибче и композабльнее!
00:00 — Базовые принципы Navigation 3
02:09 — NavEntry и entryProvider
03:29 — Разбор API на практике
07:17 — Навигация в многомодульном приложении
11:27 — Модуляризация: пишем код
15:57 — Анимации экранов
16:15 — Погружаемся в анимации
19:44 — Адаптивные макеты (Scenes)
23:01 — Scenes в действии
24:39 — Краткий итог и выводы
🔗 Официальное руководство
🔗 Рецепты для работы с Nav3 (Code recipes)
Навигация больше не будет болью! Смотрите, внедряйте и делитесь впечатлениями в комментариях.
#Android #AndroidDev #Jetpack #Compose #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍9🎉3
Forwarded from Compose Broadcast
👉 Стабильное API Shared Transition
👉 Оптимизированный скролл
👉 Новые подходы к сохранению данных при пересоздании Activity через ViewModel
🚀 Повышена производительность UI на Compose
🛠 Исправлено багов и шероховатостей
Изменений действительно много — в один пост всё не поместить.
Буду разбирать ключевые обновления по отдельности в следующих публикациях на @compose_broadcast ✨
#compose #android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28❤9👍3
Команда Compose представила opt-in API для улучшения читаемости стектрейсов во время разработки и для релизов.
Теперь становится возможным:
👉 Точно определять источник крешей в композиции, Side Effect (
LaunchedEffect, DisposableEffect) и корутинах из rememberCoroutineScope.👉 Изолировать падения для создания воспроизводимых примеров.
👉 Изучать креши, которые раньше показывали только внутренние фреймы Compose.
Достаточно добавить одну строку в точке входа в приложение (например, в
Application.onCreate()):// Включить stack trace только для минифицированных сборок (рекомендуемый способ)
Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto)
// Или для локальной отладки (более точные, но тяжёлые трассировки)
Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation)
‼️ ВАЖНО Требуется Kotlin 2.3.0, а для режимов `Auto` и `GroupKeys` - включённый R8 с минификацией.
Есть несколько режимов работы
Auto (рекомендуется): использует GroupKeys для минифицированных сборок и None для отладочных.👉
GroupKeys: для минифицированных приложений. Использует маппинг-файл от R8 для восстановления примерного местоположения.👉
SourceInformation: для отладки. Даёт точные строки где произошел креш, но затратно по производительности. Стоит использовать только на этапе разработке.None: ничего не добавляет (поведение по умолчанию).Под капотом любой креш в Compose коде оборачивается в
DiagnosticComposeException, который добавляется в suppressed-исключения. В нём будет полная иерархия вызовов `@Composable` функций на момент падения!java.lang.IllegalStateException: Test layout error
at <original trace>
Suppressed: androidx.compose.runtime.DiagnosticComposeException:
Composition stack when thrown:
at ReusableComposeNode(Composables.kt:<unknown line>)
at Layout(Layout.kt:79)
at <lambda>(TempErrorsTest.kt:164) <-- Ваша функция!
... и т.д.
⚠️ Известные ограничения:
👉 В режиме
SourceInformation для первых фреймов могут не указываться номера строк (<unknown line>).👉
GroupKeys указывает только на первую строку @Composable функции.👉 Если сам сбор стектрейса упадёт, его исключение будет добавлено как suppressed.
Подробнее в официальной документации
#AndroidDev #Kotlin #Compose #R8 #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32❤6👎5🔥4
Android Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
Для тех кто не в курсе, Material Symbols пришли на замену Compose Material Icons, которые больше не рекомендуется к использованию (подробности тут)
Источник - Android Developers
#Android #AndroidDev #Compose #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥74👍13🎉11👎3❤1
Coil - это библиотека для загрузки изображений на Android (и теперь Compose Multiplatform). Название расшифровывается как Coroutine Image Loader — библиотека написана на Kotlin с первого дня и отлично вписывается в современный стек: корутины, Compose, KMP.
В новой версии несколько интересных вещей:
🔁 ConcurrentRequestStrategy — теперь можно объединять параллельные сетевые запросы на один и тот же ресурс. По умолчанию отключено и помечено как экспериментальное, но идея хорошая — вместо N одинаковых запросов летит один, остальные ждут результата.
🧵 Асинхронный декодинг JS/WASM — изображения больше не блокируют главный поток браузера. Важно для KMP-проектов с вебом.
🐧 Linux targets — добавили поддержку
linuxX64 и linuxArm64 для non-Compose артефактов.🎞 Улучшенные переходы в Compose — новый
useExistingImageAsPlaceholder позволяет плавно переходить от предыдущего изображения, когда нет placeholder. Мелочь, но визуально приятно.🎬 Embedded video thumbnails — поддержка встроенных превью для видео.
🔧 coil-lint — добавили Android Lint-правило, которое ловит случайные вызовы
kotlin.error() внутри блоков ImageRequest.Builder. Неожиданно полезно.Зависимости Kotlin 2.3.10, Compose 1.9.3, Okio 3.16.4.
#Android #AndroidDev #KMP #kCMP #Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40👎5❤4🔥1👏1🤔1👌1
🤯 Конец Android View ближе чем кажется - в будущей версии Android Studio убирают поддержку превью для Custom View.
Источник - сайт Android Developers
#Android #AndroidDev #Compose #AndroidStudio
Источник - сайт Android Developers
#Android #AndroidDev #Compose #AndroidStudio
🤯104👎47🎉25👍16🔥13👌1
Forwarded from Compose Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
HotSwan - быстрое обновление Composable на реальном устройстве. Доступно как плагин для Android Studio
Я выбрал другой путь - делаю СMP проект с поддержкой Android + Desktop JVM и так можно быстро проверять + делать код чище.
#Compose
Я выбрал другой путь - делаю СMP проект с поддержкой Android + Desktop JVM и так можно быстро проверять + делать код чище.
#Compose
👍24👎9
Forwarded from Compose Broadcast
Что нового:
👉 Визуальная отладка переходов Shared Elements
👉 Переработанная поддержка трекпадов — теперь работают как мышь и распознают жесты
👉 Preview Wrappers для более быстрой работы с превью
👉 Host Defaults для KMP-проектов
👉 Testing APIs v2 для корутин
👉 Экспериментальные API: Styles, MediaQuery, Grid, FlexBox
Подробности по каждому пункту — отдельными постами в @compose_broadcast
#Compose #Android #AndroidJetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍36👎4
‼️ Android View всё! Да здравствует Compose!
Google официально объявила о переходе к стратегии «Compose-first» и прекращении развития Android View, переводя его в режим поддержки.
Что это значит:
👉 Классы android.widget.* в Android SDK будут находиться в режиме поддержки.
👉 Библиотеки Android Jetpack про кастомные View (включая RecyclerView) также переходят в режим поддержки.
👉 Все инструменты в Android Studio будут создаваться только для Compose.
👉 Документация будет писаться только для Compose, однако некоторые разделы про View останутся.
🔗 Источник - оф сайт Android Developers
#Android #AndroidDev #Compose
Google официально объявила о переходе к стратегии «Compose-first» и прекращении развития Android View, переводя его в режим поддержки.
Что это значит:
👉 Классы android.widget.* в Android SDK будут находиться в режиме поддержки.
👉 Библиотеки Android Jetpack про кастомные View (включая RecyclerView) также переходят в режим поддержки.
👉 Все инструменты в Android Studio будут создаваться только для Compose.
👉 Документация будет писаться только для Compose, однако некоторые разделы про View останутся.
🔗 Источник - оф сайт Android Developers
#Android #AndroidDev #Compose
👍176👎45
👉 CardView
👉 ConstraintLayout
👉 CoordinatorLayout
👉 CustomView
👉 Databinding
👉 DragAndDrop
👉 DrawerLayout
👉 DynamicAnimation
👉 Emoji
👉 Fragment
👉 GridLayout
👉 Interpolator
👉 Loader
👉 Navigation
👉 PercentLayout
👉 Preference
👉 RecyclerView
👉 SlidingPaneLayout
👉 SwipeRefreshLayout
👉 Transition
👉 VectorDrawable
👉 ViewPager
👉 ViewPager2
👉 Material Design Components (Views)
Считаю что делать так с RecyclerView поступили опрометчиво, ведь не все возможности может сделать Lazy*** Composable, а вот на Fragment и подавно куча приложений строится. Но нам дадут волшебные скиллы для миграции по одному экрану за раз
#Android #AndroidDev #Compose #
Please open Telegram to view this post
VIEW IN TELEGRAM
👍57👎17 1
1.14.0 это одновременно и большой апдейт, и проводы. Новых фич для View-версии Material больше не будет, останутся только критические исправления. В документации Google прямым текстом советует всем, кто сидит на Views, начинать или продолжать миграцию на Compose.
Что приехало в релизе:
👉 Material 3 Expressive темы и стили получили статус stable;
👉 Новые компоненты для списков в стиле M3:
ListItemLayout, ListItemRevealLayout, ListItemCardView и другие. Готовые список-айтемы со свайпами вместо самописных решений на RecyclerView;👉
OverflowLinearLayout, который прячет дочерние элементы в overflow menu при нехватке места, по аналогии с action items в Toolbar;👉 Focus rings, декоративная обводка элемента при получении фокуса, удобно для клавиатурной навигации;
👉 Мелкая кастомизация: secondary icons для кнопок, overflow modes для button groups, delays для loading indicators.
Что ещё важно:
⚠️ minSdk подняли с 21 до 23 (Android 6.0). Для проектов с поддержкой Android 5.x это блокер апдейта;
🛠 Библиотека больше не дёргает deprecated API на новых версиях Android, и Play Console перестанет на это ругаться;
Лично для меня новость ожидаемая. Google толкает Compose уже несколько лет, View рано или поздно должен был умереть. Паниковать не стоит, библиотека не ломается, просто не будет новых релизов. Но если вы стартуете новый проект на Views в 2026-м, это прямой повод пересмотреть решение. А для больших легаси-приложений 1.14.0 хороший момент заложить миграцию на Compose в план на горизонте года-двух. Ну и теперь Google будет тратить меньше сил на реализацию дизайн системы, так как убрался UI фреймворк в поддержке
🔗 Полный Changelog
#Android #Дизайн #Material3 #compose #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32👎8
GridCells.Adaptive сам рассчитывает колонки под доступное пространство — ничего не нужно задавать вручную:
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 160.dp),
modifier = Modifier.fillMaxSize()
) {
items(list) { ItemCard(it) }
}
Но почти всегда забывают про пагинацию.
pageSize хардкодят, и это ломает всю адаптивность. На планшете с 4 колонками те же 20 элементов — это 5 строк. Пользователь упирается в конец страницы раньше чем успел проскроллить.Правильно — считать
pageSize от реального числа колонок:BoxWithConstraints {
val columns = (maxWidth / 160.dp)
.toInt().coerceAtLeast(1)
val rows = (maxHeight / 120.dp)
.toInt().coerceAtLeast(1)
val pageSize = columns * rows
val items = remember(pageSize) {
Pager(PagingConfig(pageSize = pageSize)) { MyPagingSource() }
}.flow.collectAsLazyPagingItems()
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 160.dp)
) {
items(items.itemCount) { ItemCard(items[it]) }
}
}На смартфоне выйдет ~10 элементов, на планшете ~30. Никаких магических чисел — только математика от реального пространства.
Самый хороший пример тут - галерея. Они показывают адаптивную сетку контента и имеет возможность настройки другого расположения элементов
🔗 Lazy lists and grids — Android Developers
#Compose #Android #AndroidDev #Ui #Adaptive #Адаптивность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54❤8👎7🎉3
Forwarded from Compose Broadcast
This media is not supported in your browser
VIEW IN TELEGRAM
@NavDestination, @NavEdge, @NavGraphRoot, KSP статически собирает граф, а IDE-плагин рисует карту: каждый экран отрендеренной @Preview-миниатюрой через Layoutlib, без эмулятора. Переходы стрелками, двойной клик прыгает в исходник, граф мёржится по всем модулям. Канвас редактируемый — тянешь связь от экрана к экрану, и плагин сам вписывает @NavEdge в код.Работает с Navigation 3, Navigation 2 и даже голыми Activity. KMP из коробки: аннотации в commonMain, есть сэмпл на KotlinConf-приложении (26 экранов, 36 переходов).
Бонусом
.nav baseline по аналогии с apiDump/apiCheck: navCheck валит сборку, когда граф разъезжается с закоммиченным базелайном.#Compose #AndroidStudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍70🔥14❤7👎5 1
В hh.ru рассказали, как переезжали с Fragment-навигации на Compose + Modo в двух приложениях: 400+ экранов, 70 диплинков, 14 команд. Миграция идёт с 2022 года — и в июне 2026 ещё не завершена.
Modo выбрали за UDF-подход (состояние всей иерархии экранов — обычные данные, переходы — функция от состояния) и потому что разработчик Игорь Кареньков работает внутри hh.ru — можно дорабатывать без ожидания апстрима. Это же стало и первой граблей.
Ключевое решение для глобальных контейнеров: абстракция
NavScreen с двумя реализациями — Fragment и Modo Screen, роутер выбирает через feature toggle в рантайме. Это позволило раскатывать переезд через A/B и не стопорить продуктовую разработку. При первой раскатке словили краш в ComposeView, продуктовые метрики просели — остановили, починили, раскатили снова. Без feature toggle был бы хотфикс-релиз.Три реальные грабли:
👉 Слишком ранний выбор незрелой библиотеки — вложили много времени в доработки самой Modo
👉 Три параллельные миграции одновременно (View→Compose, Fragment→Modo, редизайн) — создали жёсткие зависимости и замедлили продуктовую разработку
👉 Старт без стратегии и метрик — месяцы хаоса, пока не завели дашборд с прогрессом
Если планируешь похожий переезд — там есть что взять.
#Android #Compose #Навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👎28👍13❤1👏1 1
Когда: вторник, 30 июня, 19:00 GMT+3
В прямом эфир буду обсуждать с разработчиком из компании, которая перешла на Kotlin Multiplatform, а теперь отказались и возвращаются назад! С другой стороны - я который переводит разработку банка на Compose Multiplatform.
Эфир пройдет на 🪙 Boosty, запись будет опубликована позже там же
#Kotlin #KMP #CMP #Compose #AndroidBroadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
👍60👎17