Kotlin Multiplatform Broadcast
9.48K subscribers
834 photos
53 videos
1.13K links
Новости и фичи Kotlin, а также Kotlin Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Compose Multiplatform @compose_broadcast
iOS разработка @ios_broadcast
Новости Android @android_broadcast
Реклама и прочее @android_broadcast_bot
Download Telegram
Пример (EN,8М) автоматизации генерации классов UI модели на основе параметров Composable функциb. Используется KSP для генерации кода

🔗 Ссылка без VPN

#kotlin #compose #ksp
👍10
Не стоит использовать CoroutineScope, отвязанный от приложения

Порой в коде встречается ситуация, когда для запуска корутины в репозитории или каком-либо менеджере разработчики создают CoroutineScope:
class MyRepository(...) {

private val scope = CoroutineScope()

fun doWork(...) {
scope.launch { /* длительная работа */ }
}
}


Но есть вариант хуже:
class MyRepository(...) {

fun doWork(...) {
CoroutineScope(...).launch { /* длительная работа */ }
}
}


0️⃣ CoroutineScope не должен создаваться для запуска только одной корутины. ‼️

1️⃣ При создании CoroutineScope следует добавить Job (или SupervisorJob), а также CoroutineDispatcher, который будет использоваться по умолчанию.

2️⃣ CoroutineScope должен быть связан с каким-либо жизненным циклом объекта. Вся суть scope заключается в том, чтобы отменять операции, когда они больше не нужны. Например, viewModelScope привязан к жизни ViewModel. В Android приложениях я всегда создаю Scope, связанный с Android Application классом, - AppScope. Либо использовать AppScope в классах, где нужен scope, либо сделать scope, который будет связан с другим CoroutineScope приложения.

Создать дочерний Scope можно следующим образом:
fun CoroutineScope.childScope(
context: CoroutineContext = EmptyCoroutineContext
): CoroutineScope {
return CoroutineScope(
coroutineContext
+ SupervisorJob(parent = coroutineContext[Job])
+ context
)
}


3️⃣ Вам точно нужен запуск корутины? Или подойдет suspend функция? Определитесь, почему асинхронный код должен работать независимо от вызывающего его кода и не иметь возможности получения информации об окончании работы через suspend. Также можно возвращать объект Job (хотя это спорная практика, на мой взгляд).

4️⃣ Не используйте GlobalScope. ‼️ Это наследие старых корутин, когда ещё не было structured concurrency.

Что можете посоветовать вы авторам подобного кода, помимо почитать документацию и курсы? Пишите в комментариях.

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍504🔥1
Вышел Coil 3.1.0 - популярный загрузчик картинок с поддержкой KMP

👉 Улучшили производительность AsyncImage: скорость работы стала лучше на 25-40%, а потребление памяти - на 35-48%
👉 FakeImage теперь deprecated
👉 Появился ColorImage - полезен для возвращения фейковых значений в тестах и для Compose превью
👉 coil-compose-core больше не зависит от Dispatchers.Main.immedate, что позволило исправить баги в работе Paparazzi и Roborazzi
🛠 Множество других исправлений и улучшений API

#kmp #android #compose
👍25
Статья (EN,7м) с разбором как устроен под капотом и работает runBlocking { }.

#kotlin #coroutines
👍13
Используете runBlocking в продакшен коде приложений (не тесты)?
Anonymous Poll
32%
Да
57%
Нет
3%
Не знаю
7%
Не участвую в опросе
👍5
Money - библиотека для проведения расчетов денег для Kotlin JVM

#kotlin
🔥45👍123
KMP for Mobile Native Developers: The Book - открытая онлайн книга про KMP.

Что входит:
1️⃣Введение в KMP
2️⃣Базовая структура проекта
3️⃣Dependency Injection
4️⃣Модуляризация
5️⃣Тестирование
6️⃣Использование нативных библиотек в KMP
7️⃣Библиотеки: сеть, хранилище, база данных, Jetpack KMP

#kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
149👍14🔥12🎉1
🏝 Отдельной IDE для KMP не будет. Jetbrains официально отказалась от разработки 🎉

На основе обратной связи от партнеров 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👍62
Junie - новый кодинг ассиcтент от JetBrains. На момент выхода поста находится в EAP

#idea #ai #jetbrains
11👍4
💡Делайте как можно меньше public

Представьте, что вы случайно сделали внутреннюю функцию публичной – и ваш 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
🔥32👍9🎉31
🏝 9 лет назад вышла первая версия Kotlin 🎉🎉🎉

Кажется, я совсем недавно еще работал с бета-версиями первой версии Kotlin, писал приложения с расписанием для университета, где учился, чтобы попробовать эту технологию. Тогда была только поддержка JVM и проводились эксперименты с JS.

Сегодня Kotlin - это уже целая экосистема💪, которая позволяет писать приложения для нескольких платформ, имеет огромное сообщество разработчиков, а также официальную поддержку от команды 🤖 Android в Google. А как хорош Compose Multiplatform ❤️❤️❤️

Уже появилось поколение разработчиков, которые начали свой путь именно с 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.

🐱 Документация и инструкция по подключению находится здесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
24🔥5👍1👎1
Kotlin Sequences - это API для процессинга набора данных, где каждый оператор в цепочке обрабатывает каждый элемент в последовательности, а не все элементы на каждом шаге оператора

Операторы Kotlin Std Lib для коллекций на каждом этапе обрабатывают все элементы.

Сравнение работы таких подходов вы найдете в статье "Should you use Kotlin Sequences for Performance?" (EN, 5 минут).
🔥18👍101
🏝 Какая AI модель лучше всего работает с Kotlin?

JetBrains провела сравнение популярных AI моделей, оценивая, как они отвечают на вопросы, связанные с Kotlin. Для этого они создали свой бенчмарк - KotlinHumanEval. Победители:
🥇OpenAI o1 - 91.93%
🥈DeepSeek R1 - 88.82% (-3.11% от o1)
🥉OpenAI o3-mini - 86.96% (-4.97% от o1)

Второй бенчмарк - Kotlin_QA, который проверяет, как модель качественно отвечает на вопросы по Kotlin и объясняет, что делает Kotlin-код. Dev Advocate собрали 47 популярных вопросов и отправили нейросеткам. Победители второго теста поменялись:
🥇DeepSeek-R1 - 8.79/10
🥈OpenAI o3-mini - 8.7/10
🥉OpenAI o1 - 8.62/10

#kotlin #ai #jetbrains
Please open Telegram to view this post
VIEW IN TELEGRAM
👍45