Вышел Compose Multiplatform 1.6.10:
👉 Экспериментальная поддержка Lifecycle и ViewModel. Подробности тут
👉 Экспериментальная поддержка Jetpack Navigation (версия 2.7.0). Пример тут
👉 Compose ресурсы стали поддерживать многомодульные проекты и публикацию библиотек, но надо использовать Kotlin 2.0.0
👉 При миграции на Kotlin 2.0 надо использовать дополнительный Gradle плагин
👉 Локализовали строки в модулях
Изменения в каждой платформе отдельными постами в @compose_broadcast
#compose #jetpack
👉 Экспериментальная поддержка Lifecycle и ViewModel. Подробности тут
👉 Экспериментальная поддержка Jetpack Navigation (версия 2.7.0). Пример тут
👉 Compose ресурсы стали поддерживать многомодульные проекты и публикацию библиотек, но надо использовать Kotlin 2.0.0
👉 При миграции на Kotlin 2.0 надо использовать дополнительный Gradle плагин
org.jetbrains.kotlin.plugin.compose. Руководство по миграции тут👉 Локализовали строки в модулях
ui, material и material3Изменения в каждой платформе отдельными постами в @compose_broadcast
#compose #jetpack
Обзор того что будет релизнуто в Compose 1.7.0
👉 Shared element transitions
👉 Анимации элементов в LazyColumn и LazyRow
👉 AnnotatedString.fromHtml() - конвертирование Html в AnnotatedString
👉 ContextualFlowRow и ContextualFlowColumn - layout с композицей только видимого на экране контента, а для контента что не вместилось показываете индикатор элементов что не влезли
👉 Улучшение производительности
👉 Больше стабильного API
👉 Strong skipping mode будет включен по умолчанию в Compiler 2.0.20 и чаще будет пропускать рекомпозицию. Нужно будет ставить меньше аннотаций
Что еще
👉 Типобезопасная навигация в Navigation Compose 2.8.0
👉 Поддержка Compose в Jetpack CameraX
#compose #kotlin2 #навигация #jetpack #анимация
👉 Shared element transitions
👉 Анимации элементов в LazyColumn и LazyRow
👉 AnnotatedString.fromHtml() - конвертирование Html в AnnotatedString
👉 ContextualFlowRow и ContextualFlowColumn - layout с композицей только видимого на экране контента, а для контента что не вместилось показываете индикатор элементов что не влезли
👉 Улучшение производительности
👉 Больше стабильного API
👉 Strong skipping mode будет включен по умолчанию в Compiler 2.0.20 и чаще будет пропускать рекомпозицию. Нужно будет ставить меньше аннотаций
Stable и ImmutableЧто еще
👉 Типобезопасная навигация в Navigation Compose 2.8.0
👉 Поддержка Compose в Jetpack CameraX
#compose #kotlin2 #навигация #jetpack #анимация
Стали доступны записи докладов KotlinConf'24. Доклады (10 видео) по Compose собрал в один плейлист на YouTube чтобы было удобно смотреть
#kotlinconf24 #compose #jetpack #производительность @compose_broadcast
#kotlinconf24 #compose #jetpack #производительность @compose_broadcast
Forwarded from Android Broadcast
Media is too big
VIEW IN TELEGRAM
Видео про то как вставить Fragment в Compose с применением библиотеки fragment-compose (уже стабильная версия 1.8)
Почитать про использование Fragment в Compose можно в документации
#compose #fragment #android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассказ про типобезопасную навигацию для Compose (EN,3м), какой она стала в Jetpack Navigation 2.8.0. Это всё будет работать и в Compose MP
#compose #android #jetpack #kmp
#compose #android #jetpack #kmp
Вышел Compose Material3 Adaptive 1.1.0
👉 ListDetailPaneScaffold и SupportingPaneScaffold добавили поддержку изменения разделителя между панелям жестом в UI и программистом из кода
👉 NavigableListDetailPaneScaffold и NavigableSupportingPaneScaffold теперь поддерживают predictive back. Также можно использовать ThreePaneScaffoldPredictiveBackHandler для поддержки predictive back с вашей собственной реализацией scaffold
👉 AnimatedPane теперь позволит задать разные движения для переключения панелей
#compose #jetpack
👉 ListDetailPaneScaffold и SupportingPaneScaffold добавили поддержку изменения разделителя между панелям жестом в UI и программистом из кода
👉 NavigableListDetailPaneScaffold и NavigableSupportingPaneScaffold теперь поддерживают predictive back. Также можно использовать ThreePaneScaffoldPredictiveBackHandler для поддержки predictive back с вашей собственной реализацией scaffold
👉 AnimatedPane теперь позволит задать разные движения для переключения панелей
#compose #jetpack
// Подключайте BOM для обновления до актуальных версиях
implementation("androidx.compose:compose-bom-beta:2025.03.01")
#compose #jetpack #android
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
🛠 Значительные переработки под капотом для улучшения поддержки KMP
👉 Добавлена поддержка обработки deep link из Kotlin Common кода
👉 Улучшения API
#jetpack #jetpackupdate #navigation #compose #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
В Compose 1.9.0 (пока в альфа) добавили новый Modifier - keepScreenOn(), который будет держать экран включенным, пока Composable функция будет частью композиции
#jetpack
Box(
modifier = Modifier.keepScreenOn()
){
...
}
#jetpack
Forwarded from Android Broadcast
🎉 Jetpack Navigation 3 - навигация для Compose, написанная с нуля!
Будем честны Jetpack Navigation for Compose было никаким решением, до того как в ней появилась типобезопасная навигация, но и тогда остается много вопросов. Google решила что пора написать настоящую навигацию для Compose. Знакомьтесь - Jetpack Nav 3
Ключевые идеи в новой библиотеки: декларативное объявление + "навигация как состояние". Это полностью повторяет идеи что я заложил в NavState. Все это вылилось в принципы:
👉 Разработчик управляет back stack
👉 Возможность расширения и реализации собственной навигации на базовых компонентах
👉 Анимации из коробки
👉 Поддержка Predictive Back
👉 Поддержка адаптивных layout
👉 Сохранения состояния каждого элемент back stack, включая ViewModel
👉 Поддержка многомодульности
Пока представлена только первая альфа и библиотеки еще предстоит путь, как минимум обзавестись поддержкой KMP
🔗 Больше подробности в документации
🐱 Примеры использования на GitHub
#jetpack #compose #навигация
Будем честны Jetpack Navigation for Compose было никаким решением, до того как в ней появилась типобезопасная навигация, но и тогда остается много вопросов. Google решила что пора написать настоящую навигацию для Compose. Знакомьтесь - Jetpack Nav 3
Ключевые идеи в новой библиотеки: декларативное объявление + "навигация как состояние". Это полностью повторяет идеи что я заложил в NavState. Все это вылилось в принципы:
👉 Разработчик управляет back stack
👉 Возможность расширения и реализации собственной навигации на базовых компонентах
👉 Анимации из коробки
👉 Поддержка Predictive Back
👉 Поддержка адаптивных layout
👉 Сохранения состояния каждого элемент back stack, включая ViewModel
👉 Поддержка многомодульности
Пока представлена только первая альфа и библиотеки еще предстоит путь, как минимум обзавестись поддержкой KMP
🔗 Больше подробности в документации
#jetpack #compose #навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
Media is too big
VIEW IN TELEGRAM
Месяц назад Google анонсировала навигацию специально разработанную под Compose и которая должна решить все боли. В видео показываю её возможности, делюсь своим мнение и рассказываю про недочеты, которые надеюсь что решат до стабильного релиза
#AndroidBroadcast #navigation #jetpack #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
Подкючайте артефакт
org.jetbrains.androidx.navigation3:navigation3-ui:1.0.0-alpha01 в common код и можете пробоватьЖдем актуализации до свежей альфа версии, а также адаптивные layout и интеграцию с ViewModel
#compose #kmp #naviation #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Решение использует dev сборки Jetpack Navigation 3 для Compose Multiplatform
#compose #jetpack #navigation3 #cmp #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
Опубликовали org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3:2.10.0-alpha03 - вариант lifecycle-viewmodel-navigation3 с поддержкой Compose Multiplatform
#compose #cmp #jetpack #navigation3
#compose #cmp #jetpack #navigation3
Появилась реализация навигации под Web-браузер, совместимая с Jetpack Navigation 3 и интегрированная с нативной историей браузера. Автор — Костя Цховребов из JetBrains (KMP-команда).
Теперь Web-приложения на Compose Multiplatform могут работать с привычным поведением браузера: кнопки Back/Forward, корректное управление историей, восстановление состояния и предсказуемая работа нескольких экранов.
Поддерживаются две стратегии навигации:
👉 Chronological - Классическая браузерная модель: линейный переход по посещённым состояниям (Back/Forward).
👉 Hierarchical - Мобильная модель навигации, имитирующая структуру экранов и вложенную иерархию — аналогично Android-приложениям.
🧪 Обе стратегии можно сравнить в онлайн-демо
Пример использования Chronological-навигации
@Composable
fun App() {
val backStack = remember { mutableStateListOf<Any>(Root) }
ChronologicalBrowserNavigation(
backStack = backStack,
saveKey = { key ->
when (key) {
is Root -> buildBrowserHistoryFragment("root")
is Profile -> buildBrowserHistoryFragment(
"profile",
mapOf("id" to key.id.toString())
)
else -> null
}
},
restoreKey = { fragment ->
when (getBrowserHistoryFragmentName(fragment)) {
"root" -> Root
"profile" -> Profile(
getBrowserHistoryFragmentParameters(fragment)
.getValue("id")
?.toInt() ?: error("id is required")
)
else -> null
}
}
)
NavDisplay(backStack) { /* ... */ }
}
Navigation3 Browser кажется важным шагом для формирования единой модели навигации в Compose Multiplatform: Android → Desktop → Web.
Это упростит мультиплатформенную архитектуру и сделает перенос логики между платформами гораздо чище.
#Kotlin #Compose #KMP #CMP #WEB #AndroidJetpack #Jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Remote Compose — новый взгляд на Server-Driven UI в Jetpack Compose
В AndroidX Jetpack появилась новая экспериментальная библиотека
Remote Compose позволяет создавать и рендерить интерфейсы Jetpack Compose удалённо, без пересборки и релиза приложения.
UI генерируется на сервере, сериализуется в компактный бинарный документ и воспроизводится на устройстве.
Remote Compose открывает возможности, которые раньше требовали релиза приложения:
⚡️ Мгновенные A/B-тесты — вариации интерфейса меняются на сервере, без обновлений.
🎨 Обновление дизайна в реальном времени — карточки товаров, баннеры, сезонные темы.
📰 Динамические контентные экраны — новости, акции, спецпроекты, которые появляются мгновенно.
🧪 Фичи без мусора — нет необходимости тянуть все варианты экрана в бинарник.
Архитектура Remote Compose состоит из двух частей:
1️⃣ Создание документа
На сервере вы пишете обычные composable-функции — либо используете специальные Remote* элементы (RemoteColumn, RemoteText и др.).
Библиотека перехватывает draw-операции Compose и превращает UI в бинарный документ. Получается самодостаточный «UI-файл», который можно отправить на клиент.
2️⃣ Воспроизведение документа
На устройстве этот документ «проигрывается» плеером:
👉 есть Compose-плеер — для современных приложений;
👉 есть Android View-плеер — для старых архитектур.
Плеер интерпретирует более 90 низкоуровневых операций (рисование, layout, модификаторы, state), обеспечивая реальную нативную отрисовку, без WebView и без компонентов, которые нужно заранее описывать в приложении.
Почему это лучше JSON или WebView
❌ JSON-подход требует схем, ограничивает сложные эффекты, анимации и кастомные компоненты.
❌ WebView — это отдельный процесс, разная визуальная стилистика, тяжёлое потребление памяти и уязвимости
Remote Compose передаёт не структуру компонентов, а реальные команды рисования. Поэтому любое, самое сложное Compose-UI — будет воспроизведено точно так, как вы его задали.
Базовые принципы Remote Compose
👉 Документность — UI становится бинарным документом, который можно кешировать, версионировать, отправлять по сети.
👉 Платформенная независимость — один документ можно рендерить на телефоне, планшете, складном устройстве и даже часах.
👉 Отделение визуального уровня от логики — клиенту не нужно знать о ваших composable-функциях, ViewModel, DI и т.п.
👉 Двусторонняя связь — клики и события возвращаются на клиент, который решает, что делать (навигировать, логировать, изменять состояние).
👉 Поддержка анимаций и выражений — значения могут вычисляться по времени, переменным, условиям.
Для большинства приложений оптимальная модель — гибридная:
📱 основная навигация + критические экраны в “локальном Compose”,
⚙️ динамические зоны — через Remote Compose.
Если Remote Compose будет развиваться так же активно, как Compose в своё время, это может стать стандартом для динамических интерфейсов на Android. Как вам такой поворот с Compose?
Источник тут
#jetpack #android #compose #serverdrivenui #sdui #bdui
В AndroidX Jetpack появилась новая экспериментальная библиотека
androidx.compose.remote (пока еще даже на dev версия). Она предлагает совершенно другой подход к динамическим интерфейсам и может радикально изменить то, как мы обновляем UI в продакшене, категорически отличающаяся от текущих BDUI/SDUI решений.Remote Compose позволяет создавать и рендерить интерфейсы Jetpack Compose удалённо, без пересборки и релиза приложения.
UI генерируется на сервере, сериализуется в компактный бинарный документ и воспроизводится на устройстве.
Remote Compose открывает возможности, которые раньше требовали релиза приложения:
⚡️ Мгновенные A/B-тесты — вариации интерфейса меняются на сервере, без обновлений.
🎨 Обновление дизайна в реальном времени — карточки товаров, баннеры, сезонные темы.
📰 Динамические контентные экраны — новости, акции, спецпроекты, которые появляются мгновенно.
🧪 Фичи без мусора — нет необходимости тянуть все варианты экрана в бинарник.
Архитектура Remote Compose состоит из двух частей:
1️⃣ Создание документа
На сервере вы пишете обычные composable-функции — либо используете специальные Remote* элементы (RemoteColumn, RemoteText и др.).
Библиотека перехватывает draw-операции Compose и превращает UI в бинарный документ. Получается самодостаточный «UI-файл», который можно отправить на клиент.
2️⃣ Воспроизведение документа
На устройстве этот документ «проигрывается» плеером:
👉 есть Compose-плеер — для современных приложений;
👉 есть Android View-плеер — для старых архитектур.
Плеер интерпретирует более 90 низкоуровневых операций (рисование, layout, модификаторы, state), обеспечивая реальную нативную отрисовку, без WebView и без компонентов, которые нужно заранее описывать в приложении.
Почему это лучше JSON или WebView
❌ JSON-подход требует схем, ограничивает сложные эффекты, анимации и кастомные компоненты.
❌ WebView — это отдельный процесс, разная визуальная стилистика, тяжёлое потребление памяти и уязвимости
Remote Compose передаёт не структуру компонентов, а реальные команды рисования. Поэтому любое, самое сложное Compose-UI — будет воспроизведено точно так, как вы его задали.
Базовые принципы Remote Compose
👉 Документность — UI становится бинарным документом, который можно кешировать, версионировать, отправлять по сети.
👉 Платформенная независимость — один документ можно рендерить на телефоне, планшете, складном устройстве и даже часах.
👉 Отделение визуального уровня от логики — клиенту не нужно знать о ваших composable-функциях, ViewModel, DI и т.п.
👉 Двусторонняя связь — клики и события возвращаются на клиент, который решает, что делать (навигировать, логировать, изменять состояние).
👉 Поддержка анимаций и выражений — значения могут вычисляться по времени, переменным, условиям.
Для большинства приложений оптимальная модель — гибридная:
Если Remote Compose будет развиваться так же активно, как Compose в своё время, это может стать стандартом для динамических интерфейсов на Android. Как вам такой поворот с Compose?
Источник тут
#jetpack #android #compose #serverdrivenui #sdui #bdui
Please open Telegram to view this post
VIEW IN TELEGRAM
// Пример создания документа на севере
val document = captureRemoteDocument(
context = context,
creationDisplayInfo = displayInfo,
profile = profile
) {
RemoteColumn(modifier = RemoteModifier.fillMaxSize()) {
RemoteText("Dynamic Content")
RemoteButton(onClick = { /* action */ }) {
RemoteText("Click Me")
}
}
}
// Пример воспроизведения документа на клиенте
@Composable
fun DynamicScreen(document: CoreDocument) {
RemoteDocumentPlayer(
document = document,
documentWidth = screenWidth,
documentHeight = screenHeight,
modifier = Modifier.fillMaxSize(),
onNamedAction = { name, value, stateUpdater ->
// Обработка именнового действия из документа
when (name) {
"addToCart" -> cartManager.addItem(value)
"navigate" -> navController.navigate(value)
"trackEvent" -> analytics.logEvent(value)
}
},
bitmapLoader = rememberBitmapLoader() // Для загрузки картинок
)
}
Источник тут
#jetpack #android #compose #serverdrivenui #sdui #bdui
Please open Telegram to view this post
VIEW IN TELEGRAM
Самое интересное из нового: поддержка Shared Elements между экранами. Теперь достаточно обернуть
NavDisplay в SharedTransitionLayout и передать scope:SharedTransitionLayout {
NavDisplay(
backStack = backStack,
sharedTransitionScope = this
)
}Второе большое добавление —
SceneDecoratorStrategy. Отдельный интерфейс для декорирования сцен общими UI-элементами или для шаринга состояния между ними. Логика декорирования теперь отделена от логики выбора сцены в SceneStrategy.Type safe metadata DSL через
MetadataKey. Больше не нужны строковые ключи — типы значений описаны статически. Готовые NavMetadataKey позволяют задавать анимации переходов прямо в entryProvider:entry<ScreenC>(
metadata = metadata {
put(NavDisplay.TransitionKey) {
slideInVertically { it } togetherWith fadeOut()
}
}
) { ... }
#compose #navigation3 #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM