Пример (EN,8М) автоматизации генерации классов UI модели на основе параметров Composable функциb. Используется KSP для генерации кода
🔗 Ссылка без VPN
#kotlin #compose #ksp
🔗 Ссылка без VPN
#kotlin #compose #ksp
👍10
Не стоит использовать CoroutineScope, отвязанный от приложения
Порой в коде встречается ситуация, когда для запуска корутины в репозитории или каком-либо менеджере разработчики создают CoroutineScope:
Но есть вариант хуже:
0️⃣ CoroutineScope не должен создаваться для запуска только одной корутины. ‼️
1️⃣ При создании
2️⃣ CoroutineScope должен быть связан с каким-либо жизненным циклом объекта. Вся суть scope заключается в том, чтобы отменять операции, когда они больше не нужны. Например, viewModelScope привязан к жизни ViewModel. В Android приложениях я всегда создаю Scope, связанный с Android Application классом, - AppScope. Либо использовать AppScope в классах, где нужен scope, либо сделать scope, который будет связан с другим CoroutineScope приложения.
Создать дочерний Scope можно следующим образом:
3️⃣ Вам точно нужен запуск корутины? Или подойдет suspend функция? Определитесь, почему асинхронный код должен работать независимо от вызывающего его кода и не иметь возможности получения информации об окончании работы через suspend. Также можно возвращать объект Job (хотя это спорная практика, на мой взгляд).
4️⃣ Не используйте ‼️ Это наследие старых корутин, когда ещё не было structured concurrency.
Что можете посоветовать вы авторам подобного кода, помимо почитать документацию и курсы? Пишите в комментариях.
#kotlin #coroutines
Порой в коде встречается ситуация, когда для запуска корутины в репозитории или каком-либо менеджере разработчики создают CoroutineScope:
class MyRepository(...) {
private val scope = CoroutineScope()
fun doWork(...) {
scope.launch { /* длительная работа */ }
}
}
Но есть вариант хуже:
class MyRepository(...) {
fun doWork(...) {
CoroutineScope(...).launch { /* длительная работа */ }
}
}
CoroutineScope
следует добавить Job (или SupervisorJob), а также CoroutineDispatcher
, который будет использоваться по умолчанию.Создать дочерний Scope можно следующим образом:
fun CoroutineScope.childScope(
context: CoroutineContext = EmptyCoroutineContext
): CoroutineScope {
return CoroutineScope(
coroutineContext
+ SupervisorJob(parent = coroutineContext[Job])
+ context
)
}
GlobalScope
. Что можете посоветовать вы авторам подобного кода, помимо почитать документацию и курсы? Пишите в комментариях.
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍50❤4🔥1
Вышел Coil 3.1.0 - популярный загрузчик картинок с поддержкой KMP
👉 Улучшили производительность AsyncImage: скорость работы стала лучше на 25-40%, а потребление памяти - на 35-48%
👉 FakeImage теперь deprecated
👉 Появился ColorImage - полезен для возвращения фейковых значений в тестах и для Compose превью
👉 coil-compose-core больше не зависит от
🛠 Множество других исправлений и улучшений API
#kmp #android #compose
👉 Улучшили производительность AsyncImage: скорость работы стала лучше на 25-40%, а потребление памяти - на 35-48%
👉 FakeImage теперь deprecated
👉 Появился ColorImage - полезен для возвращения фейковых значений в тестах и для Compose превью
👉 coil-compose-core больше не зависит от
Dispatchers.Main.immedate
, что позволило исправить баги в работе Paparazzi и Roborazzi🛠 Множество других исправлений и улучшений API
#kmp #android #compose
👍25
Используете runBlocking в продакшен коде приложений (не тесты)?
Anonymous Poll
32%
Да
57%
Нет
3%
Не знаю
7%
Не участвую в опросе
👍5
KMP for Mobile Native Developers: The Book - открытая онлайн книга про KMP.
Что входит:
1️⃣ Введение в KMP
2️⃣ Базовая структура проекта
3️⃣ Dependency Injection
4️⃣ Модуляризация
5️⃣ Тестирование
6️⃣ Использование нативных библиотек в KMP
7️⃣ Библиотеки: сеть, хранилище, база данных, Jetpack KMP
#kmp
Что входит:
#kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤49👍14🔥12🎉1
На основе обратной связи от партнеров JetBrains отказалась от разработки отдельной IDE для KMP разработки, а также свернет поддержку KMP в Fleet к июню 2025.
🎉 Поддержка KMP будет сделана в IntelliJ IDEA and Android Studio. Жду когда все фичи из Fleet для KMP перейдет в IDEA
Лично меня новость очень порадовала, чтобы не плодилось кучу IDEA
#kmp #idea #fleet
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉72👍6❤2
Junie - новый кодинг ассиcтент от JetBrains. На момент выхода поста находится в EAP
#idea #ai #jetbrains
#idea #ai #jetbrains
❤11👍4
💡Делайте как можно меньше public
Представьте, что вы случайно сделали внутреннюю функцию публичной – и ваш Gradle-модуль начинает "протекать" наружу лишним кодом. Неявное указание модификаторов доступа может привести к тому, что даже те классы и функции, которые вы планировали использовать только внутри модуля, становятся частью публичного API. Это усложняет поддержку и тестирование, а также увеличивает риск возникновения нежелательных зависимостей.
Решение? Включите Kotlin Explicit Mode (введён в Kotlin 1.4)! С включением этой опцией разработчики будут обязаны явно указывать модификаторы доступа для всех элементов. Таким образом, вы контролируете, что именно экспортируется, и защищаете внутреннюю логику от случайного использования.
Пример настройки в Gradle
Рекомендация: используйте internal или private, а к public прибегайте только тогда, когда вы точно понимаете, что этот API должен быть доступен в модулях, подключивших ваш код.
Это небольшое усилие на этапе разработки поможет сохранить чистоту архитектуры и упростить поддержку вашего кода в будущем. Хотя данная функция рекомендуется для авторов библиотек, в современных многомодульных проектах, где работает целая команда разработчиков, она позволяет эффективно ограничить доступ к API из других модулей.
#kotlin #лучшиепрактики
Представьте, что вы случайно сделали внутреннюю функцию публичной – и ваш Gradle-модуль начинает "протекать" наружу лишним кодом. Неявное указание модификаторов доступа может привести к тому, что даже те классы и функции, которые вы планировали использовать только внутри модуля, становятся частью публичного API. Это усложняет поддержку и тестирование, а также увеличивает риск возникновения нежелательных зависимостей.
Решение? Включите Kotlin Explicit Mode (введён в Kotlin 1.4)! С включением этой опцией разработчики будут обязаны явно указывать модификаторы доступа для всех элементов. Таким образом, вы контролируете, что именно экспортируется, и защищаете внутреннюю логику от случайного использования.
Пример настройки в Gradle
kotlin {
// Без указания модификатора доступа код не скомпилируется
explicitApi()
// или
explicitApi = ExplicitApiMode.Strict
// Сборка пройдет успешно, но в логах появятся предупреждения
explicitApiWarning()
// или
explicitApi = ExplicitApiMode.Warning
}
Рекомендация: используйте internal или private, а к public прибегайте только тогда, когда вы точно понимаете, что этот API должен быть доступен в модулях, подключивших ваш код.
Это небольшое усилие на этапе разработки поможет сохранить чистоту архитектуры и упростить поддержку вашего кода в будущем. Хотя данная функция рекомендуется для авторов библиотек, в современных многомодульных проектах, где работает целая команда разработчиков, она позволяет эффективно ограничить доступ к API из других модулей.
#kotlin #лучшиепрактики
🔥49👍23👎1
🚀 Ktor 3.1.0 уже здесь!
JetBrains выпустила новый минорный релиз, который приносит множество полезных обновлений для Android-разработчиков.
👉 Новый CLI-конфигуратор – генерация проектов стала проще.
👉 Поддержка SSE – улучшенная сериализация и heartbeat-события.
👉 Multipart в HttpClient – удобная работа с загрузкой файлов.
👉 Экспериментальная поддержка WASM – новые горизонты для Ktor.
👉 Начало интеграции gRPC – первый шаг к мощной серверной коммуникации.
👉 Движок на основе Curl больше не требует установки сторонних зависимостей, поддерживает ARM и WebSocket
#kotlin #ktor #wasm #grpc
JetBrains выпустила новый минорный релиз, который приносит множество полезных обновлений для Android-разработчиков.
👉 Новый CLI-конфигуратор – генерация проектов стала проще.
👉 Поддержка SSE – улучшенная сериализация и heartbeat-события.
👉 Multipart в HttpClient – удобная работа с загрузкой файлов.
👉 Экспериментальная поддержка WASM – новые горизонты для Ktor.
👉 Начало интеграции gRPC – первый шаг к мощной серверной коммуникации.
👉 Движок на основе Curl больше не требует установки сторонних зависимостей, поддерживает ARM и WebSocket
#kotlin #ktor #wasm #grpc
🔥32👍9🎉3❤1
Кажется, я совсем недавно еще работал с бета-версиями первой версии Kotlin, писал приложения с расписанием для университета, где учился, чтобы попробовать эту технологию. Тогда была только поддержка JVM и проводились эксперименты с JS.
Сегодня Kotlin - это уже целая экосистема
Уже появилось поколение разработчиков, которые начали свой путь именно с Kotlin для разработки под Android 🤯🤯🤯
Поделитесь в комментариях под постом в @kotlin_broadcast своей историей знакомства с этим языком и тем, что вас привлекло в нем.
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤65🔥14👍8🎉7
Forwarded from Kotlin Adept Notes (Alex Panov)
Decompose Detekt Rules
Я написал кастомные правила для Detekt, которые будут полезны в каждом проекте с Decompose.
На данный момент в библиотеке есть два правила:
🟣 DecomposeComponentContextRule — проверяет, что вы не создаете ComponentContext внутри Composable функций, так как это может привести к падениям в рантайме.
🟣 SerializableDiscriminatorRule — это правило не относится напрямую к Decompose, но тесно с ним связано. Оно проверяет, что в конфигурации компонента не указаны свойства, совпадающие с дискриминатором класса в kotlinx.serialization, подробнее про это здесь.
Правила работают с обычной конфигурацией Detekt, без type resolution. Также я не пытался охватить все возможные краевые кейсы, поэтому, если в вашем проекте они не работают, смело зводите issue.
🐱 Документация и инструкция по подключению находится здесь.
Я написал кастомные правила для Detekt, которые будут полезны в каждом проекте с Decompose.
На данный момент в библиотеке есть два правила:
Правила работают с обычной конфигурацией Detekt, без type resolution. Также я не пытался охватить все возможные краевые кейсы, поэтому, если в вашем проекте они не работают, смело зводите issue.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24🔥5👍1👎1
Используйте Kotlin Sequences ?
Anonymous Poll
22%
Что это?
34%
Знаю, но не использую
33%
Использую очень редко
6%
Использую регулярно
1%
Не пишу на Kotlin
4%
Не участвую в опросе
👍12❤2
Kotlin Sequences - это API для процессинга набора данных, где каждый оператор в цепочке обрабатывает каждый элемент в последовательности, а не все элементы на каждом шаге оператора
Операторы Kotlin Std Lib для коллекций на каждом этапе обрабатывают все элементы.
Сравнение работы таких подходов вы найдете в статье "Should you use Kotlin Sequences for Performance?" (EN, 5 минут).
Операторы Kotlin Std Lib для коллекций на каждом этапе обрабатывают все элементы.
Сравнение работы таких подходов вы найдете в статье "Should you use Kotlin Sequences for Performance?" (EN, 5 минут).
🔥18👍10❤1
Какая нейросеть лучше для помощи с Kotlin кодом?
Anonymous Poll
5%
OpenAI o1
11%
DeepSeek-R1
5%
OpenAI o3-mini
4%
Google Gemini 2.0 Flash
6%
Anthropic Claude 3.5 Sonnet
14%
OpenAI GPT-4o
3%
Другая
52%
Не участвую в опросе
👍5