ru
Feedback
Compose Broadcast

Compose Broadcast

Открыть в Telegram

Все о Jetpack Compose и Compose Multiplatform По сотрудничеству - @ab_manager

Больше
5 890
Подписчики
+324 часа
-97 дней
-1830 дней

Загрузка данных...

Привлечение подписчиков
сентябрь '26
сентябрь '26
+17
в 0 каналах
август '26
+44
в 2 каналах
Get PRO
июль '26
+35
в 1 каналах
Get PRO
июнь '26
+48
в 2 каналах
Get PRO
май '26
+74
в 0 каналах
Get PRO
апрель '26
+91
в 1 каналах
Get PRO
март '26
+71
в 2 каналах
Get PRO
февраль '26
+51
в 1 каналах
Get PRO
январь '26
+47
в 0 каналах
Get PRO
декабрь '25
+104
в 2 каналах
Get PRO
ноябрь '25
+62
в 0 каналах
Get PRO
октябрь '25
+298
в 3 каналах
Get PRO
сентябрь '25
+106
в 5 каналах
Get PRO
август '25
+76
в 1 каналах
Get PRO
июль '25
+54
в 1 каналах
Get PRO
июнь '25
+53
в 1 каналах
Get PRO
май '25
+162
в 7 каналах
Get PRO
апрель '25
+109
в 3 каналах
Get PRO
март '25
+74
в 1 каналах
Get PRO
февраль '25
+110
в 2 каналах
Get PRO
январь '25
+81
в 0 каналах
Get PRO
декабрь '24
+254
в 2 каналах
Get PRO
ноябрь '24
+116
в 2 каналах
Get PRO
октябрь '24
+255
в 2 каналах
Get PRO
сентябрь '24
+121
в 1 каналах
Get PRO
август '24
+199
в 1 каналах
Get PRO
июль '24
+108
в 1 каналах
Get PRO
июнь '24
+153
в 1 каналах
Get PRO
май '24
+269
в 4 каналах
Get PRO
апрель '24
+393
в 5 каналах
Get PRO
март '24
+159
в 3 каналах
Get PRO
февраль '24
+197
в 3 каналах
Get PRO
январь '24
+220
в 2 каналах
Get PRO
декабрь '23
+130
в 3 каналах
Get PRO
ноябрь '23
+116
в 4 каналах
Get PRO
октябрь '23
+379
в 3 каналах
Get PRO
сентябрь '23
+67
в 0 каналах
Get PRO
август '23
+2 598
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
16 сентября0
15 сентября+3
14 сентября0
13 сентября0
12 сентября0
11 сентября+1
10 сентября0
09 сентября+1
08 сентября+3
07 сентября+4
06 сентября0
05 сентября+2
04 сентября+1
03 сентября0
02 сентября0
01 сентября+2
Посты канала
⚙️ Вышел Compose HotSwan 2.0.0 - Hot Reload для Android, iOS и Desktop. В новой версии прокачали движок определения изменений. Полезно как для людей, так и для разработки с AI агентами, так как не приходится прокликивать приложение до экрана при каждых изменениях, что экономит токены. 💰Решение платное - 5$/месяц, есть триал на 2 недели. 💬 Если кто уже пробовал - делитесь опытом в комментариях #Compose #CMP #Android #Desktop #iOS

