Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on null in /var/www/tgoop/function.php on line 65
774 - Telegram Web
Telegram Web
This media is not supported in your browser
VIEW IN TELEGRAM
LazyTimetable - open source Jetpack Compose библиотека для реализация lazy расписания мероприятия или в школе/универе. Работает только на Android

#compose #android #opensource
👍17🤔13🔥32
Пример использования LazyTimetable
@Composable
fun LazyTimetable(
modifier: Modifier = Modifier,
listState: LazyTimetableState = rememberLazyTimetableState(),
horizontalSpacing: Dp = 0.dp,
contentPadding: PaddingValues = PaddingValues(),
columnWidth: Dp,
heightPerMinute: Dp,
columnHeaderHeight: Dp,
columnHeaderColor: Color,
timeColumnWidth: Dp,
timeColumnColor: Color,
baseEpochSec: Long,
timeLabel: @Composable (Long) -> Unit,
content: LazyTimetableScope.() -> Unit
)


#compose
6👍1🔥1
Media is too big
VIEW IN TELEGRAM
Пример реализации каскадного меню в Jetpack Compose

#compose
🤔50🤯12👍3
Lorem Gibson - сайт для генерации стабового текста
🤔21🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ FloatingTabBar - библиотека с плавающим Tab Bar в стиле Liquid Glass из iOS 26

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥47🤔122👍1
// Пример использования FloatingTabBar
val scrollConnection = rememberFloatingTabBarScrollConnection()
var selectedTabKey by remember { mutableStateOf("home") }

Box(modifier = Modifier.fillMaxSize()) {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollConnection)
) {
ScrollableContent()
}

FloatingTabBar(
selectedTabKey = selectedTabKey,
scrollConnection = scrollConnection,
modifier = Modifier
.align(Alignment.BottomCenter)
.padding(horizontal = 16.dp)
) {
tab(
key = "home",
title = { Text("Home") },
icon = { Icon(Icons.Default.Home, contentDescription = null) },
onClick = { selectedTabKey = "home" }
)

tab(
key = "profile",
title = { Text("Profile") },
icon = { Icon(Icons.Default.Person, contentDescription = null) },
onClick = { selectedTabKey = "profile" }
)

standaloneTab(
key = "search",
icon = { Icon(Icons.Default.Search, contentDescription = null) },
onClick = { selectedTabKey = "search" }
)
}
}
5
Forwarded from Android Broadcast
Media is too big
VIEW IN TELEGRAM
📹 Разбор Jetpack Navigation 3 - настоящая навигация для Compose (21 мин)

Месяц назад Google анонсировала навигацию специально разработанную под Compose и которая должна решить все боли. В видео показываю её возможности, делюсь своим мнение и рассказываю про недочеты, которые надеюсь что решат до стабильного релиза

#AndroidBroadcast #navigation #jetpack #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍333🤔2
⚙️ Compose Multiplatform 1.9.0. Вышла первая Beta

Ждем скорого стабильного релиза и можно будет разбирать

#compose #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
⚙️ Приостановка композиции - новый подход к улучшению производительности

В Compose 1.9.0 появляется новое внутреннее API - PausableComposition. Оно позволит:
👉 Инкрементальная рекомпозиция: Подготовка UI, разбивая работу на части
👉 Прогрев UI: Делать подготовку UI асинхронно, до того как она кажется на экране

Обещают хорошее улучшение для LazyColumn и LazyRow

#compose #performance
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥57👍135🤔1
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
👍54🤯14🤔8
Пример использования 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)
}
}
)
}
15
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
🔥51👍11
Composable функция чем-то схожа с тем как работает suspend функция, только указывается особенность не через ключевое слово языка, а аннотацию из библиотеки. При компиляции кода происходит трансформация объявленной функции в код, который будет способен отобразить что-то на экране и обновляться. Удивительный мир магии плагина компилятора.

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

#compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍334
⚙️ 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
🤔58🔥18🤯6👍51
2025/10/21 18:23:36
Back to Top
HTML Embed Code: