Telegram Web Link
🏝 Kotlin 2.2.0 уже совсем скоро - вышла Release Candidate версия

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Вышел SqlDelight 2.1.0

👉 Очень много улучшений для PostgreSql
👉 Поддержка WASM/JS
🏝 Поддержка K2
🛠 Множество исправлений и улучшений

#kotlin #kmp #sqlite #k2
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 KStorage — единый подход к key-value хранилищам на Kotlin Multiplatform. Работает как обертка над другими хранилищами. Из коробки готовых оберток не предоставляется, что является минусом

Подробнее можно почитать в статье (РУ, 5м)

// пример использования библиотеки
class SuspendSettingsApi(private val intSettingsMap: MutableMap<String, Int>) {
val suspendMutableKrate: SuspendMutableKrate<Int> = DefaultSuspendMutableKrate(
factory = { 0 },
loader = { intSettingsMap["INT_KEY"] },
saver = { value -> intSettingsMap["INT_KEY"] = value }
)

val stateFlowSuspendMutableKrate: StateFlowSuspendMutableKrate<Int> = DefaultStateFlowSuspendMutableKrate(
factory = { 0 },
loader = { intSettingsMap["INT_KEY"] },
saver = { value -> intSettingsMap["INT_KEY"] = value }
)
}


#kotlin #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Обновление KMP плагина в IDEA и Android Studio (EN)

JetBrains ранее отказалась от разработки отдельной IDE для Kotlin Multiplatform и активного расширения возможностей KMP во Fleet в пользу улучшения поддержки в уже привычных для разработчиков продуктах

Вышла версия KMP плагина 0.9.0 в которой появилась новые возможности

🪄 Новый визард для создания нового проекта: поддержка всех таргетов, настройки использования Compose или нативного UI

💊 Проверка настройка окружения на компьютере: фактически интегрировали KDoctor.

🦢 Поддержка платформенных языков: для Kotlin и Swift будет поддерживаться навигация, подсветка синтаксиса, быстрая документация и дебаг из IDEA и Android Studio

⚙️ Поддержка Compose Multiplatform: будет поддержка ресурсов, превью из common кода, конечно же автокомплит, навигация, рефакторинг и всё всё всё

⚙️ Compose Hot Reload для JVM Desktop - обновление Compose UI без перезапуска приложения и с сохранением состояния. Отлаживать на Desktop удобно, даже если вы разрабатываете только под мобилку, то добавьте таргет чтобы писать удобнее.

Для использование фичей нужны самые свежие версии IDE, а то и вовсе Canary версия Android Studio. Уже сейчас доступна версия плагина 0.9 и ждем Stable

#kotlin #kmp #androidstudio #idea #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Команда плагина будет работать над улучшениями инструментов для KMP разработки

💻 Поддержка Windows и Linux: появится возможность использования KMP плаигна на Windows и Linux, но запуск iOS приложений останется пререгативой macOS

🦢 Расширенная поддержка Swift: текущий плагин имеет базовую поддержку Swift, но будет добавляться поддержка фичей сложнее: поиск использований, навигации по иерархии типов и др.

🏝 Создание KMP модулей в проекте: создание KMP модулей с использованием стандартного KMP визарда

🛠 Лучшая поддержка инструментов для Web и Desktop: после стабилизации поддержки мобильных платформ, будет фокус на улучшение поддержки таргетов Web и Desktop.

#kotlin #kmp #idea #androidstudio
Please open Telegram to view this post
VIEW IN 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Konfeature - open-source библиотека для работы с Feature Flags

Библиотека от red_mad_robot для фича флагами (анонс тут). Умеет:
👉 Чёткое разделение на remote и local-only флаги
👉 Поддержка нескольких remote-источников (Firebase, HMS, собственный бэкенд)
👉 Детальное логирование
👉 Возможность переопределения значений при разработке и тестировании
👉 Поддержка многомодульности

class ProfileFeatureConfig : FeatureConfig(
name = "profile_feature_config",
description = "Config of features for profile usage"
) {
val isProfileFeatureEnabled: Boolean by toggle(
key = "profile_feature",
description = "show profile entry point for user",
defaultValue = false,
)

val profileFeatureTitle: String by value(
key = "profile_feature_title",
description = "title of profile entry point button",
defaultValue = "Feature number nine",
sourceSelectionStrategy = SourceSelectionStrategy.Any
)

val profileButtonAppearDuration: Long by value(
key = "profile_button_appear_duration",
description = "duration of profile button appearing in ms",
defaultValue = 200,
sourceSelectionStrategy = SourceSelectionStrategy.Any
)
}


❗️Библиотека написана на KMP, но пока есть только JVM таргет
Мне также не хватило готово UI модуля для переключения значений фича флагов и значений Remote Config
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
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Stacktrace-decoroutinator поможет вам сделать стектрейс в вызовах корутин подробнее и понятным. Работает с JVM 1.8 и выше, а также на Android 14+

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

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Какое Java исключение выбросит вызов метода check(false) из стандартной библиотеки ?
Anonymous Quiz
24%
IllegalArgumentException
40%
IllegalStateException
32%
CheckConditionException
4%
Другое исключение
🔥 Функции 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
2025/06/28 12:09:51
Back to Top
HTML Embed Code: