Telegram Web
​​Kotlin Contracts
#kotlin

Не очень часто используемой, но интересной и полезной фичей являются Contracts.

Основная цель контрактов — помочь компилятору Kotlin в анализе кода в случаях, когда разработчик знает о коде больше деталей, чем может увидеть компилятор.

Вообще копилятор делает много крутых оптимизаций и проверок, однако порой он ведёт себя слишком строго и разработчику приходится добавлять или какие-то костыли, или дополнительные проверки для того, чтобы скомпилировать код. Контракты как раз и позволяют сказать компилятору, что всё с кодом нормально и что разработчик понимает, что тут делается.

Я нашёл парочку примеров, где контракты могут быть полезны, ну и станет понятнее, что это вообще за фича:
- автор добавил контракт для проверки пустого списка, который может быть null;
- тут автор использует контракты для проверки лямбда-функций и при инициализации в них переменных;

Будет круто, если поделитесь своими примерами использования этой фичи в своих проектах.
👍14💩1
​​Gradle version catalogs
#gradle

Если ваш проект состоит из одного модуля, то управление зависимостями — довольно простая задача. Но как только вы переходите на многомодульность, то всё становится несколько сложнее.

Есть несколько вариантов решения этой задачи:
1️⃣ Управлять вручную — в каждом из модулей у вас будут повторяться те библиотеки, которые вы добавляете. Думаю, что нет смысла говорить, что этот подход не очень хороший.

2️⃣ Блок ext — подход, которым часто пользуется сам Google, и который как раз решает проблему из первого пункта. Правда в таком случае нет автозаполнения кода при написании.

3️⃣ buildSrc — можно использовать специальный gradle-модуль, где как раз и описать эти зависимости.

Но есть ещё один, менее известный, но очень удобный подход — это Version Catalogs. Он доступен в версии Gradle 7.4, и очень удобно описывает все зависимости проекта.

Подробная инструкция с тем, как всё добавить к себе тут.

Android Studio поддерживает этот формат файлов, а ещё есть плагин, который перенесёт задачу обновления компонентов на CI. 🤓
10💩1
​​Тесты для уведомлений
#android #tests

Попалась любопытная статья, где описывается хороший кейс для тестирования уведомлений в Android.

Вообще, если в проекте и пишутся тесты, то нотификациям уделяется совсем мало внимания: иногда создаётся интерфейс, который мОкается в тестах, но который при этом не имеет отношения непосредственно к показу этих уведомлений.

Автор делится своим опытом, как корректно подключить NotificationManager, как проверить, какое действие выполнилось при открытии пуша, и показывает в реальном приложении написанные для уведомлений тесты.
👍14👎2
​​Material You в Jetpack Compose
#design #compose

Не так давно в Android появилась фича, которая позволяет адаптировать темы приложения под цвета пользовательского интерфейса.
То есть теперь у пользователя, в теории, может быть не только светлая и тёмная темы, но и множество вариантов, в зависимости от преобладающего цвета в его обоях.

Попалась любопытная статья, где автор применяет библиотеку Material Design 3 к своему небольшому приложению, написанному на Compose.
Тут можно подсмотреть, как лучше хранить цвета и ресурсы для тем в Compose, как лучше сделать динамические темы, да и то, как начать переезд на эту фичу в своём приложении.

Выглядит здорово, надеюсь на поддержку этой фичи в основных приложениях.
6👍3👎1
​​Как мы уменьшили ANR в 3 раза
#android

Ошибка "Приложение не отвечает" — весьма неприятное событие для пользователя, ведь в этом случае он вынужден закрывать приложение и делать незавершённое действие с начала.
Кроме этого, эти ошибки довольно непросто повторить и поправить, ведь они могут то появляться, то исчезать, а также иметь зависимость от устройств.

Вот неплохая статья, которая описывает то, откуда вообще появляются ANR и то, как с ними бороться.
Автор говорит, что они ощутимо снизили процент этих ошибок в своём приложении, а также значительно улучшили время старта приложения.
👍8👎31
​​Parallax Effect в Jetpack Compose
#compose

Попалась красивая реализация эффекта параллакса, которая написана на Jetpack Compose.
Не уверен на 100%, что вам есть где использовать этот эффект в приложении, но любопытно посмотреть на саму реализацию. Тем более, на столь популярном в последнее время Compose.

@Composable элементы меняют своё положение на основе ориентации устройства и приходящих данных с SensorManager. Далее, создаётся DisposableEffect, который используется для репозиционирования Image.

Автор добавил немного модификаторов для тени и карточки. В итоге получился приятный и красивый эффект.
Чуть больше деталей реализации, ну и, конечно, примеры кода можно найти тут. 🤓
👍9👎1
​​How to write the best Usecase/Interactors ever!
#android

Попалась на глаза неплохая статья, которая рассказывает о принципах написания корректных UseCases. Если вы совсем не знакомы с тем, что это за слой архитектуры, то стоит ознакомиться с этой статьёй.

ℹ️ ВообщеUseCase — весьма полезный класс, который сильно облегчает взаимодействие между Repository и ViewModel. Правда, существует много разных подходов, связанных с корректным управлением жизненным циклом этого UseCase.

🤔 Автор рассказывает о том, как лучше сделать базовый класс для ваших UseCase, а также как с наименьшим количеством повторяющегося кода запускать, показывать индикатор загрузки и отменять запущенные UseCase.

🖖 Идея с CoroutinesUseCaseRunner удобная, так что рекомендую попробовать подобный подход в своих проектах.
👍111
Жизнь в ОАЭ
#интервью #экспаты

Давненько на канале не выходили интервью с разработчиками, которые переехали жить и работать в другие страны.
Думаю большинство из вас видели анонс про ОАЭ. Но, виноват. Сильно задержал публикацию, хотя само интервью уже было готово.

Однако теперь всё отредактировано и его уже можно почитать тут. В комментариях можете задавать дополнительные вопросы автору, если они появятся.
Кстати, Антон тоже ведёт свой Telegram канал как раз про жизнь в Дубае, так что подписывайтесь, если вам интересна эта тема. 🇦🇪

Ну и до следующих анонсов новых стран, уже есть парочку идей😉
🔥133👎2👍1
​​ KotlinDL 0.4
#kotlin

Оказывается, существует библиотека для машинного обучения от JetBrains, которая, конечно же, написана на Kotlin, и уже предлагает довольно много всяких плюшек.

Что же появилось в новой версии?

1️⃣ Pose Detection — появилась возможность определения положения тела человека по 17 ключевым точкам на суставах человека.

2️⃣ NoTop модели — представляют из себя более облегчённые классические модели и нужны для более тонкой настройки обучения. Добавился прям целый список этих моделей, что делает работу с библиотекой ещё более удобной.

3️⃣ Новые модели: EfficientDet и EfficientNet.

4️⃣ Добавлено парочку callbacks, что также повышает работу с моделями.

5️⃣ Изменения в Image Preprocessing DSL: удалили CustomPreprocessor, добавили несколько Preprocessors.

Я не эксперт по ML, но очень радует, что эта сфера развивается и становится всё более популярной. И особенно радует, что у нас развивается ещё одна библиотека для работы с машинным обучением.

👨‍💻 Подробнее про новинки и больше примеров кода можно почитать тут.
🔥6👍2👎1
​​App Shortcuts в Android
#android

Вероятно, каждый из нас встречал shortcuts при использовании таких приложений, как WhatsApp, Facebook, Google Chrome. Весьма полезная штука, если вы хотите сделать какую-то быструю навигацию внутри приложения не заставляя пользователя заходить в само приложение.

Как её сделать?
На самом деле, всё довольно просто: необходимо добавить пару конфигурационных файлов.
1️⃣ Создаём файл shortcuts.xml внутри файлов с ресурсами

2️⃣ Добавляем непосредственно </shortcut> внутри этого файла, где создаём его идентификатор и label. Внутри тэга переопределяем тот Intent, который хотим запустить при клике.

3️⃣ Добавляем <meta-data android:name="android.app.shortcuts" внутри AndroidManifest.xml, чтобы всё заработало.

А если вдруг вам нужно сделать динамические shortcuts, то всегда есть возможность воспользоваться ShortcutManager.
Чуть больше информации и примеры кода можно найти в этой статье.
👍6🔥3👎1
​​Navigation в Jetpack Compose
#compose

Использование правильно настроенной навигации в приложении — очень важная вещь, которая в будущем, при росте проекта, спасает от многих проблем.
И если в привычной Android-разработке уже существует несколько различных подходов, то с появлением Jetpack Compose приходится искать другие варианты.

