ar
Feedback
Compose Broadcast

Compose Broadcast

الذهاب إلى القناة على Telegram

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

إظهار المزيد
5 912
المشتركون
لا توجد بيانات24 ساعات
-87 أيام
-430 أيام
أرشيف المشاركات
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

🐱 Адаптивный 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

⚙️ 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

JetBrains исследует Compose HTML для Server-Side Rendering (SSR) Frederik Pietzko из JetBrains решил проверить идею: что если Compose-компоненты рендерить в HTML на сервере, а не только в canvas/JS. Сейчас JVM в SSR почти всегда сидит на шаблонах. Параметры — строки, переименовал countitemCount и узнал об ошибке только в рантайме. В 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

⚙️ 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

⚙️ Новые релиз 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.
🚀 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 появилась экспериментальная реализация 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 всегда имеет приоритет над программной установкой.

⚙️ Улучшения текстовых полей в 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, сохранённые учётные данные — прямо из поля ввода. 👉 Новые KeyboardTypeDateTimeDateTimeSignedDecimal. 👉  BasicSecureTextField теперь по умолчанию использует TextObfuscationMode.System #Compose

🚀 В Compose 1.12.0 прокачали производительность и по бенчмарку Google, на котором тестируются все версии, уже сравнялись с V
🚀 В 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️⃣ 5 лет назад вышел Jetpack Compose 1.0
5️⃣ 5 лет назад вышел Jetpack Compose 1.0

🔥 БИТВА ТЯЖЕЛОВЕСОВ: Spring Boot 4, Quarkus, Micronaut, Kotlin Multiplatform, Go и Rust. Выбрать технологию «по душе» — роск
🔥 БИТВА ТЯЖЕЛОВЕСОВ: Spring Boot 4, Quarkus, Micronaut, Kotlin Multiplatform, Go и Rust. Выбрать технологию «по душе» — роскошь. В прод-среде за ошибку в выборе платформы платят деньги: за память, за холодный старт, за бесконечный дебаг. 🗓 5 августа в 20:00 на открытом вебинаре курса «Проектирование и разработка Kotlin-бэкенда» мы берем 6 технологий: 🍃 Spring Boot 4 ⚡️ Quarkus & Micronaut 🧩 Kotlin Multiplatform Native 🦀 Go & Rust И ставим их в одинаковые условия. Запустим одну вычислительную нагрузку и честно сравним: ✔️Скорость старта (кто «летает», а кто «прогревается»). ✔️ Потребление памяти (считаем каждый мегабайт). ✔️ RPS (производительность под ударной нагрузкой). Вы узнаете, когда переход на нативный код — это необходимость, а когда — просто хайп. 👉 Ссылка для регистрации на вебинар ❗️Не для маркетологов. Для инженеров, которые считают циферки. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🏝 Всем, кто ждал Kotlin 2.4.10 для обновления на новую версию языка — обновляйтесь! Из того, что реально касается продакшн-к
🏝 Всем, кто ждал Kotlin 2.4.10 для обновления на новую версию языка — обновляйтесь! Из того, что реально касается продакшн-кода - исправлена регрессия в Compose Compiler: классы, которые раньше считались stable, в 2.4.0 иногда определялись как runtime/Uncertain. Если недавно обновились на 2.4.0 и столкнулись со странными лишними рекомпозициями — обновляйтесь на новую версию. #Kotlin #Compose