Compose Broadcast
СтатистикаВсе о Jetpack Compose и Compose Multiplatform По сотрудничеству - @ab_manager
- Последний пост
- 12:24
- Последнее чтение
- 12:47
- Постов за неделю
- 9
- Всего постов
- 362
- Тип
- открытый
- Язык
- русский
- Категория
- Технологии (по похожим)
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 1 849
- 1/48двое суток
- 2 118
- 1/72трое суток
- 2 285
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
⚙️ MCP сервер в для Compose Desktop: агент сам видит 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
⚙️ Новый релиз 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
⚙️ В 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
видео или голосовое, без подписи
🚀 Kotlin DSL: от теории к практике и созданию JsonBuilder Одна из лучших фич Kotlin — возможность писать выразительные DSL. Они превращают сложную бизнес-логику в читаемый код, похожий на естественный язык. Многие разработчики каждый день используют готовые DSL (например, в Gradle или Ktor), но не до конца понимают, как они устроены «под капотом». С этим можно разобраться на бесплатном вебинаре курса «Проектирование и разработка Kotlin-бэкенда». 🗓 Когда: 19 августа в 20:00 (мск) 🎯 Для кого: Kotlin-разработчики и тех, кто хочет выйти за рамки базового синтаксиса и понять главные фичи языка. Что будет на вебинаре? ☑️ Теория DSL: зачем нужны предметно-ориентированные языки и в каких сценариях они действительно экономят время. ☑️ Практика: с нуля напишем собственный JsonBuilder. ☑️ Инструменты языка: глубоко изучим лямбды с получателем (lambdas with receiver) и extension-функции. ☑️ Архитектура API: разберём, как создавать удобные, безопасные к типам и читаемые интерфейсы. 👉 Регистрация на вебинар тут Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⚙️ Улучшения текстовых полей в 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
🚀 В Compose 1.12.0 прокачали производительность и по бенчмарку Google, на котором тестируются все версии, уже сравнялись с View. Очень хочется верить в то, что это реально, а также что это можно сделать просто без отладки и замера характеристик рендеринга. #Compose #Performance
⚙️ Compose Grid стал удобнее Теперь области можно задавать через имя в Grid в дополнение к индексу. Дайте областям имена и размещайте элементы с помощью gridItem(areaId = "header"): Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) Sidebar(modifier = Modifier.gridItem(areaId = "sidebar")) Content(modifier = Modifier.gridItem(areaId = "content")) } #Compose
видео или голосовое, без подписи
⚙️ Вышла стабильная версия Jetpack Compose 1.12.0! CMP уже подходе Для обновления просто обновите BOM implementation(platform("androidx.compose:compose-bom:2026.08.00")) ⚠️ Важно: требуется compileSdk = 37 и AGP 9.2.0+. В этом релизе: 🎨 Mesh‑градиенты и HDR 📐 Именованные области в Grid ✍️ Редактируемое форматирование текста 🎬 Двухстадийные анимации ⚡️ Ускоренный старт и Keyed SideEffect 🔧 Не обошлось без breaking changes В ближайших постах разберу каждую фичу подробно с примерами. Подпишись на @ComposeBroadcast, чтобы ничего не пропустить! Compose Multiplatform 1.12.0 уже на стадии RC #Compose #Android
видео или голосовое, без подписи
5️⃣ лет назад вышел Jetpack Compose 1.0
видео или голосовое, без подписи
🏝 Всем, кто ждал Kotlin 2.4.10 для обновления на новую версию языка — обновляйтесь! Из того, что реально касается продакшн-кода - исправлена регрессия в Compose Compiler: классы, которые раньше считались stable, в 2.4.0 иногда определялись как runtime/Uncertain. Если недавно обновились на 2.4.0 и столкнулись со странными лишними рекомпозициями — обновляйтесь на новую версию. #Kotlin #Compose
⚙️ Мигрировать на Navigation 3 можно, но только всё приложение разом. И это не единственная засада Честный кейс от разработчицы: она в одиночку перевела приложение на 170+ экранов с Nav2 на Nav3 🤯. Не пересказ доков, а грабли из прода. Объем работы: 302 файла (по сути весь app), 2 недели разработки с овертаймами, ~1.5 недели стабилизации, 1 хотфикс. Что стоит забрать себе ещё до старта: Поэтапно не выйдет. Обратной совместимости между Nav2 и Nav3 нет, мигрируешь либо всё сразу, либо никак. Отсюда огромный affected area и главная организационная боль: команда не фризила разработку, коллеги параллельно пилили новые экраны на старой навигации. Чем дольше тянешь, тем дороже разгребать merge-конфликты. Bottom Sheets из коробки в навигации нет. Пришлось городить обёртку вокруг entry<> с флагом в metadata и вручную разруливать, что рисовать через ModalBottomSheetLayout, а что через NavDisplay: val NavEntry<out NavKey>.isBottomSheet: Boolean get() = metadata["isBottomSheet"] as? Boolean == true NavDisplay( entries = navigationState.toEntries(mainEntryProvider) .filter { it.isBottomSheet.not() }, onBack = { navigator.goBack() }, ) Сейчас это решается официально через BottomSheetSceneStrategy, свой костыль автор потом выкинула. Мигрируешь сегодня — сразу проверь, что шторки ложатся на SceneStrategy, а не переоткрывай этот велосипед. ⚠️ И отдельный подвох: шторка часть стека, и если перед переходом на следующий экран не закрыть её руками, back вернёт её обратно. Легко забыть. Сериализация уронит тебя уже в проде. 💥 Всё, что прокидываешь через навигацию, должно быть @Serializable. Автор прокинула entryPoint: NavKey (чтобы при блокировке юзера возвращать на нужный экран через несколько назад), а сам NavKey сериализуемым не был: Fatal Exception: kotlinx.serialization.SerializationException Ловушка в том, что краш не в обычном флоу, а в отдельных сценариях восстановления, поэтому проходит ревью и ручные тесты, а ловится только у юзеров. 🔗 Полный разбор с кодом и схемами на Medium #Compose #Navigation3 #Android
📹 What's New in Compose Multiplatform | Sebastian Aigner and Márton Braun | Kotlin Conf 2026 37 минут от Sebastian Aigner и Marton Braun (JetBrains) про всё, что вышло за последний год. Хорошо структурированный доклад: общие изменения, потом iOS, потом Web. Ключевое: 👉 Navigation 3 — стабильный в CMP. Бэкстек это просто SnapshotStateList<NavKey>, которым управляешь сам. Адаптивные Scene-API, нативные iOS-жесты, browser history на Web из коробки. 👉 Compose Hot Reload — стабильный, встроен в новые проекты без настройки. Работает и с AI-агентами: IDE подхватывает правки в файлах и перезагружает UI сама. 👉 @Preview унифицировали: androidx.compose.ui.tooling.preview.Preview теперь работает в commonMain. Прошлые аннотации deprecated. 👉 iOS: параллельный render pipeline по умолчанию в 1.11 (+20% на сложных лейаутах), placedAsOverlay для нативных Liquid Glass-компонентов, полноценный нативный ввод с magnifier / translate / autofill / кастомными IME. 👉 Web (beta): HTMLElementView для HTML прямо в Composition, VoiceOver через семантику, Coil на web workers. 👉 Из цифр в докладе: Kuaishou (250M DAU) и Tencent Video (340M MAU) уже работают на CMP-экранах. По iOS-блоку видно, что команда за год реально закрыла большинство «но» для старта 0:00 Вступление: что такое Compose Multiplatform 2:04 Масштаб: Perk, Alipay, Kuaishou, Tencent 4:06 Демо: структура нового проекта 5:40 Compose Hot Reload 8:49 Паритет с Jetpack Compose 10:24 Navigation 3 16:05 Единая аннотация @Preview 17:39 iOS: новый pipeline рендеринга 19:43 iOS: Liquid Glass и overlay interop 27:00 iOS: нативный ввод текста 31:11 Web: HTML interop 33:46 Web: доступность и производительность 35:50 Итоги #ComposeMultiplatform #KMP #Navigation3 #KotlinConf
🐱 DrawBox 2.0: Compose-библиотека для рисования на KMP DrawBox работала как Android-only с 2021 года. В конце мая вышел 2.0.0-alpha02 с таргетами Android, iOS, JVM/Desktop и WASM. Живая демка работает прямо в браузере без установки. В 2.0 добавили: SVG и JSON экспорт, бесконечный канвас с зумом и паном, выделение и перетаскивание фигур, коннекторы, object eraser и Roborazzi тесты. Автор написал пост про перенос, и самый ценный кусок там не про KMP. Самая интересная часть - использование MVI. Один State, Intent на каждое действие, Reducer с (State, Intent) → State. После этого undo/redo - это стек из State, JSON-сериализация практически бесплатна, и логика платформ физически не может разъехаться. #Compose #KMP #ComposeMultiplatform
⚙️ skydoves выпустил Compose HotSwan v2 Beta для Android: заменить весь экран без рестарта приложения v1 умел одно — применять изменения значений без rebuild: цвет, padding, текст, размеры — результат за секунду, приложение живёт. Добавить composable, переставить layout, поменять control flow — всё это шло в полный rebuild. v2 убирает эту границу. Без рестарта приложения: добавляем и удаляем composable-функции, меняем структуру layout, переписываем conditional UI. И главное — заменяем целый экран на совершенно другой код. Навигационный стек и remember-состояние сохраняются. Технически v2 запускает изменения через собственный интерпретатор, обходя ограничения ART на переопределение классов — тот же подход, что у Flutter. При слишком глубоких изменениях деградирует плавно: сбрасывает composition с сохранением rememberSaveable и ViewModel, в крайнем случае рестартит Activity. Полный rebuild нужен только при изменении сигнатур функций, иерархии классов и inline-функций. В v2 также MCP-сервер: AI-агент триггерит reload, снимает скриншот с устройства, итерирует по вариантам. Claude Code и Cursor работают из коробки через file watcher. Поставить: IDE-плагин вручную с бета-канала Marketplace + Gradle-плагин 2.0.0-beta01: [plugins] hotswan-compiler = { id = "com.github.skydoves.compose.hotswan.compiler", version = "2.0.0-beta01" } Инструмент платный инструмент, лицензия и цены на hotswan.dev/pricing. Такого охвата hot reload в нативном Compose ещё не было. Аргумент Flutter про быстрый feedback loop заметно слабеет. #Compose #JetpackCompose #AndroidDev
🐱 Kamera 1.0: стабильная камера для Compose Multiplatform Камера в CMP это всегда возня с expect/actual и тремя платформенными бэкендами. Kamera (бывшая CameraK) закрывает это одним Compose-first слоем: один @Composable-вход, под капотом CameraX на Android, AVFoundation на iOS и JavaCV на Desktop. API реактивный, через состояние. Заводишь rememberCameraKState(), получаешь StateFlow<CameraKState> c ветками Initializing, Ready(controller, uiState) и Error, и рисуешь превью, когда камера готова: val cameraState by rememberCameraKState( config = CameraConfiguration( cameraLens = CameraLens.BACK, aspectRatio = AspectRatio.RATIO_16_9, ), ) when (val state = cameraState) { is CameraKState.Ready -> CameraPreviewView(state.controller) is CameraKState.Initializing -> CircularProgressIndicator() is CameraKState.Error -> Text(state.message) } Из коробки: зум, вспышка, фонарь, переключение линз (ultra-wide/telephoto на iOS), takePictureToFile() для прямого сохранения в файл. Сверху плагины, которые сами активируются на Ready: сохранение фото, QR/штрихкоды, OCR, запись видео с pause/resume и лимитом длительности, анализ кадров через analyzer. Главное в 1.0: починили то, что мешало брать в прод. На iOS фронталка отдавала тёмные кадры из-за бага в MemoryManager, хотя превью выглядело нормально. На Android фото оказывалось кропом вместо настроенного аспекта, теперь что видишь, то и снимаешь. Плюс вычистили утечки корутин в плагинах при ре-ините камеры. ‼️ Это молодая 1.0 и по сути проект одного мейнтейнера под Apache-2.0. Блокеры выше жили буквально до вчера, так что 1.0 это точка, где их закрыли, а не годы шлифовки. Desktop тянет JavaCV с нативными либами, это тяжело. Но если нужна камера в CMP без трёх реализаций руками, смотреть стоит. 🐱 GitHub #Compose #ComposeMultiplatform #KMP
⚙️ Compose Stability Analyzer 0.10.0: Stability Doctor и trace-all skydoves выпустил 0.10.0 с двумя фичами, которые доделывают логику инструмента. 1️⃣ Stability Doctor берёт все сигналы плагина (статику, Cascade, Reality Check, Blame) и выдаёт приоритизированный список: что чинить и в каком порядке. Без девайса — ESTIMATED (только статика), с live heatmap — MEASURED (ложные тревоги уходят вниз в рейтинге). Фиксы применяются двойным кликом с предпросмотром. 2️⃣ trace-all mode. Раньше Doctor получал runtime-данные только по @TraceRecomposition функциям, то есть видел не весь модуль. Trace-all инструментирует всё: composeStabilityAnalyzer { traceAll { enabled.set(true) threshold.set(2) variants.set(listOf("debug")) } } Release-сборки не трогает. Теперь рейтинг Doctor строится по реальным замерам на всём модуле, а не только там, где успел поставить аннотацию. Раньше надо было самому решать что смотреть и куда ставить аннотации. Теперь включаешь trace-all, запускаешь Doctor, получаешь список с конкретными fix'ами. 🔗 doveletter.dev 🐱 GitHub #Compose #Performance