Compose Broadcast
5.42K subscribers
305 photos
84 videos
508 links
Все о Jetpack Compose и Compose Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Android - @android_broadcast
iOS - @ios_broadcast
Kotlin - @kotlin_broadcast
Download Telegram
Forwarded from Kotlin Adept Notes (Alex Panov)
📣 По вашим заявкам сделал небольшую библиотеку для декларативного показа снекбаров.

Преимущества библиотеки:
🟢 Полностью декларативный API, забудьте про one-time события и их обработку в LaunchedEffect.
🟢 Можно сделать как один глобальный обработчик, так и множество вложенных.
🟢 Благодаря встроенным модификаторам важный UI не будет перекрываться снекбаром.
🟢 Можно отображать снекбар как внизу, так и вверху экрана.
🟢 Поддерживаются любые типы сообщений, а не только строки.
🟢 Нет зависимости от Material, отображайте любой UI, какой захотите.
🟢 Настраиваемые анимации появления и скрытия снекбара.
🟢 Поддерживаются Android, iOS и JVM-таргеты.
🟢 Простая интеграция с Decompose.

🌐 Инструкцию по подключению, сэмпл и исходный код смотрите в репозитории.

Звёздочки на репозиторий и репосты приветствуются!

#Compose #Snackbar #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53👍154🤯3
⚙️ Пример(EN,5м) реализации компонента диалога с поиском в Compose

🔗 Альтернативная ссылка

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
🚀 Jetpack Compose 1.9.0 на финишной прямой - вышла первая RC версия

