TGINSIGHT CHAT
Android Broadcast
@android_broadcast
TechnologiesПодборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab#MQRZR
Posts récents
Tag : #compose · 74 posts
Publié 20 nov.
Пример использования Jetpack Navigation 3 data object ProductList data class ProductDetail(val id: String) @Composable fun MyApp() { // Create a back stack, specifying the key the app should start with val backStack = remember { mutableStateListOf<Any>(ProductList) } // Supply your back stack to a NavDisplay so it can reflect changes in the UI // ...more on this below... // Push a key onto the back stack (navigate forward), the navigation library will reflect the change in state backStack.add(ProductDetail(id = "ABC")) // Pop a key off the back stack (navigate back), the navigation library will reflect the change in state backStack.removeLastOrNull() } // [END android_compose_navigation3_basic_1] @Composable fun EntryProvider() { val backStack = remember { mutableStateListOf<Any>(ProductList) } NavDisplay( backStack = backStack, // [START android_compose_navigation3_basic_2] entryProvider = { key -> when (key) { is ProductList -> NavEntry(key) { Text("Product List") } is ProductDetail -> NavEntry( key, metadata = mapOf("extraDataKey" to "extraDataValue") ) { Text("Product ${key.id} ") } else -> { NavEntry(Unit) { Text(text = "Invalid Key: $it") } } } } // [END android_compose_navigation3_basic_2] ) } #android#compose#nav3#jetpack
Publié 20 nov.
🚀Вышла стабильная версия Jetpack Navigation 3 - бибилотека для UI навигации, заооченная под Compose Стал доступен первый стабильный релиз навигации, разработанной специально для Compose. Библиотека предоставляет больше гибкости и контроля разработчикам, позволяя реализовать различные подходы. Google выложила свои примеры реализации популярных задач в репозитории на 🐱GitHub Nav3 имеет поддержку Compose Multiplatform, а также JetBrains выпустила версию артефактов 👉Документация по библиотеке Всем кто использует Jetpack Navigation 2 с Compose нааооятельно рекомендуется миграция. 🔨Руководство по миграции ⭐️ Также Google сделала файл с контекстом для AI агента при миграции Про возможности бибилотеки я рассказал в 📹отдельном видео #android#compose#kmp#cmp#jetpack#ui#nav3
Publié 5 nov.
📦 Не храните всю графику в приложении Одна из лучших практик — храните в приложении только простые иконки в векторном формате, а всю растровую графику держите в облаке. Особенно это важно для приложений, которые не могут работать офлайн 🌐 Почему это стоит делать: 🚀 Меньше вес приложения → быстрее установка и обновления 📉 Не тянете лишние ресурсы, которые пользователь никогда не увидит (например, фичи под подпиской или в определённом регионе) 🌍 Можно адаптировать загрузку под регион, тариф или подписку 💰 Гибкость — обновляйте, отключайте или заменяйте контент без релиза Как хранить изображения правильно: - Векторные иконки → храним в ресурсах приложения - Баннеры, иллюстрации, фото → CDN или облако (Firebase Storage, CloudFront, S3 и др.) Для загрузки используйте image loader: Coil, Glide, Picasso и т.д. Чтобы грузить локальные ресурсы в Android через URL можно использовать адреса (примеры для приложения с именем пакета com.example.myapp): - По имени ресурса android.resource://com.example.myapp/drawable/my_image - По числовому ID android.resource://com.example.myapp/2130837504 ⚙️ Для Compose Multiplatform пока нет прямой поддержки таких ссылок, но можно расширить любой image loader и добавить обработку собственных URL или типов данных #android#оптимизация#compose#coil
Publié 24 oct.
🚀Вышел Jetpack Compose Material3 Adaptive 1.2.0 Если коротко про изменения — Material3 Adaptive всё ближе к полноценному “Responsive Compose”. Теперь можно писать интерфейсы, которые одинаково естественно ведут себя на телефоне, планшете и десктопе. Главное: 🪶 Levitate-стратегия для ThreePaneScaffold — превращает панель в плавающее окно (popup). ↔️ Reflow-стратегия для ThreePaneScaffold — позволяет при узком экране уводить одну панель под другую, сохраняя UX. 👉 PaneScaffoldScope.saveableStateHolder — сохраняет состояние между разными конфигурациями экрана. 👉 Modifier.preferredHeight() — теперь можно задать предпочтительную высоту панели. 📏 Новые WindowSizeClasses: API currentWindowAdaptiveInfo() теперь распознаёт Large и ExtraLarge окна — важный шаг к поддержке планшетов и десктопов. 👉 Drag-to-resize получил настройку пользовательского поведения и поддержку a11y (accessibility). 🏝 Плюс: обновлён Kotlin 2.0, переработано API стратегий, исправлены ошибки с анимациями и рендерингом при адаптации. #compose#material3#adaptive#android#jetpack
Publié 18 oct.
Вот реальная история, как знание механики работы ViewModel спасло мне вечер 👇 У меня приложение на Compose и Jetpack Navigation 3 (работает на основе состояния Back Stack). Экран «Навигатор файлов» открывает папки рекурсивно: по сути это тот же экран, но с другими данными. Все данные — из одной и той же ViewModel.❗️Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂 Вспомнил ключевой факт про архитектуру: 👉 Все ViewModel живут в ViewModelStore. 👉 В пределах одного ViewModelStoreOwner (Activity/Fragment/NavBackStackEntry) получение ViewModel по умолчанию идёт по типу. 👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key. Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой: @Composable fun FileNavigator( folderId: Id, modifier: Modifier = Modifier, ) { // новый folderId → новый экземпляр ViewModel → новый UI-стейт val viewModel: FileNavigatorViewModel = viewModel( key = "files(rootId='$folderId')" ) // ... } Мини-чеклист, если ловите такой баг 👉 Один экран используется повторно с разными параметрами? → Нужен key. 👉 Меняется route, но owner тот же? → key обязателен. 👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)). 👉 key должен детерминированно зависеть от входных данных (например, folderId). 👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо. Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому ViewModelStoreOwner вы реально привязаны. Рекомендую посмотреть мои видео по теме: 📹Разбор Jetpack Navigation 3 🪙Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform #android#compose#androidjetpack#viewmodel#архитектура
Publié 16 oct.
📹Собеседование на Kotlin Multiplatform разработчика 🎙 Проводит — Алексей Панов @kotlin_adept 🗓 Понедельник, 20 октября, 19:00 (GMT+3) Kotlin Multiplatform (KMP) набирает всё большую популярность — растёт количество вакансий и интерес со стороны компаний. Я давно хотел провести реальное собеседование, где Android-разработчика с опытом в KMP будут спрашивать на позицию, где придётся писать на KMP каждый день: иногда с использованием Compose, а иногда — только шаря логику между платформами. Будет жарко 🔥 Алексей — один из самых опытных разработчиков, кто давно пишет KMP в проде и отлично понимает экосистему. Кстати, у него классный Telegram-канал @kotlin_adept — там много полезных инсайтов про KMP. ❗️Запись собеседования появится на канале после эфира. #AndroidBroadcast#kmp#compose#собеседование#android
Publié 25 sept.
🤖Адаптивность UI в Android-приложениях Android-приложения запускаются на экранах с разными размерами и ориентацией. Чтобы интерфейс выглядел хорошо в любых условиях, стоит учитывать несколько простых правил, которые я выработал за годы опыта 👇 1️⃣Не привязывайтесь к фиксированным размерам Фиче может быть выделен весь экран, часть окна или вообще маленький контейнер. Пусть она сама решает: занять всё пространство или только необходимое. Остальное — задача хоста, который через параметры (например, Modifier в Compose) подстроит отображение или сама правильно разместит (например, по центру). 2️⃣Используйте адаптивные компоненты Вместо LazyColumn — лучше LazyVerticalGrid, а для RecyclerView — GridLayoutManager. Они умеют подстраивать сетку под свободное место на экране. 3️⃣Закладывайтесь на увеличение текста и элементов Пользователь может менять скейл интерфейса: Google позволяет масштабировать всё, увеличивая DP → PX. Поэтому всегда предусмотрите скролл, если контента может стать больше. 4️⃣UI фичи не должен знать, где он окажется Фича отвечает только за свой UI. А вот приложение решает, как её показать: в одну панель или, например, в связке через ListDetailPaneScaffold, где на экране могут быть сразу несколько экранов. Даже если дизайнер подготовил макет только под смартфон в вертикали — попробуйте включить воображение. Немного гибкости и масштабирования дадут пользователям куда более удобный опыт без больших трудозатрат. 📚 Что почитать: - Практики по построению адаптивных приложений - Compose Material 3 Adaptive - Jetpack WindowManager - Как строить адаптивный UI через layout 💬 Делитесь в комментариях своими советами и болями адаптивности UI #android#ui#compose#adaptive#ux#material3
Publié 19 sept.
⚙️ Нашел сайт с демонстрацией того как происходит рекомпозиция с примером хороших и плохих практик Как была сделана реализация написали в статье, а исходники есть на GitHub #compose
Hashtags
Publié 11 sept.
📸Вышла Jetpack CameraX 1.5.0 с новыми фичами и готовым UI для видоискателя камеры Что нового 🤖Camera Viewfinder - первый релиз стабильный релиз UI для показа камеры с простым встраиванием в UI (View и Compose) ⚙️ Первый релиз androidx.camera:camera-compose - работа с камерой в Compose UI 🛠 Исправление багов // Пример View Finder в Compose val currentSurfaceRequest: SurfaceRequest by viewModel.surfaceRequests.collectAsState() val coordinateTransformer = remember { MutableCoordinateTransformer() } CameraXViewfinder( surfaceRequest = surfaceRequest, // Can also use EMBEDDED implementationMode = ImplementationMode.EXTERNAL, modifier = modifier.pointerInput(Unit) { detectTapGestures { with(coordinateTransformer) { val surfaceCoords = it.transform() viewModel.focusOnPoint( surfaceRequest.resolution, surfaceCoords.x, surfaceCoords.y ) } } }, coordinateTransformer = coordinateTransformer ) #android#камера#jetpack#compose
Publié 1 sept.
🚀Отказываюсь от Списков в пользу Сеток в UI Раньше для списков в Compose я по привычке использовал LazyColumn. Но чем больше работаю с адаптивными интерфейсами, тем очевиднее: это никуда не годиться и надо использовать доступное пространство, а не тупо растягивать интерфейс. Перехожу на Grid компоновку ✔️ LazyVerticalGrid позволяет задать фиксированную ширину колонки, и система сама рассчитает, сколько их поместится на экране. В результате: 1️⃣ адаптивность «из коробки» на телефонах, планшетах и больших экранах 2️⃣ минимум дополнительного кода, 3️⃣единый компонент вместо костылей для разных форм-факторов. LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 120.dp), modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(100) { Item(...) } } Определение количества колонок происходит на основе политики GridCell: // всегда N колонок GridCells.Fixed(N) // автоматический расчет на основе минимальной ширины колонки GridCells.Adaptive(minSize = 120.dp) // каждая ячейка шириной 100dp GridCells.FixedSize(100.dp) 📱 На маленьком экране это будет 2–3 колонки, а на планшете — уже 5–6, и всё это без ручной логики. Есть еще более гибкий вариант если элементы строк должны быть разной высоты - LazyVerticalStaggeredGrid (стиль как в Pinterest) LazyVerticalStaggeredGrid( columns = Adaptive(minSize = 150.dp), modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(100) { Item(...) } } ❗️ Теперь я придерживаюсь строго правила: Если не могу явно сформулировать почему интерфейс должен быть в одну колонку, то вертикальный список брать не стоит! 🔗 Очень хорошо построение списков осветили в документации по Lazy Layout Аналогично можно проделать и с RecyclerView, использую вместо LinearLayoutManager вариант с сеткой - GridLayoutManager или StaggeredGridLayoutManager, только там не будет автоматического расчета колонок на основе доступного места. Это придется реализовывать самостоятельно. ✍️ Что думаете о таком подходе для UI?Ударит по производительности? #ui#android#compose
Publié 28 août
🤖 Для Compose Material3 Adaptive добавили поддержку каноничных layout на основе библиотеке Navigation 3. Пока вышла первая альфа версия, но уже можно начинать работать. Подробности в анонсе #compose#navigation
Hashtags
Publié 20 août
🤖 Как использовать Compose, чтобы сделать анимированный Splash Screen Разработчик создал библиотеку androidx-splashscreen-compose (не от Google решение), которая позволяет делать красивую анимацию как на анимашке. Подробный разбор и реализация есть в статье (EN,6м, альт. ссылка) или 🐱исходниках на GitHub #android#compose