Android Good Reads
4.09K subscribers
366 photos
15 videos
1 file
2.11K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna
Download Telegram
Как K2 mode помогает работать IDE быстрее

Режим K2 вводит новый анализатор кода, общий для компилятора Kotlin и IDE. Он заменяет implicit laziness поэтапным подходом к анализу кода, где каждый этап анализирует определённые части кода и добавляет семантическую информацию в абстрактное синтаксическое дерево (AST). Хотя ядро компилятора остаётся однопоточным, логика разрешения теперь устойчива к параллелизму, что позволяет одновременно анализировать несколько инициализаций
👍82🌚1
Разбираем порядок вызова DisposableEffect, LaunchedEffect и Composable

Если кратко - сначала вызывается композиция всех Composable и регистрируются блоки Effect, а затем вызываются сами эффекты. DisposableEffect, SideEffect, SnapshotFlow ... вызываются раньше чем LaunchedEffect, так как первые это синхронный вызов, запускающиеся сразу после композиции, а последний стартует корутину с помощью Recomposer.

Немного интереснее становится при навигации. Сначала будут вызваны эффекты на новом экране и только потом onDispose с экрана с которого ушли. Все это призвано убрать глитчи при переходе между экранами.
👍16🔥53🤔1
Разница между job.cancel() и scope.cancel()

👉 job.cancel() тормозит конкретную корутину
👉 scope.cancel() тормозит весь скоуп и все корутины в нем
👉 Можно остановить все корутины в скоупе, но не прибивать сам скоуп с помощью scope.coroutineContext.cancelChildren()
👉 viewModelScope и lifecycleScope останавливаются сами, не нужно этого делать вручную

Внутри статьи больше примеров и аналогий, если вы теряетесь в понимании что есть что
👍9
Разбираем context параметры в Kotlin 2.2.0

Анонс был, а прикладных примеров еще не было. Внутри примеры с тем как делать логирование и DI.
Из приятных плюсов:
- Убирает шаблонный код
- Повышение читабельности и поддерживаемости
- Типобезопасность

Пример комбинации с Extension функцией:
// Extension function with context parameter
context(txManager: TransactionManager)
fun List<Transaction>.processAllInTransaction() {
txManager.beginTransaction()
try {
forEach { it.process() }
txManager.commitTransaction()
} catch (e: Exception) {
txManager.rollbackTransaction()
throw e
}
}

// Usage
with(transactionManager) {
transactions.processAllInTransaction()
}
👍11🔥3👎2👌2
Хорошая новость этой недели! Compose Multiplatform вышел в релиз!
Из главного:
👉 Стабильность и перформанс, стабильность и перформанс!
👉 iOS полностью стабилен. Завезли немного нативного функционала (жесты, drag-n-drop, RTL поддержка ...)
👉 Множество апи вышло из стадии экспериментальных в стабильные!
👉 Улучшили холодный старт, перформанс приложения при скролле, а так же оптимизировали размер собираемого приложения
👉 Еще раз напомнили про hot-reload. Успели попробовать?

Очевидно, релиз под грядущий Kotlin Conf. Возможно, на самой конференеции будут еще анонсы, но уже сегодня я затаскиваю версию 1.8.0 в наше приложение
🔥15🫡4👍2
Android Studio Meerkat Feature Drop теперь стабильна! Полгода от Canary до релиза по новому циклу.
Внутри подтянули обновление от IDEA, k2 mode и много AI улучшений.
Из приятного улучшили терминал, дебаггер и App Quality Insights с интеграцией в Play Store и Firebase Crashlytics.
🔥8👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Используем movableContentOf для shared transition анимации в Jetpack Compose

Все достаточно просто. Как и в любой анимации мы определяем ее scope с помощью LookaheadScope. Накидываем AnimatePlacementNodeElement и определяем список Composable элементов для перемещения через movableContentOf.

Примеры кода внутри статьи!
👍8🔥32😁1
Обсуждем кейсы на митапе Яндекса по мобильной разработке

Я.Субботник — большой митап для мобильных разработчиков. В этот раз кроме докладов участников ждёт практический разрбор кейсов на PeerLab.