Обновляем BOM файл для тех кто не боится Beta
dependencies {
implementation(platform("androidx.compose:compose-bom-beta:2025.07.01")
}


#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
14
⚙️ retain {} в Compose для сохранения данных между входами в композицию

В репозитории Compose ведутся работы над тем, чтобы добавить API retain {}, которое в отличие от remember будет запоминать данные дольше (между входами и выходами в композиции, подобно как сохранение через ViewModel)

val user = retain { someData() }

@Composable
public inline fun <reified T> retain(
noinline calculation: @DisallowComposableCalls () -> T
): T


Больше подробностей в 📃 статье (EN,6м). Также доступна по 🔗 альтернативной ссылке

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯70👍15🔥5👏2
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 Scratchify - Compose Multiplatform библиотека для добавления эффекта стирания

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51🤯13🤔7
Пример использования Scratchify
@Composable
fun BasicScratchCard() {
val controller = remember { ScratchifyController() }

Scratchify(
modifier = Modifier.size(300.dp, 200.dp),
config = ScratchifyConfig(),
controller = controller,
contentToReveal = {
Box(
modifier = Modifier
.fillMaxSize()
.background(Color(0xFFFFD700)),
contentAlignment = Alignment.Center
) {
Text("🎉 You Won! 🎉", style = MaterialTheme.typography.headlineMedium)
}
},
overlayContent = {
Box(
modifier = Modifier
.fillMaxSize()
.background(Color(0xFF8E24AA)),
contentAlignment = Alignment.Center
) {
Text("Scratch Here!", color = Color.White)
}
}
)
}
14
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ История (20м) как в Dodo переписали компонент слайдера на Compose. До этого он был на MotionLayout.

Причина - куча багов, которые не получалось решить, а также на Compose писать проще.

По итогу реализовали свой Layout, чтобы сделать иерархию плоской и было меньше рекомпозиций.
@Composable  
fun FastPaymentButton(
fastPaymentState: FastPaymentState,
modifier: Modifier = Modifier,
thumbContent: @Composable BoxScope.() -> Unit = {},
background: @Composable () -> Unit = DefaultFastPaymentButtonBackground,
// Параметры будут добавляться по мере обогащения слайдера фичами
onClick: () -> Unit = {},
onSwiped: () -> Unit = {},
) {
// Content
}


#compose #android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥49👍9
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Yandex Mobile Runtime: фестиваль практики для мобильных разработчиков

23 августа | Только офлайн

💡 Это новый формат встреч мобильного сообщества — без докладов, но с практикой и обменом опытом с сообществом.

🔥 Вы сможете посоревноваться в AI-хакатоне, обсудить карьерный трек с экспертами Яндекса, прокачаться на воркшопах по MCP и ускорению и приложений и принять участие в дискуссии от Городских сервисов Яндекса про метрики, тестирование и BDU. А ещё можно будет отдохнуть в зоне общения и настолок от команды Поиска и посетить кастомный бар от Яндекс 360.

🤖 Пока ждете фест — можете воспользоваться ботом для мобильных разработчиков: @ya_runtime_bot

⚡️ Он позволит отвлечься от рутины: решайте задачки и сохраняйте полезные материалы — гайды, кейсы и доклады, которые собрали эксперты из Яндекса.

👉 Регистрируемся на фест тут.
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2🤔2
Composable функция чем-то схожа с тем как работает suspend функция, только указывается особенность не через ключевое слово языка, а аннотацию из библиотеки. При компиляции кода происходит трансформация объявленной функции в код, который будет способен отобразить что-то на экране и обновляться. Удивительный мир магии плагина компилятора.

После пребразования получаются разные Node, узлы где есть вызовы Composable функций, выстроенные в иерархию. Подробнее в статье ⚙️ Что делается с Composable функцией, чтобы она работала в приложении (EN,5м) или по альтернативной ссылке

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍304
⚙️ RetainedEffect - новый side effect в Compose, который позволит сохранять данные, когда покидается композиция, но в неё скоро вернутся. Например, поворот экрана в Android. Некий аналог сохранения данных в памяти, как это делается с ViewModel.

Также разрабатывают схожее API retain {}

Пример использования RetainedEffect:
@Composable
@NonRestartableComposable
public fun RetainedEffect(key1: Any?, effect: RetainedEffectScope.() -> RetainedEffectResult) {
retain(key1) { RetainedEffectImpl(effect) }
}

public class RetainedEffectScope {
public inline fun onRetired(crossinline onRetiredEffect: () -> Unit): RetainedEffectResult =
object : RetainedEffectResult {
override fun retire() {
onRetiredEffect()
}
}
}


Кажется, что Compose хочет избавится от ViewModel и напрямую работать с получением данных без ViewModel. Как вам такой подход?

#composable
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔52🔥18🤯6👍51
⚙️ В Compose появилось ограничение максимального состояния жизненного цикла

В следующей версии Jetpack Lifecycle добавили новую функцию, которая позволяет переопределить LifecycleOwner и задать максимальное состояние:
@Composable
fun LifecycleOwner(
maxLifecycle: State = RESUMED,
parentLifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
content: @Composable () -> Unit,
)


💡 Зачем это нужно?
Идея пришла из поддержки адаптивного UI в Jetpack Navigation 3. Теперь можно строить интерфейсы, которые одинаково хорошо работают и на смартфонах, и на больших экранах.

📌 Пример: многопанельный UI, где одна панель отображается, а вторая — скрыта, потому что не влезла на экран. Логично, что их Lifecycle будет разным. Но раньше стандартный LifecycleOwner был жёстко привязан к Activity или Fragment, без учета реальной видимости конкретного UI-компонента.

📹 Подробнее про возможности Navigation 3 я рассказал в отдельном видео.

А вы уже видите, где можно применить эту фичу в своем проекте? Делитесь идеями в комментариях 👇

#compose #adaptive #ui
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔27🔥9
⚙️ Вышел Jetpack Compose 1.9.0 Stable

Вышла следующая стабильная версия UI фреймворка для Android. Что нового:

👉 Появилась модификаторы для работы с тенями Modifier.dropShadow() и Modifier.innerShadow(). Уже существующий Modifier.shadow() рисует тень за объектом, а новые модификаторы добавят тень внутри.

👉 Более производительный способ отслеживать положения элементов на экране с помощью Modifier.onLayoutRectChanged()

👉 Добавили поддержку скролла в двух направлениях сразу (например как скролл карты или фото). Используйте Draggable2D и Scrollable2D API

👉 Улучшили работу скролла скролл при использованием VIew с Compose

👉 Добавили опцию для включения большего количества информации при анализе крешей в Compose
class App : Application() {
override fun onCreate() {
Composer.setDiagnosticStackTraceEnabled(BuildConfig.DEBUG)
}
}


👉 Аннотации @Stable, @Immutable и @StableMarker выделили в отдельный артефакт runtime-annotation, чтобы можно было использовать их в модулях без Compose

👉 Новые аннотации @RememberInComposition и @FrequentlyChangingValue (подробнее в отдельном посте)

Много улучшений в LazyLayout
👉 Стабилизация API для создания собственных Lazy компонентов
👉 Значительное ускорение производительности скролла Lazy List и Lazy Grid благодаря механизму предзагрузки (prefetch). Надо использовать LazyLayoutCacheWindow
@Composable
private fun LazyColumnCacheWindowDemo() {
val dpCacheWindow = LazyLayoutCacheWindow(ahead = 150.dp, behind = 100.dp)
val state = rememberLazyListState(cacheWindow = dpCacheWindow)
LazyColumn(state = state) {
items(count) { Text(text = "$it", fontSize = 80.sp) }
}
}


Конечно же новая версия Compose - это повышение скорости работы и исправление багов для более плавного UI

Обновляем BOM файл в зависимостях вашего проекта для получения свежей версии:
// build.gradle.kts
dependencies {
implementation(platform("androidx.compose:compose-bom:2025.08.00"))
}


#compose #android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥526👍2
Compose Broadcast pinned «⚙️ Вышел Jetpack Compose 1.9.0 Stable Вышла следующая стабильная версия UI фреймворка для Android. Что нового: 👉 Появилась модификаторы для работы с тенями Modifier.dropShadow() и Modifier.innerShadow(). Уже существующий Modifier.shadow() рисует тень за…»
⚙️ Новые аннотации в Compose для повышения качества написания Compose

В Compose 1.9 появились новые аннотации на основе которых будут работать Android Lint проверки:

✔️ @RememberInComposition - помечает конструктор или функцию, что внутри composition их нельзя вызывать напрямую — только через remember.

📝 Когда использовать:
- Если API возвращает состояние или изменяемый объект, который нужно переиспользовать между composition.
- Если возвращается объект, чья идентичность важна (например, ключ для другой API).
- Если создание объекта дорого по ресурсам и нужно кешировать.


✔️ @FrequentlyChangingValue предупреждает, что получение значения (функции или геттера) может вызвать много перерисовок из-за частого обновления значения (например, при использовании положения скролла или анимаций).

📝 Как избежать лишних перерисовок:
- Используйте derivedStateOf — фильтруйте изменения состояния, реагируя только на нужные.
- Используйте snapshotFlow + LaunchedEffect — работайте с изменениями без рекомпозиции.
- В UI-компонентах читайте значение на стадии measure / layout / draw, чтобы вызывать только инвалидацию нужной фазы, а не всю рекомпозицию.
- Делайте анализ работы вашего кода, например через Layout Inspector


Всем рекомендую озаботится аннотированием общего API Compose кода ваших проектов и регулярно запускать Android Lint, чтобы предотвратить ошибки, негативно влияющие на скорость работы UI

#compose #ui #производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍356