🎉 Jetpack Navigation 3 - навигация для Compose, написанная с нуля!
Будем честны Jetpack Navigation for Compose было никаким решением, до того как в ней появилась типобезопасная навигация, но и тогда остается много вопросов. Google решила что пора написать настоящую навигацию для Compose. Знакомьтесь - Jetpack Nav 3
Ключевые идеи в новой библиотеки: декларативное объявление + "навигация как состояние". Это полностью повторяет идеи что я заложил в NavState. Все это вылилось в принципы:
👉 Разработчик управляет back stack
👉 Возможность расширения и реализации собственной навигации на базовых компонентах
👉 Анимации из коробки
👉 Поддержка Predictive Back
👉 Поддержка адаптивных layout
👉 Сохранения состояния каждого элемент back stack, включая ViewModel
👉 Поддержка многомодульности
Пока представлена только первая альфа и библиотеки еще предстоит путь, как минимум обзавестись поддержкой KMP
🔗 Больше подробности в документации
🐱 Примеры использования на GitHub
Надо покопаться в ней и сделать видео на тему!
#jetpack #compose #навигация
Будем честны Jetpack Navigation for Compose было никаким решением, до того как в ней появилась типобезопасная навигация, но и тогда остается много вопросов. Google решила что пора написать настоящую навигацию для Compose. Знакомьтесь - Jetpack Nav 3
Ключевые идеи в новой библиотеки: декларативное объявление + "навигация как состояние". Это полностью повторяет идеи что я заложил в NavState. Все это вылилось в принципы:
👉 Разработчик управляет back stack
👉 Возможность расширения и реализации собственной навигации на базовых компонентах
👉 Анимации из коробки
👉 Поддержка Predictive Back
👉 Поддержка адаптивных layout
👉 Сохранения состояния каждого элемент back stack, включая ViewModel
👉 Поддержка многомодульности
Пока представлена только первая альфа и библиотеки еще предстоит путь, как минимум обзавестись поддержкой KMP
🔗 Больше подробности в документации
Надо покопаться в ней и сделать видео на тему!
#jetpack #compose #навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83👍22🤔12
Пример использования Jetpack Compose Nav3
#jetpack #compose #навигация
// Определите route в вашем приложении
@Serializable data object Home
@Serializable data class Product(val id: String)
// Создайте back stack, указав начальный route
val backStack = remember { mutableStateListOf<Any>(ProductList) }
// NavDisplay отображает ваш back stack
// Каждый раз, когда back stack меняется, отображение обновляется.
NavDisplay(
backStack = backStack, // Простой List<Any>
// Укажите, что должно происходить при нажатии кнопки "назад"
onBack = { backStack.removeLastOrNull() },
// Провайдер записей преобразует маршрут в NavEntry,
// который содержит контент для этого маршрута.
entryProvider = { route ->
when (route) {
is Home -> NavEntry(route) {
Column {
Text("Добро пожаловать в Nav3")
Button(onClick = {
// Чтобы перейти к другому экрану,
// просто добавьте его в back stack
backStack.add(Product("123"))
}) {
Text("Нажмите для навигации")
}
}
}
is Product -> NavEntry(route) { Text("Продукт ${route.id}") }
else -> NavEntry(Unit) { Text("Неизвестный route: $route") }
}
}
)
#jetpack #compose #навигация
👍37🤔19🔥14
Что нового в свежей версии:
👉 Улучшения Activity Embedding
👉 Улучшения API WindowMetrics
👉 Улучшили API для тестирования
#jetpack #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Media is too big
VIEW IN TELEGRAM
Очень полезный доклад про разработку адаптивного приложения по дизайну, фичам и поведению. Учитывая, стойкий тренд перехода Android разработки в KMP это как никогда актуально!
#android #adaptive #material3 #jetpack #googleio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
В Jetpack делают KMP API для обработки системных жестов нажатия назад или Predictive Back
Новая библиотека Jetpack NavigationEvent содержит в себе API для обработки нажатия назад или для отслеживания прогресса жеста назад. API cхоже с Dispatcher которое было сделано для Back ранее. Поддерживаются KMP таргеты: Android, Desktop/JVM, iOS, JS, Linux, WASM, watchOS, tvOS, Ming
ComponentActivity реализует интерфейс
В Android Activity можно подписаться на обработку события
#android #jetpack #навигация #kmp #kotlin
Новая библиотека Jetpack NavigationEvent содержит в себе API для обработки нажатия назад или для отслеживания прогресса жеста назад. API cхоже с Dispatcher которое было сделано для Back ранее. Поддерживаются KMP таргеты: Android, Desktop/JVM, iOS, JS, Linux, WASM, watchOS, tvOS, Ming
ComponentActivity реализует интерфейс
NavigationEventDispatcherOwner
:interface NavigationEventDispatcherOwner {
val navigationEventDispatcher: NavigationEventDispatcher
}
NavigationEventDispatcher
представляет собой класс, для передачи системны событий Назад:class NavigationEventDispatcher(
private val fallbackOnBackPressed: (() -> Unit)?,
private val onHasEnabledCallbacksChanged: ((Boolean) -> Unit)?,
)
// Добавления callback чтобы слушать когда произйдет нажатие "Назад"
fun addCallback(
callback: NavigationEventCallback,
priority: NavigationEventPriority = NavigationEventPriority.Default
)
fun dispatchOnStarted(event: NavigationEvent)
fun dispatchOnProgressed(event: NavigationEvent)
fun dispatchOnCompleted()
fun dispatchOnCancelled()
}
В Android Activity можно подписаться на обработку события
class MyActivity : ComponentActivity() {
init {
navigationEventDispatcher.addCallback(
callback = object : NavigationEventCallback(
isEnabled = true,
priority = NavigationEventPriority.Default
) {
override fun onEventCompleted() {
// Back сделан
}
},
priority = NavigationEventPriority.Default
)
}
}
#android #jetpack #навигация #kmp #kotlin
❤25👍11🔥7🤔3
🎉🚀 Новая Jetpack Библиотека - Photo Picker
Новая библиотека Jetpack Photo Picker позволит перенести встраиваемый Photo Picker из Android 16 на более ранние версии Android. Благодаря Mainline системе встраиваемый Photo Picker будет доступен на Android 14 и выше как часть ОС, а вот на других версиях будет помогать библиотека Jetpack Photo Picker, работающая скорее всего на основе Google Play Services.
Важно - сразу сделали версию для View и Compose
#android #jetpack #android16 #compose
Новая библиотека Jetpack Photo Picker позволит перенести встраиваемый Photo Picker из Android 16 на более ранние версии Android. Благодаря Mainline системе встраиваемый Photo Picker будет доступен на Android 14 и выше как часть ОС, а вот на других версиях будет помогать библиотека Jetpack Photo Picker, работающая скорее всего на основе Google Play Services.
Важно - сразу сделали версию для View и Compose
#android #jetpack #android16 #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥48👍9❤3
Media is too big
VIEW IN TELEGRAM
Рассказ про основные принципы новой навигации от Google для Compose - Jetpack Navigation 3
0:00 Вступление
1:05 Что есть Навигация
2:08 Архитектура
4:40 Требования
5:26 Почему это так сложно
7:01 Задачи Navigation 3
9:02 Владение Backstack-ом
10:04 Будущее
#android #jetpack #compose #навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25🤯9❤4🤔1
В этот раз вас жду багфиксы: Room 2.7.2 и WorkManager 2.10.2, а также первая RC версия Benchmark Version 1.4.0
#android #androiddev #jetpack #jetpackupdate
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.
class MainActivity : ComponentActivity() {
// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}
lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()
// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"
Log.d("JS", "Результат выполнения: $result")
}
}
override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}
#jetpack #js
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯32👍16🔥2❤1
Media is too big
VIEW IN TELEGRAM
Месяц назад Google анонсировала навигацию специально разработанную под Compose и которая должна решить все боли. В видео показываю её возможности, делюсь своим мнение и рассказываю про недочеты, которые надеюсь что решат до стабильного релиза
#AndroidBroadcast #navigation #jetpack #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥10🤔4❤3
Microbenchmark
👉 Сделали рефакторинг BenchmarkRule и перевели на работу через Kotlin Coroutines
👉 Gradke таски
lockClocks
и unlockClocks
перенесли из root проекта в benchnmark проектMacrobenchmark
👉 Исправили работу на Android 14 и выше
👉 Добавили ArtMetric для выявления неоптимальной загрузки классов, чтобы лучше настроить BaselineProfile
Что еще:
👉 Baseline Profile теперь может работать с приложениями с множеством процессов
👉 TraceProcessor вынесли в отдельный артефакт
#android #jetpack #производительность #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍4❤1
В Jetpack 2.10.0-alpha01 появилась новая Composable функция LifecycleOwner для создания дочернего Lifecycle. Изменение нужно для Navigation3.
@Composable
fun MyComposable() {
LifecycleOwner(
maxLifecycle = RESUMED,
parentLifecycleOwner = LocalLifecycleOwner.current,
) {
val childLifecycleOwner = LocalLifecycleOwner.current
}
}
#compose #jetpack #android #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔23❤6👍4🔥4
👉 Появилась возможность добавить элементы контекстного меню в Custom Tabs — теперь вы можете собственные пункты меню внутри вкладки
👉 Появилось экспериментальное Auth Tab API. Цель - OAuth авторизация через Web браузер
👉 Улучшения TrustedWebActivityIntent
Есть и другие менее заметные обновления
#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
#jetpack #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
#android #jetpack #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍1
Вышел новый стабильный релиз тестовых библиотек от Google
🚀 Test Core 1.7.0
🚀 Test Espresso 3.7.0
🚀 Test Espresso Device 1.1.0
🚀 Test JUnit Extensions 1.3.0
🚀 Test Truth Extensions 1.7.0
🚀 Test Monitor 1.8.0
🚀 Test Orchestrator 1.6.0
🚀 Test Runner 1.7.0
🚀 Test Rules 1.7.0
🚀 Test Services 1.6.0
Из основных изменений:
👉 Повышение minSdk = 21
👉 Обновление зависимостей
👉 Исправление багов
#android #jetpack #тестирование
Из основных изменений:
👉 Повышение minSdk = 21
👉 Обновление зависимостей
👉 Исправление багов
#android #jetpack #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍4
Google продолжает прокачивать медиа API, и в этом релизе есть фичи, которые экономят время разработки и улучшают UX.
📺 ExoPlayer
👉 Плавная перемотка: новый ScrubbingMode делает скролл прогресс-бара без отрыва пальца супер-отзывчивым. Пользователь почувствует разницу.
👉 Встроенная видео-реклама: нативная поддержка Ads Interstitials в стриминге — меньше костылей.
👉 Длительность видео без проигрывания:
val duration = MetadataRetriever
.Builder(context, mediaItem)
.build()
.use { it.retrieveDurationUs().await() }
👉 PreCacheHelper — загрузка контента по частям для более быстрых стартов.
🎵 MediaSession
👉 Плеер в шторке не исчезает сразу после паузы — пользователю проще вернуться к просмотру.
✂️ Transformer API
👉 Экспериментальная обрезка видео через MP4 edit list.
👉 Опция CodecDbLite — ускоряет кодирование, подбирая оптимальные настройки под чипсет:
Transformer.Builder()
.setEncoderFactory(
DefaultEncoderFactory.Builder()
.setEnableCodecDbLite(true)
.build()
)
.build()
💡 Почему обновляться сейчас
👉 Меньше кастомного кода — больше нативных возможностей.
👉 Повышение отзывчивости плеера = выше удержание пользователей.
👉 Новые API для подготовки к интеграции рекламы и улучшенного UX.
Подробнее в анонсе или в changelog
#android #AndroidDev #Jetpack #Media3 #ExoPlayer
Please open Telegram to view this post
VIEW IN TELEGRAM
Android Developers Blog
Media3 1.8.0 - What’s new?
Media3 1.8.0 release features a scrubbing mode in ExoPlayer, live streaming ad support with HLS interstitials, updated MetadataRetriever, and more.
👍35🔥13❤1
Если ваше приложение поддерживает Android 5.0 и выше, то использовать новые версии библиотек уже не получится. Что можно сделать:
👉 Остаться на старых версиях
👉 Повысить minSdk до 23 или выше
👉 Поддерживать всё самостоятельно
Источник - Ian Lake из команды Android Jetpack
#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🤯14🔥13🤝3
Известно, что отдельные устройства под Android имеют собственные баги. Производители их не правят по разным причинам: закончилась поддержка, не хотят тратиться или предложили на форуме обход. Может просто идет долго доставка фикса до вашего устройства (всякое может быть)
Команда Android Jetpack сделала библиотеку core-backported-fixes, чтобы помочь разработчикам проверить состояния бага для текущего устройства 😂
Пример кода проверки issue KI_398591036 (проблема с цветом в фото на Pixel устройствах)
val fixManager = BackportedFixManager()
if (fixManager.isFixed(KnownIssues.KI_398591036)) {
Offer_experience_that_needs_fix()
} else {
Offer_experience_that_avoids_the_bug()
}
Все issue для проверки описаны в классе KnownIssues
#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯88👍9❤5🤔3🔥2🎉1🙏1🏆1