fa
Feedback
Compose Broadcast

Compose Broadcast

رفتن به کانال در Telegram

Все о Jetpack Compose и Compose Multiplatform YouTubе канал: https://youtube.com/androidBroadcast Android - @android_broadcast iOS - @ios_broadcast Kotlin - @kotlin_broadcast

نمایش بیشتر
5 931
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-47 روز
+1530 روز
آرشیو پست ها
🤖 Android-приложение — это не только красивый экран. За ним стоят работа с внешним API, загрузка данных, разделение логики п
🤖 Android-приложение — это не только красивый экран. За ним стоят работа с внешним API, загрузка данных, разделение логики по слоям и архитектура, которую можно поддерживать без хаоса в коде. 🗓 2 июля в 20:00 МСК открытый вебинар в преддверии старта курса «Android-разработчик. Базовый уровень» пройдём полный цикл: — от запроса к серверу; — до загрузки фото и описания; — через слои по принципам Clean Architecture и MVVM. Покажем, как именно данные добираются до экрана и что с ними происходит по пути. ➡️ Вебинар подойдёт тем, кто начинает карьеру в Android-разработке и хочет понять, как создаются приложения в реальной работе. ➡️ Регистрируйтесь и разберитесь, как связать сервер, архитектуру и экран в одном Android-приложении. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

⚙️ 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 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 с двумя фичами, которые доделываю
⚙️ 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

⚙️ Compose Navigation Graph: вся навигация приложения интерактивной картой прямо в Android Studio Плагин от skydoves (Jaewoong Eum). Аннотируешь экраны @NavDestination, @NavEdge, @NavGraphRoot, KSP статически собирает граф, а IDE-плагин рисует карту: каждый экран отрендеренной @Preview-миниатюрой через Layoutlib, без эмулятора. Переходы стрелками, двойной клик прыгает в исходник, граф мёржится по всем модулям. Канвас редактируемый — тянешь связь от экрана к экрану, и плагин сам вписывает @NavEdge в код. Работает с Navigation 3, Navigation 2 и даже голыми Activity. KMP из коробки: аннотации в commonMain, есть сэмпл на KotlinConf-приложении (26 экранов, 36 переходов). Бонусом .nav baseline по аналогии с apiDump/apiCheck: navCheck валит сборку, когда граф разъезжается с закоммиченным базелайном. #Compose #AndroidStudio

Вам нужен Liquid Glass эффект в Compose Multiplatform?
Anonymous voting

⚙️ JetBrains выкатили статью в документации как использовать Liquid Glass эффект из iOS 26 и Compose на iOS. Всё сводится к б
⚙️ JetBrains выкатили статью в документации как использовать Liquid Glass эффект из iOS 26 и Compose на iOS. Всё сводится к более точечному встраиванию Compose экранов в iOS Controller и перекладывание навигации на нативные элементы. #Compose #iOS #iOS26 #LiquidGlass

Repost from Aurora Developers
Представлена альфа-версия 0.0.4 проекта адаптации Compose Multiplatform для ОС Аврора Проведена глубокая работа над инструмен
+1
Представлена альфа-версия 0.0.4 проекта адаптации Compose Multiplatform для ОС Аврора Проведена глубокая работа над инструментарием, экосистемой и стабильностью фреймворка, чтобы разработчики могли комфортно создавать мобильные приложения для доверенной операционной системы используя привычный инструментарий — язык программирования Kotlin. Альфа-версия фреймворка Compose Multiplatform опубликована в репозитории mos.hub под открытой лицензией. Каждый желающий имеет возможность внести свой вклад и, тем самым, повлиять на развитие проекта. Главные изменения в альфа-версии 0.0.4 проекта адаптации Compose Multiplatform для ОС Аврора: Инструментарий разработчика • Aurora Build — Gradle-плагин для сборки проектов под ОС Аврора • Aurora Devices — Gradle-плагин для запуска приложений на устройстве и в эмуляторе Расширение возможностей фреймворка • Поддержка системного буфера обмена • Поддержка ресурсов • Поддержка локализации приложений Поддержка новых платформ для разработки • Добавлена поддержка Windows • Добавлена поддержка macOS (частичная) Экосистема и библиотеки • Новая библиотека для работы с D-bus из Kotlin и поддержка популярных библиотек build-konfig, datetime, kamel, kermit, koin, ktor и sqldelight Качество и стабильность • Исправлены проблемы с многопоточностью • Добавлена поддержка Unit и интеграционного тестирования. Все компоненты экосистемы Kotlin для ОС Аврора получают поддержку многоуровневого тестирования в рамках стабилизации Референсные приложения • Опубликовано референсное приложение StudentBox CMP Новая версия уже доступна для разработчиков.Пробуйте прямо сейчас — все примеры и API в документации.
Хотите помочь проекту стать лучше? Присоединяйтесь к разработке на mos.hub. Мы открыты к вашему коду и экспертизе. Вместе мы сможем сделать инструмент максимально полезным для всего сообщества. Ссылка на репозиторий
#АврораОС @AuroraDevelopers

+1
Протестировал новый ввод на iOS из Compose 1.11.0. Становится нативнее по поведению, но вот надо проверять на iOS смартфоне тем кто им регулярно пользуется #Compose #iOS

Repost from Android Broadcast
‼️ Android View всё! Да здравствует Compose! Google официально объявила о переходе к стратегии «Compose-first» и прекращении
‼️ Android View всё! Да здравствует Compose! Google официально объявила о переходе к стратегии «Compose-first» и прекращении развития Android View, переводя его в режим поддержки. Что это значит: 👉 Классы android.widget.* в Android SDK будут находиться в режиме поддержки. 👉 Библиотеки Android Jetpack (включая RecyclerView) также переходят в режим поддержки. 👉 Все инструменты в Android Studio будут создаваться только для Compose. 👉 Документация будет писаться только для Compose, однако некоторые разделы про View останутся. 🔗 Источник - оф сайт Android Developers #Android #AndroidDev #Compose

⚙️ Compose Multiplatform 1.11.0 вышел Главные фичи: 1️⃣ Нативный text input на iOS через UIView, UITextInput и UIKeyInput (экспериментально) 2️⃣ v2 API для Compose UI-тестов на не-Android таргетах 3️⃣ Переписанный с нуля скроллинг на Web Breaking изменения, которые заденут почти всех: 👉 Минималка Kotlin поднята до 2.3.10 👉 Минимальная iOS теперь 14 (поддержка 13 ушла) 👉 iosX64 и macosX64 удалены полностью 👉 Shader на не-Android стал wrapper-классом Я ждал нативный input на iOS с того момента, как Compose туда заехал. Текущая реализация на Skia всегда чувствовалась чужой на ощупь, особенно при сложном выделении и системных меню. Надо пробовать! #compose #cmp #kotlin

⚙️ Compose 1.11: Composition host defaults — мелочь, важная для KMP В апрельском релизе Jetpack Compose под номером 1.11 в compose-runtime завезли четыре новых API: HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey и ViewTreeHostDefaultKey. Плюс билдер compositionLocalWithHostDefaultOf для авторов библиотек. Он позволяют объявить CompositionLocal, у которого дефолтное значение резолвится из окружения хоста — например, через Android View tag'и (как это делает ViewTreeLifecycleOwner или ViewTreeOnBackPressedDispatcherOwner). Раньше для такого паттерна была обязательна зависимость на compose-ui. Теперь только compose-runtime. Раньше чтобы из библиотеки достать значение из View tree, приходилось тянуть compose-ui ради LocalView и платформенные функции поиска по дереву View. Код жил в Android-сорсах, в commonMain такое не положишь:
    // androidMain — compose-ui + Android-only API
    val LocalMyOwner = compositionLocalOf<MyOwner?> { null }

    @Composable
    fun ProvideMyOwner(content: @Composable () -> Unit) {
        val view = LocalView.current
        val owner = remember(view) {
            view.findViewTreeMyOwner()
        }
        CompositionLocalProvider(LocalMyOwner provides owner) {
            content()
        }
    }
С новым API описание CompositionLocal живёт в commonMain и тянет только compose-runtime. Связку с View tree описывает ViewTreeHostDefaultKey, и хост сам отдаёт значение через своего провайдера:
    // commonMain — только compose-runtime
    val MyOwnerKey = ViewTreeHostDefaultKey<MyOwner>(
        viewTagId = R.id.view_tree_my_owner
    )

    val LocalMyOwner = compositionLocalWithHostDefaultOf(MyOwnerKey)

    // Использование — без изменений
    @Composable
    fun MyComponent() {
        val owner = LocalMyOwner.current
        // ...
    }
Теперь авторы Compose библиотек могут держать определение CompositionLocal в общем модуле без зависимости на compose-ui. Профит - меньше транзитивных зависимостей в KMP-библиотеках и более чистое разделение слоёв runtime и UI. #Compose #CMP

👨🏻‍💻Разработчик сейчас не просто пишет код. От вас ждут проектирования процессов, принятия архитектурных решений и управле
👨🏻‍💻Разработчик сейчас не просто пишет код. От вас ждут проектирования процессов, принятия архитектурных решений и управления сложными системами. ☝️На открытом вебинаре разберём: ✔️ как меняется роль Kotlin-разработчика ✔️ почему сегодня важно уметь работать не только с кодом, но и с бизнес-процессами и ИИ-агентами ✔️ покажем, как подходить к проектированию бизнес-логики ✔️как строить управляемые системы ✔️как использовать Kotlin для создания гибких решений. 💡Обсудим, как современные инструменты позволяют одному специалисту закрывать задачи, которые раньше требовали команды. Это практический взгляд на развитие: от исполнителя к инженеру, который влияет на продукт и архитектуру. 🗓 Открытый вебинар 20 мая в 19:00 МСК в преддверии старта курса «Проектирование и разработка Kotlin-бэкенда». 🔗 Регистрация по ссылке Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

👨🏻‍💻Разработчик сейчас не просто пишет код. От вас ждут проектирования процессов, принятия архитектурных решений и управле
👨🏻‍💻Разработчик сейчас не просто пишет код. От вас ждут проектирования процессов, принятия архитектурных решений и управления сложными системами. ☝️На открытом вебинаре разберём: ✔️ как меняется роль Kotlin-разработчика ✔️ почему сегодня важно уметь работать не только с кодом, но и с бизнес-процессами и ИИ-агентами ✔️ покажем, как подходить к проектированию бизнес-логики ✔️как строить управляемые системы ✔️как использовать Kotlin для создания гибких решений. 💡Обсудим, как современные инструменты позволяют одному специалисту закрывать задачи, которые раньше требовали команды. Это практический взгляд на развитие: от исполнителя к инженеру, который влияет на продукт и архитектуру. 🗓 Открытый вебинар 20 мая в 19:00 МСК в преддверии старта курса «Проектирование и разработка Kotlin-бэкенда». 🔗 Регистрация по ссылке Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

⚙️ FlexBox Layout в Jetpack Compose 1.11.0 - построение динамической сетки из компонентов В составе androidx.compose.foundation:layout 1.11.0 появился компонент FlexBox. Компоновка на основе правил CSS Flexbox. Поддерживает перенос элементов (wrap), веса (weight), выравнивание по главной и поперечной осям. Сразу вышел с поддержкой Compose Multiplatform.
FlexBox(
    modifier =
      Modifier.fillMaxWidth(),
    config = {
        flexDirection = Row
        flexWrap = Wrap
        justifyContent = SpaceBetween
    }
) {
    repeat(items.size) { index ->
        Text(
            text = items[index],
            modifier =
              Modifier.weight(1f)
        )
    }
}
🔗 Анонс в блоге Android Developers 🔗 API Reference #Compose #CMP

⚙️ splashify - библиотека для интеграции splash экрана в приложении на Compose Desktop #Compose #Desktop

⚙️ Новинка Compose 1.11: неленивый Grid До сих пор для сеток у нас были только ленивые LazyVerticalGrid / LazyHorizontalGrid.
+1
⚙️ Новинка Compose 1.11: неленивый Grid До сих пор для сеток у нас были только ленивые LazyVerticalGrid / LazyHorizontalGrid. Но если все элементы уже в памяти (небольшое количество) и нужен точный контроль над расположением ячеек — пригождается новый экспериментальный Grid.
// Пример
Grid(config = {
    column(100.dp)
    column(1.fr) // забирает остаток строки
    row(50.dp)
    row(80.dp)
    gap(8.dp)
}) {
    Box(Modifier.gridItem().fillMaxSize()) { ... }
    Box(Modifier.gridItem().fillMaxSize()) { ... }
    Box(Modifier.gridItem().fillMaxSize()) { ... }
    Box(Modifier.gridItem().fillMaxSize()) { ... }
}
Работает на Android и KMP (iOS, Desktop, Web) – общий API 🔗 Документация по Grid #Compose #KMP #Android #iOS #Desktop #Web #CMP

🤖 Styles API в Compose: революция в кастомизации UI До недавнего времени стилизация компонентов в Compose делалась через параметры Composable функции (color = ..., padding = ...) или модификаторы. Это работало, но могло приводить к: 👉 избыточным рекомпозициям при смене состояний; 👉 дублированию кода для разных вариаций кнопок/карточек; 👉 сложностям с анимацией переходов между стилями. Google представил Styles API (экспериментальный, о причинах такого статуса ниже) — новый подход, вдохновлённый CSS. Ключевые возможности 1️⃣ Производительность Стили вычисляются на этапах layout и drawing, минуя composition. Это значит, что изменение стиля (например, при наведении) не вызывает рекомпозицию родительских компонентов. 2️⃣ Работа с состояниями Без кучи if/else и animate*AsState. Просто описываете стиль для каждого состояния (нажат, сфокусирован, включён, ошибка и т.д.). 3️⃣ Встроенные анимации Переходы между состояниями анимируются автоматически с физическими параметрами (демпфирование, жёсткость). Не нужно писать Animatable или Transition.
// Пример использования стиля
// Определяем стиль для кнопки
val buttonStyle = Style {
    default {
        backgroundColor = Color.Blue
        shape = RoundedCornerShape(8.dp)
    }
    pressed {
        backgroundColor = Color.DarkBlue
        scale = 0.98f
    }
    disabled {
        backgroundColor = Color.Gray
        alpha = 0.5f
    }
}

// Используем
Button(
    onClick = { /* ... */ },
    style = buttonStyle, // ← вместо кучи параметров
    enabled = isEnabled
) {
    Text("Нажми меня")
}
style — новый параметр, который появляется у всех компонентов Material 3 и базовых (Box, Row, Column). ⚠️ Styles API не заменяет модификаторы Модификаторы остаются для позиционирования, кликов, размеров. Styles API заменяет только внутреннюю стилизацию (цвета, формы, тени, отступы внутри компонента). Это как разделение «темы» и «вёрстки». API остаётся экспериментальным пока на него полностью не перейдет Material 3 Compose, чтобы учесть все необходиcмоти API и не делать breaking changes. По работе оно уже стабильно, но вот изменения в коде, возможно, будут. 🔗 Официальная документация В целом с таким подходом уже привыкли работать в Android XML Layout, то почему бы сразу было его не использовать? Тем более в Compose плюсы очевидны! 💬 Пробовали уже играться со Styles API? Как вам идея отделить стили от композиции? Делитесь мнениями в комментариях 👇 #Compose #Material

// Пример использования
LookaheadAnimationVisualDebugging(
    overlayColor = Color(0x4AE91E63),
    isEnabled = true,
    multipleMatchesColor = Color.Green,
    isShowKeylabelEnabled = false,
    unmatchedElementColor = Color.Red,
) {
    SharedTransitionLayout {
        CompositionLocalProvider(
            LocalSharedTransitionScope provides this,
        ) {
            // your content
        }
    }
}
#Compose

⚙️ Отладка shared element анимаций в Compose 1.11 стала проще. Появилась функция LookaheadAnimationVisualDebugging, визуализирующая анимацию #Compose