Если коротко про изменения — Material3 Adaptive всё ближе к полноценному “Responsive Compose”. Теперь можно писать интерфейсы, которые одинаково естественно ведут себя на телефоне, планшете и десктопе.
Главное:
🪶 Levitate-стратегия для ThreePaneScaffold — превращает панель в плавающее окно (popup).
↔️ Reflow-стратегия для ThreePaneScaffold — позволяет при узком экране уводить одну панель под другую, сохраняя UX.
👉 PaneScaffoldScope.saveableStateHolder — сохраняет состояние между разными конфигурациями экрана.
👉 Modifier.preferredHeight() — теперь можно задать предпочтительную высоту панели.
📏 Новые WindowSizeClasses: API currentWindowAdaptiveInfo() теперь распознаёт Large и ExtraLarge окна — важный шаг к поддержке планшетов и десктопов.
👉 Drag-to-resize получил настройку пользовательского поведения и поддержку a11y (accessibility).
#compose #material3 #adaptive #android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤9🔥2
📦 Не храните всю графику в приложении
Одна из лучших практик — храните в приложении только простые иконки в векторном формате, а всю растровую графику держите в облаке. Особенно это важно для приложений, которые не могут работать офлайн 🌐
Почему это стоит делать:
🚀 Меньше вес приложения → быстрее установка и обновления
📉 Не тянете лишние ресурсы, которые пользователь никогда не увидит (например, фичи под подпиской или в определённом регионе)
🌍 Можно адаптировать загрузку под регион, тариф или подписку
💰 Гибкость — обновляйте, отключайте или заменяйте контент без релиза
Как хранить изображения правильно:
- Векторные иконки → храним в ресурсах приложения
- Баннеры, иллюстрации, фото → CDN или облако (Firebase Storage, CloudFront, S3 и др.) Для загрузки используйте image loader: Coil, Glide, Picasso и т.д.
Чтобы грузить локальные ресурсы в Android через URL можно использовать адреса (примеры для приложения с именем пакета
- По имени ресурса
- По числовому ID
⚙️ Для Compose Multiplatform пока нет прямой поддержки таких ссылок, но можно расширить любой image loader и добавить обработку собственных URL или типов данных
#android #оптимизация #compose #coil
Одна из лучших практик — храните в приложении только простые иконки в векторном формате, а всю растровую графику держите в облаке. Особенно это важно для приложений, которые не могут работать офлайн 🌐
Почему это стоит делать:
🚀 Меньше вес приложения → быстрее установка и обновления
📉 Не тянете лишние ресурсы, которые пользователь никогда не увидит (например, фичи под подпиской или в определённом регионе)
🌍 Можно адаптировать загрузку под регион, тариф или подписку
💰 Гибкость — обновляйте, отключайте или заменяйте контент без релиза
Как хранить изображения правильно:
- Векторные иконки → храним в ресурсах приложения
- Баннеры, иллюстрации, фото → CDN или облако (Firebase Storage, CloudFront, S3 и др.) Для загрузки используйте image loader: Coil, Glide, Picasso и т.д.
Чтобы грузить локальные ресурсы в Android через URL можно использовать адреса (примеры для приложения с именем пакета
com.example.myapp):- По имени ресурса
android.resource://com.example.myapp/drawable/my_image- По числовому ID
android.resource://com.example.myapp/2130837504#android #оптимизация #compose #coil
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯13❤8👍8
Стал доступен первый стабильный релиз навигации, разработанной специально для Compose. Библиотека предоставляет больше гибкости и контроля разработчикам, позволяя реализовать различные подходы. Google выложила свои примеры реализации популярных задач в репозитории на
Nav3 имеет поддержку Compose Multiplatform, а также JetBrains выпустила версию артефактов
👉 Документация по библиотеке
Всем кто использует Jetpack Navigation 2 с Compose нааооятельно рекомендуется миграция.
🔨Руководство по миграции
Про возможности бибилотеки я рассказал в
#android #compose #kmp #cmp #jetpack #ui #nav3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥56👍9🤔5❤3
Пример использования Jetpack Navigation 3
#android #compose #nav3 #jetpack
data object ProductList
data class ProductDetail(val id: String)
@Composable
fun MyApp() {
// Create a back stack, specifying the key the app should start with
val backStack = remember { mutableStateListOf<Any>(ProductList) }
// Supply your back stack to a NavDisplay so it can reflect changes in the UI
// ...more on this below...
// Push a key onto the back stack (navigate forward), the navigation library will reflect the change in state
backStack.add(ProductDetail(id = "ABC"))
// Pop a key off the back stack (navigate back), the navigation library will reflect the change in state
backStack.removeLastOrNull()
}
// [END android_compose_navigation3_basic_1]
@Composable
fun EntryProvider() {
val backStack = remember { mutableStateListOf<Any>(ProductList) }
NavDisplay(
backStack = backStack,
// [START android_compose_navigation3_basic_2]
entryProvider = { key ->
when (key) {
is ProductList -> NavEntry(key) { Text("Product List") }
is ProductDetail -> NavEntry(
key,
metadata = mapOf("extraDataKey" to "extraDataValue")
) { Text("Product ${key.id} ") }
else -> {
NavEntry(Unit) { Text(text = "Invalid Key: $it") }
}
}
}
// [END android_compose_navigation3_basic_2]
)
}
#android #compose #nav3 #jetpack
👍16❤4
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🤯3👍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
👍103🔥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
🔥81🤯40👍23🙏4🤝2❤1
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
🔥27❤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
👍30❤6👎4🔥3