2
⚙️ Compose Web можно выложить как офлайн-приложение В Issue CMP-10781 в официальном баг-трекере CMP Константин Цховребов расписал рецепт офлайн-приложения Compose Web: после Gradle-задачи wasmJsBrowserDistribution отдельная задача (исходный код в issue) копирует статику, вычисляет SHA-256 по путям и содержимому и генерирует service-worker.js. Что получается на практике: 👉 index.html, JS, Wasm и Compose Resources кладутся в Cache Storage 👉 SW перехватывает только эти файлы 👉 запросы к API идут в сеть как обычно 👉 новая сборка меняет версию кэша и удаляет старый Ограничения: 👉 cache.addAll() падает, если не скачался хотя бы один файл из списка 👉 source maps тоже попадают в кэш, если не отфильтровать 👉 новая версия подхватится только при следующем запуске Это не официальная задача в плагине CMP и не «PWA из коробки», а лишь рецепт, который вполне может стать частью официального плагина в будущем. #Compose #CMP #Wasm
2 092
3
🚀 Вышла новая альфа-версия адаптации CMP для ОС Аврора (v0.0.5) Прошёл квартал — а значит, вышла новая альфа-версия адаптаци
🚀 Вышла новая альфа-версия адаптации CMP для ОС Аврора (v0.0.5) Прошёл квартал — а значит, вышла новая альфа-версия адаптации CMP для ОС Аврора. Рассказываем, что изменилось. 🛠 Инструментарий разработчика - Плагин для IntelliJ IDEA для быстрого старта - Автопринятие разрешений при запуске приложений - Возможность указать дополнительные файлы при сборке RPM ✨ Расширение возможностей фреймворка - Создания обложек приложения используя Compose - Открытие URI с системным диалогом выбора приложения - Поддержка ориентаций приложения - Новая библиотека адаптивных иконок ОС Аврора - Полная поддержка экранной клавиатуры — предиктивный ввод и автокоррекция 🚗 Аврора автомобильная - Поддержка обложек/виджетов - Улучшена стабильность работы фреймворка 📱 Референсные приложения - Новое демо-приложение «Погода» - Темплейт для быстрого старта разработки - Обновление всех демострационных приложений ✅ Качество и стабильность - Исправления и общая стабилизация фреймворка Новая версия уже доступна для разработчиков. Пробуйте прямо сейчас — все примеры и API в документации. 👉 Документация Проект по адаптации CMP для ОС Аврора продолжает развиваться как открытый проект на mos.hub — присоединяйтесь к разработке, чтобы внести свой вклад и повлиять на будущее фреймворка. Мы открыты к вашему коду и экспертизе. Только #ВМЕСТЕ мы сможем сделать инструмент максимально полезным для всего сообщества. 👉 Репозиторий
3 326
4
🐱 compose-recomposition-highlighter - отслеживание статистики рекомпозиций в Android Следит за теми Composable где проведете
🐱 compose-recomposition-highlighter - отслеживание статистики рекомпозиций в Android Следит за теми Composable где проведете инициализацию @Composable fun AppContent() { Box(modifier = Modifier.fillMaxSize()) { YourMainNavigation() // Attach floating Recomposition HUD & Bottom Sheet ComposeRecompositionOverlay() } } #Compose
3 442
5
⚙️ Анимация смены чисел на Compose. Как сделали тут #Compose #Анимация
⚙️ Анимация смены чисел на Compose. Как сделали тут #Compose #Анимация
3 451
6
⚙️ Compose Multiplatform 1.12.0 вышел, а tvOS в списке поддерживаемых платформ как не было, так и нет: Android, iOS, macOS, Windows, Linux, веб. Дыру закрывает compose-tvos, и интересен он не столько самим tvOS, сколько приёмом. Плагин через ComponentMetadataRule подвешивает available-at вариант с tvOS-klib к официальному org.jetbrains.compose.*. Дальше решает штатный variant resolution Gradle: tvOS-таргет забирает форк, а iOS/Android/Desktop продолжают резолвить артефакт JetBrains. Отдельно перехватывается маркер плагина через pluginManagement.resolutionStrategy.eachPlugin, чтобы работала упаковка Compose Resources. // settings.gradle.kts plugins { id("dev.sajidali.compose-tvos") version "1.3.0" } Всё, dependencies {} не меняешь. Приём годится далеко за пределами tvOS: так же можно подсунуть свою пересборку любой чужой библиотеки, у которой не хватает таргета. ⚠️ Под капотом форк 15 групп библиотек Compose и AndroidX, опубликованный одним человеком. Автор прямо пишет, что тянет его ровно настолько, насколько нужно для собственного приложения: ни обязательств, ни расписания релизов. Держать compose.runtime и compose.ui в проде из такого источника решение уровня «мы понимаем, на что подписались». Форк сейчас держит линию 1.12, но догонять апстрим ему придётся руками Смотреть стоит ради механики. Тащить в прод - явным фанатам поддержки tvOS из CMP. #Compose #ComposeMultiplatform #KMP #Gradle
2 958
7
⚙️ Compose Remote добрался до первой Альфы. Это реализация BDUI (верстка приходит с сервера) на основе Compose от Google! 💬
⚙️ Compose Remote добрался до первой Альфы. Это реализация BDUI (верстка приходит с сервера) на основе Compose от Google! 💬 Нужно ли оно вам? #Compose #Android #Remote #BDUI
4 397
8
⚙️ Новый выбор текста Compose 1.12 — SelectionContainer и SelectionState API В Compose 1.12 у SelectionContainer появился hoisted-state: SelectionState. Раньше весь механизм выделения был спрятан внутри текстовых полей. Теперь же стало возможно: 👉 читать выбранный текст реактивно 👉 выделять программно: всё / диапазон / по словам 👉 сбрасывать выделение 👉 искать цитату по всему контейнеру, даже если она размазана по нескольким Text // Один SelectionState нельзя шарить между несколькими SelectionContainer val state = rememberSelectionState() SelectionContainer(state = state) { Text("Text to be selected...") } val selectedTexts : List<AnnotatedString> = state.selectedTexts Text("Выбрано символов: ${selectedTexts.sumOf { it.text.length }}") По умолчанию перевод фокуса сбрасывает выделение, поэтому интерактивные элементы, которые не должны это сделать, стоит помечать Modifier.disableSelectionClearOnTap(). @Composable fun ProgrammaticSelectionExample() { val state = rememberSelectionState() Column { Button( onClick = { state.clear() }, modifier = Modifier.disableSelectionClearOnTap() ) { Text("Clear") } SelectionContainer(state = state) { Text("Text content to be selected programmatically.") } Text("Selected: ${state.selectedTexts.joinToString { it.text }}") } } #Compose
4 381
9
⚙️ Compose Multiplatform 1.12.0: AI агент наконец видит, что написал Вышел стабильный CMP 1.12.0. Главное в релизе - MCP в Co
⚙️ Compose Multiplatform 1.12.0: AI агент наконец видит, что написал Вышел стабильный CMP 1.12.0. Главное в релизе - MCP в Compose Desktop Hot Reload 1.2.0. Раньше агент правил @Composable вслепую: не знал, прошёл ли reload, что на экране, не упало ли. Теперь есть сервер с нормальными тулами. Поднимается таской, в .mcp.json достаточно hotMcpServer: { "mcpServers": { "compose-hot-reload": { "command": "./gradlew", "args": ["--no-daemon", "--quiet", "--console=plain", "hotMcpServer"] } } } Много фиксов и улучшений для Desktop, Web, iOS. Еще отдельно расскажу постами в @compose_broadcast 🔗 Полный список изменений #Compose #CMP #Desktop #AI
5 486
10
Vercel представил Agent Plugins 1.0.0 — открытый стандарт для плагинов, расширяющих AI-агентов Те, кто делал плагины для ИИ-кодинг-агентов, знают про неудобство с поддержкой плагинов для всех инструментов. Теперь должно стать легче! Agent Plugins — это общий, вендор-нейтральный стандарт упаковки Agent Skills (инструкции и ресурсы) и MCP-серверов (инструменты и сервисы) в единый дистрибутив. Как это работает? Плагин — это директория с манифестом plugin.json и фиксированной структурой: my-plugin/ ├── plugin.json ├── skills/ │ └── summarize/ │ ├── SKILL.md │ ├── scripts/ │ └── references/ ├── mcp.json └── com.example.client/ Клиенты проверяют plugin.json, находят Skills в skills/, а конфигурацию MCP — в mcp.json. Компоненты валидируются независимо — ошибка в одном не ломает другие. Ключевые особенности: 📦 Один пакет для всех клиентов — больше не нужно переупаковывать компонент под каждый формат. 🎯 Small on purpose — стандарт определяет только контракт обнаружения и загрузки, оставляя клиентам свободу в UX, политиках и инновациях. 🔧 Гибкость для клиентов — через механизм неймспейсов можно добавлять клиент-специфичные расширения без загрязнения общего формата. 🏢 Открытый мультивендорный проект — инициатива Vercel, доработанная совместно с AWS, Anysphere (Cursor), GitHub, Microsoft и OpenAI. Технический комитет состоит из AWS, Cursor, Microsoft, OpenAI и Vercel. Где уже поддерживается: - ChatGPT и Codex - Cursor - GitHub Copilot - Kiro - VS Code Плагины, упакованные по этому стандарту, автоматически работают во всех перечисленных клиентах. Для авторов расширений (подключение) — документация и схемы JSON на agent-plugins.org. Для разработчиков AI-агентов (интеграция формата) — чеклист соответствия в репозитории спецификации. #AI
3
11
🐱 Адаптивный UI в Compose Multiplatform через набор простый функций KitFlow — небольшая KMP-либа, которая показывает, как мо
🐱 Адаптивный UI в Compose Multiplatform через набор простый функций KitFlow — небольшая KMP-либа, которая показывает, как можно держать адаптив в одном месте. Главная идея — Adaptive.value(): val padding = Adaptive.value( sm = 12.dp, md = 16.dp, lg = 20.dp, tab = 24.dp, desktop = 28.dp ) То же самое для высоты кнопки, ширины карточки, scale шрифта, Boolean, цветов, любых кастомных значений. Есть Adaptive.layoutValue() (по текущей ширине, включая split-screen и resize) и Adaptive.onOrientationChange для портрета/ландшафта. Подключать как зависимость я не рекомендую. Всё, что там есть, легко реализовать самому, и тогда получаешь полную гибкость под свой дизайн-систем и breakpoints. А вот разобрать реализацию и вдохновиться будет полезно, особенно если пишешь shared UI под Android + iOS + Desktop + Web. Я еще для себя делал расширение в зависимости от таргет платформы. #Compose #CMP #Adaptive #UI
5 200
12
⚙️ mediaQuery в Compose: один вызов вместо кучи WindowSizeClass + posture + input Официально появился mediaQuery — лямбда, которая смотрит на текущий UiMediaScope и возвращает boolean. Внутри можно проверять: 👉 windowWidth / windowHeight 👉 windowPosture (Tabletop, Book, Flat) 👉 pointerPrecision (Fine → Coarse → Blunt → None) 👉 keyboardKind (Physical / Virtual / None) 👉 hasCamera / hasMicrophone 👉 viewingDistance (Near / Medium / Far) Включается одним флагом при запуске приложения: ComposeUiFlags.isMediaQueryIntegrationEnabled = true Для размеров, которые дёргаются часто, лучше использовать derivedMediaQuery (обёртка над derivedStateOf): // Composable code val narrowerThanMedium by derivedMediaQuery { windowWidth < WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND.dp } val narrowerThanExpanded by derivedMediaQuery { windowWidth < WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND.dp } when { narrowerThanMedium -> SinglePaneLayout() narrowerThanExpanded -> TwoPaneLayout() else -> ThreePaneLayout() } Самый чистый кейс — foldable в tabletop: // Composable code if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) { TabletopLayout() } else { FlatLayout() } Это API не замена WindowSizeClass, но удобный единый вход для всего, что меняется в рантайме. Если пишете адаптив под foldable / desktop / TV — возьмите на заметку. Пока не перенесли в Compose Multiplatform. Документация Media Query API #Compose #JetpackCompose #Adaptive #UI #Android
9 235
13
JetBrains исследует Compose HTML для Server-Side Rendering (SSR) Frederik Pietzko из JetBrains решил проверить идею: что если Compose-компоненты рендерить в HTML на сервере, а не только в canvas/JS. Сейчас JVM в SSR почти всегда сидит на шаблонах. Параметры — строки, переименовал count → itemCount и узнал об ошибке только в рантайме. В Compose это обычная Composable функция с типами: @Composable fun Card(title: String, count: Int) { Div({ classes("card") }) { H3 { Text(title) } Span { Text(count.toString()) } } } Rename ломает компиляцию, IDE подхватывает, autocomplete работает. Идея — добавить JVM-таргет в Compose HTML с renderToString / renderToBytes, чтобы один раз прогнать composition и получить строку HTML. Без браузера, без DOM, без recomposition и effects (как классический SSR). Важно! Это не roadmap и не commitment. Просто исследование Мне нравится направление. Если Compose HTML получит нормальный серверный рендер, у Kotlin наконец появится шанс на type-safe fullstack без ухода в JS-фреймворки. Пока же это просто интересный разговор, который стоит почитать. 🔗 [Источник](https://blog.jetbrains.com/kotlin/2026/08/exploring-compose-html-for-server-side-rendering/) #Compose #ComposeHTML #Kotlin #SSR
3 995
14
⚙️ MCP сервер в для Compose Desktop Hot Reload: агент сам видит UI и кликает В Compose Multiplatform 1.12.0-rc01 (через Compo
⚙️ MCP сервер в для Compose Desktop Hot Reload: агент сам видит UI и кликает В Compose Multiplatform 1.12.0-rc01 (через Compose Hot Reload 1.2.0) появился экспериментальный MCP-сервер для Hot Reload. Агент теперь может: 👉 reload — пересобрать и хотрелоудить 👉 take_screenshot — снять текущее окно 👉 get_semantic_tree — получить semantic tree (включая Dialog/Popup) 👉 click / type_text / scroll — симулировать ввод 👉 get_logs — читать runtime-логи и ошибки Подключается через Gradle-таску. В конфиге агента (.mcp.json): { "mcpServers": { "compose-hot-reload": { "command": "./gradlew", "args": [ "--no-daemon", "--quiet", "--console=plain", "hotMcpServer" ] } } } #Compose #CMP #Desktop #HotReload
4 593
15
⚙️ Новые релиз Material3 Adaptive 1.3.0 Новая библиотека adaptive-navigation3. Теперь можно легко строить адаптивные Material-интерфейсы в связке с Navigation 3. Что внутри: Scene Strategies 👉 ListDetailSceneStrategy + rememberListDetailSceneStrategy — канонический list-detail 👉 SupportingPaneSceneStrategy + rememberSupportingPaneSceneStrategy — supporting pane 👉 В ListDetailPaneScaffold и SupportingPaneScaffold. Теперь поддерживают margins и edge-to-edge. 🔄 RTL-поддержка для pane expansion. tive:adaptive-navigation3:1.3.0") 🔗 Полный changelog #AndroidDev #JetpackCompose #Material3
4 300
16
⚙️ В Compose 1.12.0 появилась экспериментальная реализация Slot Table на основе связного списка (LinkBuffer). Slot Table — это внутренняя структура данных, в которой Compose Runtime хранит всё дерево композиции: каждый Composable, каждое состояние remember, ключи и связи между элементами. С момента первого релиза Slot Table был реализован на основе Gap Buffer — структуры, вдохновлённой текстовыми редакторами. Gap Buffer хранит все группы в плоском IntArray с пустой областью (gap), которая перемещается к месту следующей записи. Его проблема что при удалении или переупорядочивании элементов gap должен переместиться к нужной позиции, копируя все элементы на своём пути. Для композиции с 1000 группами удаление группы №500 требует перемещения gap через 500 позиций. Переупорядочивание одного элемента в списке из 100 записей требует двух перемещений gap, каждое с копированием части массива. По итогу чем больше композиция, тем дороже структурные изменения. Новая экспериментальная реализация Slot Table на основе связного списка — LinkBuffer. Вместо плоского массива группы хранятся в виде связного списка с явными указателями на родителя, первого потомка и следующего соседа. Ключевое преимущество - структурные операции (удаление, перемещение, переупорядочивание) теперь требуют обновления указателей вместо копирования массивов. По тестам разработчиков переупорядочивание списков стало более чем в 2 раза быстрее. Большинство других операций стали примерно на 10% быстрее Флаг новой реализации отключён по умолчанию. Включить можно двумя способами: 1. Программно (только для debug-сборок): // ДО вызова setContent() ComposeRuntimeFlags.isLinkBufferComposerEnabled = true 2. Через R8/ProGuard (для release-сборок): -assumevalues public class androidx.compose.runtime.ComposeRuntimeFlags { static boolean isLinkBufferComposerEnabled return true; } В R8 release-сборках правило ProGuard всегда имеет приоритет над программной установкой. #Compose #UnderHood
4 397
17
Нет текста...
3 400
18
🚀 Kotlin DSL: от теории к практике и созданию JsonBuilder Одна из лучших фич Kotlin — возможность писать выразительные DSL.
🚀 Kotlin DSL: от теории к практике и созданию JsonBuilder Одна из лучших фич Kotlin — возможность писать выразительные DSL. Они превращают сложную бизнес-логику в читаемый код, похожий на естественный язык. Многие разработчики каждый день используют готовые DSL (например, в Gradle или Ktor), но не до конца понимают, как они устроены «под капотом». С этим можно разобраться на бесплатном вебинаре курса «Проектирование и разработка Kotlin-бэкенда». 🗓 Когда: 19 августа в 20:00 (мск) 🎯 Для кого: Kotlin-разработчики и тех, кто хочет выйти за рамки базового синтаксиса и понять главные фичи языка. Что будет на вебинаре? ☑️ Теория DSL: зачем нужны предметно-ориентированные языки и в каких сценариях они действительно экономят время. ☑️ Практика: с нуля напишем собственный JsonBuilder. ☑️ Инструменты языка: глубоко изучим лямбды с получателем (lambdas with receiver) и extension-функции. ☑️ Архитектура API: разберём, как создавать удобные, безопасные к типам и читаемые интерфейсы. 👉 Регистрация на вебинар тут Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
1 761
19
В Compose 1.12.0 появилась экспериментальная реализация Slot Table на основе связного списка (LinkBuffer). Это серьёзное изменение внутренней архитектуры Compose, которое влияет на производительность. Slot Table — это внутренняя структура данных, в которой Compose Runtime хранит всё дерево композиции: каждый Composable, каждое состояние remember, ключи и связи между элементами. С момента первого релиза Slot Table был реализован на основе Gap Buffer — структуры, вдохновлённой текстовыми редакторами. Gap Buffer (текущая реализация) хранит все группы в плоском IntArray с пустой областью (gap), которая перемещается к месту следующей записи. Проблема: при удалении или переупорядочивании элементов gap должен переместиться к нужной позиции, копируя все элементы на своём пути. 📉 Для композиции с 1000 группами удаление группы №500 требует перемещения gap через 500 позиций. Переупорядочивание одного элемента в списке из 100 записей требует двух перемещений gap, каждое с копированием части массива. Итог: чем больше композиция, тем дороже структурные изменения. Новая экспериментальная реализация Slot Table на основе связного списка — LinkBuffer. Вместо плоского массива группы хранятся в виде связного списка с явными указателями на родителя, первого потомка и следующего соседа. Ключевое преимущество: структурные операции (удаление, перемещение, переупорядочивание) теперь требуют обновления указателей вместо копирования массивов. 📈 Цифры: Переупорядочивание списков стало более чем в 2 раза быстрее Большинство других операций стали примерно на 10% быстрее ⚙️ Как включить? Флаг отключён по умолчанию. Включить можно двумя способами: 1. Программно (только для debug-сборок): kotlin // ДО вызова setContent() ComposeRuntimeFlags.isLinkBufferComposerEnabled = true 2. Через ProGuard (для release-сборок): pro -assumevalues public class androidx.compose.runtime.ComposeRuntimeFlags { static boolean isLinkBufferComposerEnabled return true; } В R8 release-сборках правило ProGuard всегда имеет приоритет над программной установкой.
4
20
⚙️ Улучшения текстовых полей в Compose 1.12.0 👉 В BasicTextField можно теперь программно применять SpanStyle и ParagraphStyle через edit { addStyle(...) }: state.edit { addStyle(SpanStyle(fontWeight = FontWeight.Bold), start = 0, end = 9) } Стили сохраняются при смене конфигурации. 👉 Программное управление выделением. Новый SelectionState с методами selectAll(),  clear(),  select(range) и extendSelectionByWord() val selectionState = rememberSelectionState() val characterCount = selectionState.selectedTexts.sumOf { it.text.length } Column { SelectionContainer(state = selectionState) { Column { BasicText(text = "Text to be selected...") } } if (characterCount > 0) { BasicText(text = "Characters selected: $characterCount") } } 👉 Текстовые поля теперь нативно поддерживают Android Credential Manager (API 34+) через семантическое свойство credentialRequest. Passkeys, сохранённые учётные данные — прямо из поля ввода. 👉 Новые KeyboardType: Date, Time, DateTime, SignedDecimal. 👉  BasicSecureTextField теперь по умолчанию использует TextObfuscationMode.System #Compose
3 155