PeerLab — камерная встреча с экспертами Яндекса. Для неё мы отобрали актуальные темы из разработки и карьеры. Предложить кейс для обсуждения может каждый участник — приносите их в форму регистрации и приходите на обсуждение!

В Москве точно обсудим:

🔸Kotlin Multiplatform
🔸Карьерное развитие
🔸Платформенные команды
🔸AI в разработке

А в Питере:

T-Shape разработчик
🔸Тестирование
🔸AI в разработке

➡️ Регистрируйтесь и ищите список экспертов-участников дискуссии на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥2
Proto vs JSON. Когда и что использовать?

JSON:
👉 Делаете публичное API
👉 Для быстрых прототипов
👉 Когда хочется видеть человеко-читаемую конфигурацию

Proto:
👉 IoT и Realtime системы
👉 Внутренние приложения, зависящие от скорости интернета
👉 Межсерверное взаимодействие
👍7🤨32
Сегодня стартует Google I/O 2025. Самая интересная для нас с вами часть тут
🔥5
Android Good Reads
Сегодня стартует Google I/O 2025. Самая интересная для нас с вами часть тут
По чуть-чуть будем обозревать новости с Google I/O. Первое на что обращаем внимание - очередная навигация. Из плюсов - большая гибкость и больше контроля над навигацией в приложении. Как следствие - возможное переусложнение навигации, необходимость миграции и невероятные велосипеды в каждой компании.

Немного кода с Nav3:

// Define the routes in your app and any arguments.
data object Home
data class Product(val id: String)

// Create a back stack, specifying the route the app should start with.
val backStack = remember { mutableStateListOf<Any>(ProductList) }

// A NavDisplay displays your back stack. Whenever the back stack changes, the display updates.
NavDisplay(
backStack = backStack,

// Specify what should happen when the user goes back
onBack = { backStack.removeLastOrNull() },

// An entry provider converts a route into a NavEntry which contains the content for that route.
entryProvider = { route ->
when (route) {
is Home -> NavEntry(route) {
Column {
Text("Welcome to Nav3")
Button(onClick = {
// To navigate to a new route, just add that route to the back stack
backStack.add(Product("123"))
}) {
Text("Click to navigate")
}
}
}
is Product -> NavEntry(route) {
Text("Product ${route.id} ")
}
else -> NavEntry(Unit) { Text("Unknown route: $route") }
}
}
)
🔥7🤔4💯3😁1
Сегодня, кстати, начинается следующая важная конференция - KotlinConf. Записи будут доступны позже на сайте, а прямая трансляция начинается через 10 минут.

Неделя насыщенная на новости по андроид разработке.
🔥52👍2
Android Good Reads
Сегодня, кстати, начинается следующая важная конференция - KotlinConf. Записи будут доступны позже на сайте, а прямая трансляция начинается через 10 минут. Неделя насыщенная на новости по андроид разработке.
Конференция закончилась. Краткий обзор от jetbrAIns команды:

https://blog.jetbrains.com/kotlin/2025/05/kotlinconf-2025-language-features-ai-powered-development-and-kotlin-multiplatform/

Я был на самой конференции и лично мне понравился умеренный и не фанатичный подход к AI, стабилизация большинства экспериментальных функций и API, а так же рост комьюнити. Очень жду Kotlin/wasm в бете!

Meta теперь золотой спонсор Kotlin Foundation, что же будет с React Native? 😱

Следующий KotlinConf пройдет в Мюнхене!
🔥22👍6
Compose Preview c MVI и State Hositing

Идея крайне проста:
👉 В Composable экран передаем state в качестве параметра
👉 Вторым параметром идет EventManager
👉 Получаем чистый UI, без бизнес логики и репозиториев
👉 В @Preview передается замоканые данные, что так же удобно использовать при тестировании компонентов
👉 Еще 1 большой плюс - упрощение внедрения скриншот тестирования

@Composable
fun ProfileScreen(
state: ProfileScreenState,
onEvent: (ProfileEvent) -> Unit
) {
// Screen data
}


@Preview
@Composable
private fun ProfileScreenPreview() = ProfileScreenContent(
state = ProfileScreenState(),
onEvent = {}
)


В комментариях подсказали, что у FlowMVI можно получить тоже самое из коробки
8👍3🤯2