Тут автор очень круто сравнивает текущие подходы к навигации и пытается подобрать идеальный вариант. В сравнение попали следующие библиотеки:

👉 Navigation-compose;
👉 Compose-navigation-reimagined;
👉 Voyager;
👉 Navigator-compose;
👉 Simple-stack-compose-integration;

У каждой из них он рассмотрел плюсы и минусы, в некоторых указал, как эти минусы разрешить.

🏆 В итоге, по мнению автора, победила библиотека Voyager, которая вот-вот выйдет в релизную версию.
👍6🔥3👎1
​​Пара фич Android Studio
#android

Периодически попадаются статьи, которые рассказывают о редких, но довольно полезных фичах Android Studio, которые здорово экономят время. Да, чаще это весьма очевидные советы, но автор этой статьи удивил и порадовал нестандартными решениями.

1️⃣ Прячем ненужные файлы. При использовании библиотек, генерирующих много кода (например, Dagger) можно исключить эти файлы из поиска Android Studio при помощи кастомного Scope.
Для этого переходим: Preferences -> Appearance & Behaviour -> Scopes -> + -> local и добавляем маску !file:*intermediates*/&&!file:*generated*/&&!file:R.java.

Можно пойти дальше при помощи Preferences -> Editor -> File Types -> Ignored Files and Folders, и скрыть из поиска целые директории, например /build, /generated, что может быть полезно в очень больших проектах.

2️⃣ Быстрые прототипы — крутая фича, которая позволяет быстро набросать или проверить какую-то идею прямо в проекте. Для этого можно использовать Scratch files: создать новый можно при помощи Cmd + Shift + N, выбираете нужный тип файла и получаете песочницу прямо внутри текущего проекта. Попробуйте, очень удобно.

3️⃣ Множественный курсор — известная мне ранее фича, которая позволяет редактировать несколько строк проекта одновременно. Очень полезно при рефакторинге, экономит много времени.
При помощи Control + G ставится курсор между одинаковыми частями кода, а при помощи Shift + Option + click поставить курсор вообще в любую область файла.

4️⃣ Расширенный Copy/Paste — крутая штука, которая позволяет видеть историю буфера обмена. Для этого надо использовать сочетание Cmd + Shift + V.

5️⃣ Восстановление из локальной истории — часто приходится восстановить те изменения, которые уже были добавлены в файл, но ещё не залиты в Git. Это можно сделать при помощи right-click -> Local History -> Show History, где можно восстановить требуемый код.

👉 В статье есть ещё больше советов.
👍18🐳11👎1🌚1
​​Things every Kotlin Developer should know about Coroutines
#kotlin

Попался классный набор статей, где автор делится, фактически, полной информацией о Coroutines, правда в структурированной и удобном для чтения виде.
Получился здоровский аналог документации, который поможет вникнуть в тему, ну или напомнить себе о каких-то вещах, которые забылись.

Статей целых 5️⃣:
Part 1: CoroutineContext
Part 2: CoroutineScope
Part 3: Structured Concurrency
Part 4: Exception Handling
Part 5: Cancellation
🔥16👍3
​​Kotlin-Swift interopedia
#kmm

Полезнейшая таблица, которая показывает совместимость между методами в Kotlin и методами в Swift.
Подобная табличка есть также и в доке от Jetbrains, но лучше использовать обе.

Будет супер-полезно, если вы разрабатываете совместное API с iOS разработчиками и договариваетесь об использовании каких-то нужных вам фич.

👨‍💻 Ну и примеры кода для каждого кейса тоже очень радуют.
🔥91🤮1💩1
​​Kotlin Build Reports
#kotlin

Начиная с версии Kotlin 1.7.0 у нас появилась возможность создания отчётов о сборке. Там содержится информация о различных этапах сборки, а также почему невозможно использовать инкрементную компиляцию.

Штука крайне полезная, и её можно использовать, чтобы разобраться, почему сборка занимает так много времени.

👨‍💻 Пока что фича экспериментальная, но попробовать можно уже сейчас. Для этого надо:

1️⃣ В gradle.properties добавляем kotlin.build.report.output=file.

2️⃣ На самом деле, этого достаточно, но есть пару опциональных свойств, которые можно добавить для удобства, детальнее лучше посмотреть тут.
👍6🔥4👎1
​​Spring & Fling анимации в Jetpack compose
#compose

Physics-based анимации — это тип анимаций, которые, по сравнению с обычными анимациями, дают более естественные и плавные эффекты.

В Android существует несколько разных типов подобных анимаций, и Jetpack Compose поддерживает некоторые из них.

Автор статьи рассказывает, как добавить Spring & Fling анимации в проект, сделав анимированной любую из написанных View.
5👎1
​​Glance Widget и Work Manager
#android

Совсем недавно Google решил переосмыслить поведение виджетов и у нас появилось новое API для их создания — Glance.
Очень круто, что всё работает в Jetpack Compose стиле, что подразумевает общее API и для виджетов, и для основных элементов экрана.

Вот неплохой пример создания виджета, где автор рассказывает то, как создать виджет со сменой изображения, используя WorkManager.

Сам API ещё в alpha, но видно, что идёт развитие и переосмысление виджетов. Правда, интересно, станут ли они снова популярными среди пользователей системы. 🤔
👍3👎1
​​Screen response time
#android

Одной из важных метрик, связанных со скоростью работы приложения является то, как быстро рендерятся View, да и в целом экран.
Если посмотреть на наших коллег с Web, то там это одна из ключевых метрик и существует множество полезных инструментов для того, чтобы корректно её измерить.

С Android всё не так просто, но тем не менее есть парочку инструментов, которые могут нам помочь сделать приложения ещё более качественными.

🧑‍💻Автор статьи делится своими наблюдениями по оптимизации времени рендеринга экранов приложения.

Парочку советов из статьи:

1️⃣ Делайте Inflate layout асинхронно — особенно полезный совет в сложных экранах, где создание новых View довольно затратно. Например, можно использовать AsyncLayoutInflater, а тут можно взять AsyncLayoutInflater на основе Coroutines.

2️⃣ Делайте View плоскими — достаточно распространённый совет, который позволяет уменьшить количество фаз onMeasure.

3️⃣ Ленивая инициализация объектов — инициализация объектов довольно затратный процесс, поэтому правильно настроенное создание объектов может здорово помочь сэкономить при рендеринге.

В статье можно найти ещё несколько примеров, которые реально применить для любого проекта.
👍132👎1
​​Screenshot tests для Compose
#compose

Тестирование при помощи скриншотов — довольно эффективный способ тестирования UI. При использовании Jetpack Compose у нас есть аннотации @Preview, которые, по сути и являются слоем для UI.

Есть библиотека Showkase, которая помогает преобразовать аннотированные методы в элементы UI для предварительного просмотра.
Автор статьи рассказывает о том, как он соединил эту либу с Screenshot testing library от Facebook.

Но он решил пойти чуть дальше и попробовал интегрировать Showkase с библиотекой Paparazzi, которая позволяет получить скриншоты приложения без физического устройства или эмулятора.

🤓 В результате у автора получилось вынести тестирование UI при помощи скриншотов на CI. Если скриншоты отличаются от тех, что были получены в новом PR, то создаётся ветка, где показывается diff между двумя ветками.
Тут автор рассказывает, как можно интегрировать подобный подход в своём приложении.
👍13👎1🔥1
​​Как устроен viewModelScope?
#android

При работе с coroutines мы частенько можем забыть отменить нужную нам джобу в тот момент, когда она нам больше не нужна. К счастью для нас, существует viewModelScope, который уничтожает ненужные coroutines в тот момент, когда уничтожается ViewModel.

Давайте рассмотрим чуть детальнее, как он работает внутри.
Класс ViewModel содержит внутри Map объектов, кототорые могут содержать любой тип объектов.
Нам интересен метод clear(), который вызывается перед методом onCleared() и который мы можем переопределить в нашей модели. Тут вызывается метод closeWithRuntimeException(), который как раз и завершает нужный нам Scope, так как он имплементирует интерфейс Closeable.

Подобное поведение можно было довольно просто организовать и самостоятельно, однако пришлось бы сделать кастомный Scope и завершить его в нужном нам месте. Разработчики Jetpack нам чуть-чуть упростили задачу.

Ещё больше почитать о внутренней работе ViewModel можно тут.
👍17
2025/08/27 23:51:46
Back to Top
HTML Embed Code: