Kotlin Multiplatform Broadcast
9.46K subscribers
825 photos
51 videos
1.1K links
Новости и фичи Kotlin, а также Kotlin Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Compose Multiplatform @compose_broadcast
iOS разработка @ios_broadcast
Новости Android @android_broadcast
Реклама и прочее @android_broadcast_bot
Download Telegram
🏝 Вышел KtLint 1.6.0 - линтер для проверки соблюдения стиля Kotlin кода

Что нового:
👉 Добавлена возможность настройки некоторых аннотаций с параметрами таким же образом как и без параметров
👉 Добавили свойство для предотвращения ошибки при использовании ktlint-intellij-plugin
🛠 Исправление ошибок
⬆️ Обновлений версий зависимостей

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Показали новую версию Amper с поддержкой iOS в KMP в standalone версии (без Gradle под капотом). Ранее в KMP были Android и Desktop.

#kotlin #amper #ios
🏝 JetBrains представила Koog - Kotlin Framework для разработки AI агентов

val agent = simpleSingleRunAgent(
executor = simpleOpenAIExecutor(apiKey),
systemPrompt = "Answer user questions concisely.",
llmModel = OpenAIModels.Chat.GPT4o
)

val result = agent.runAndGetResult("Hello! How can you help me?")
println(result)


Подробнее читайте в документации

#kotlin #ai
Please open Telegram to view this post
VIEW IN TELEGRAM
KSensor - KMP библиотека для работы с сенсорами на Android и iOS. Поддерживает акселерометр, гироскоп. магнитометр, барометр, счетчик шагов, местоположение

val sensors = listof(
SensorType.ACCELEROMETER,
SensorType.GYROSCOPE,
SensorType.MAGNETOMETER,
SensorType.BAROMETER,
SensorType.STEP_COUNTER,
SensorType.LOCATION,
)

// Register sensors
KSensor.registerSensors(
types = sensors,
locationIntervalMillis = {optional. default is 1000L},
onSensorData = { type, data ->
println("Sensor: $type - Data: $data")
},
onSensorError = { error ->
println("Sensor error: ${error.message}")
}
)

// Unregister sensors when no longer needed
KSensor.unregisterSensors(sensors)


#kotlin #kmp #android #ios
🏝 Stacktrace-decoroutinator поможет вам сделать стектрейс в вызовах корутин подробнее и понятным. Работает с JVM 1.8 и выше, а также на Android 14+

Самый простой способ подключения - через Gradle плагин

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Функции check() и require() в Kotlin — когда и зачем использовать?

В Kotlin Standard Library есть две полезные функции, которые помогают явно выражать условия выполнения кода:
require() — используется для проверки аргументов функции.
check() — используется для проверки внутреннего состояния объекта или логики приложения.

Эти функции выбрасывают исключения, если указанное условие не выполняется:
👉 require() выбрасывает IllegalArgumentException
👉 check() выбрасывает IllegalStateException

📌 Примеры применения:
// require() для проверки входных аргументов:
fun calculateArea(width: Int, height: Int): Int {
require(width > 0 && height > 0) {
"Width and height must be positive!"
}
return width * height
}


// check() для контроля состояния внутри объекта:
class Connection {
var isConnected: Boolean = false

fun send(data: String) {
check(isConnected) {
"Cannot send data: not connected!"
}
// отправка данных
}
}


Важный плюс использования check() и require() — это контракты Kotlin, благодаря которым компилятор лучше понимает состояние переменных после проверки и помогает избежать лишних проверок и ошибок.

Например:
val data: String? = getData()
checkNotNull(data) {
"Data must not be null!"
}
// Теперь компилятору гарантировано data != null
println(data.length)


⚠️ Хорошо ли специально выбрасывать исключения?

Выбрасывать исключения — это нормально и полезно, когда приложение попадает в ситуацию, которая явно нарушает его логику. Это помогает выявлять ошибки на ранних стадиях и делать код чище и надежнее. Однако не стоит использовать исключения для управления нормальным потоком программы. Исключения предназначены именно для «исключительных» ситуаций, а не для стандартного поведения.

Считаете ли вы нормальным выбросить исключение или лучше другим путем обработать ошибку? Делитесь в комментариях

#kotlin #stdlib
Media is too big
VIEW IN TELEGRAM
⏸️🤯 Активное использование Main Dispatcher делает ваше приложение медленным

📹 Очень классный доклад с Mobius Весна 2025 с погружением в работу кода на корутинах на Android, анализ долгих ожиданий Main Thread из-за его загруженности и почему стоит максимально всегда запускать операции в ViewModel (и не только там) на Dispatchers.Default или Dispatchers.IO

Александр Таганов проделал крутую работу и его кейс позволит ускорить ваши приложения!

Также можно посмотреть на 📹 VK Video

00:00 - Про доклад
02:44 - Долгое ожидание простых операций
12:59 - Разбор причины долгих загрузок
21:30 - Выводы после анализа
24:35 - На что стоит заменить Dispatchers.Main
27:50 - Тестирование разных Dispatcher

#kotlin #coroutines #android
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
📹 Отрывок Kotlin Conf Keynote с рассказом про будущие фичи в Kotlin. Что-то увидем осенью 2025, а что-то ждать больше года 🤯

0:00 Вступление
0:30 Positional Destructing (есть)
1:09 Named-based destructing (новая)
1:51 Nullability: Safety and ergonomics
3:00 Error class/object (новая)
4:07 Must-use Return Values (новая)

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел второй Release Candidate следующей версии Kotlin - 2.2

#kotlin
💉 Вышел Koin 4.1

Что нового:
👉 Упростили конфигурацию
👉 Улучшили работу со Scope. Дообавили архитипы для Scope
👉 ViewModel Scope интегрировали с механизмом ViewModel auto closable
👉 Появилась возможность проверки конфигурации через через тесты
👉 Поддержка Compose 1.8 и Lifecycle 2.9
👉 Поддеркжа Ktor 3.2

🔗 Альтернативная ссылка

#kotlin #di
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
📹 История, принципы и концепции библиотеки навигации Decompose

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

Также из доклада вы узнаете об основных API библиотеки, и поймете, как и почему так просто создавать свои собственные модели навигации. Вы узнаете не только «как», но и «почему».

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

#kmp #архитектура #kotlin #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Стали доступны записи доклад с KotlinConf 2025

Все сессии можно найти в расписании. Пока только на сайте, но там встроен YouTube плеер, так что позже выпустят плейлист. В @kotlin_broadcast буду выкладывать доклады и рассказывать самое интересное

#kotlin #kotlinconf
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Вышел Ktor 3.2.0 (есть баг в Android, не спешите обновляться)

Что нового в свежей версии:
👉 типизированная конфигурация
@Serializable
data class DatabaseConfig(
val jdbcUrl: String,
val username: String,
val password: String,
)
fun Application.module() {
property<DatabaseConfig>("database")
}


👉 Cобственный DI
fun Application.database(@Property("database") config: DatabaseConfig) {
dependencies {
provide("optional-name") { HikariDataSource(...) }
provide {
Database.connect(resolve<HikariDataSource>("optional-name"))
} cleanup { database: Database ->
TransactionManager.closeAndUnregister(database)
}
}
}

// suspend DI
suspend fun Application.module() {
val database: Database = dependencies.resolve()
...
}


👉 CIO клиент с поддержкой домен сокетов
val server = embeddedServer(CIO, configure = {
unixConnector("/tmp/test-unix-socket-client.sock")
}) {
routing {
get("/") {
call.respondText("Hello, Unix socket world!")
}
}
}


👉 Более тесная интеграция с HTMX (библиотека JavaScript, которая позволяет создавать динамические веб-интерфейсы без написания JavaScript-кода)
fun Application.routing() {
hx.get("/status") { /* Return HTML content */ }
get("/status") {
call.respondHtml {
head { script { src = "https://unpkg.com/htmx.org@1.9.12" } }
body {
div {
attributes.hx {
get = "/status"
trigger = "load"
}
}
}
}
}
}


👉 Ktor Version Catalog
// settings.gradle.kts
dependencyResolutionManagement {
versionCatalogs {
create("ktorLibs") {
from("io.ktor:ktor-version-catalog:3.2.0")
}
}
}


‼️ Есть баг при использовании Android R8, ждем фикса в 3.2.1

#ktor #kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🐱 Ktorm - Kotlin ORM где вам не надо писать сырые запросы, а все красиво через API

#kotlin #sql
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
📹 Посмотрел доклад (EN,45м) про Rich Error в Kotlin (ожидаются в версии 2.4). Конечно это новый уровень обработки ошибок и упрощения написания кода. Очень жду фичу!

На днях выложу видео где расскажу простым языком все изменения и расскажу как поменяет язык!

#kotlin #kotlinconf25
Please open Telegram to view this post
VIEW IN TELEGRAM
Если коротко - теперь появляется в синтаксисе error class и он будет указывать как атрибутом типа (обычно для возвращаемого, но можно и для типов переменных, так и для generic). Фактически теперь не надо писать свои Result типы, а они будут из коробки в языке с удобным синтаксимом обработки.

#kotlin
Media is too big
VIEW IN TELEGRAM
📹 Обязательное использование возвращаемых значений в Kotlin (EN, 30м)

Одна из новых экспериментальных фичей - режим работ компилятора, когда необходимо обработать возвращаемые значения функций. Зачем? Иногда допускаются ошибки из-за пропуска этого момента.

Уже доступно в Kotlin 2.2.0-Beta1. Нужно включить экспериментальные флаги

kotlin {
compilerOptions {
freeCompilerArgs.add("-Xreturn-value-checker=check|full")
}
}


#kotlin #kotlinconf25
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Вышел Kotlin 2.2.0

Что нового в релизе языка:
👉 Превью context parametr
👉 Non-local break и continue теперь stable
👉 Kotlin/JVM: изменения в генерации метода по умолчанию
👉 Kotlin/Native: улучшения в управлением памятью
👉 Kotlin/Wasm: wasmJs таргет отделили от js таргета
🐘 Поддержка Gradle 7.6.3 - 8.14
👉 Base64 стало Stable

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM