Kotlin Multiplatform Broadcast
9.47K subscribers
821 photos
48 videos
1.09K links
Новости и фичи Kotlin, а также Kotlin Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Compose Multiplatform @compose_broadcast
iOS разработка @ios_broadcast
Новости Android @android_broadcast
Реклама и прочее @android_broadcast_bot
Download Telegram
Итоги 2024 года для 🏝 @kotlin_broadcast

Я и вся команда проекта уходит на новогодние каникулы. Увидимся с вами после праздников в 2025!
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел KotlinX Serialization 1.8.0
👉 Аннотация @JsonIgnoreUnknownKeys - позволит игнорировать неизвестные ключи для отдельных классов, а раньше только можно было для всех классов
👉 Стабилизация SerialDescriptor API и @SealedSerializationApi
👉 Для Java 8 и выше теперь генерируются реализации методов по умолчанию в интерфейсах. Для совместимости работы с предыдущей версии сгенерированного кода добавьте опцию all-compatibility
🛠 Исправления и небольшие улучшения

#kotlin #kotlinx
Immutable Arrays - альтернатива List из Kotlin с аналогичным API, но с настоящей иммутабельностью, лучшей оптимизацией и как итог - лучшей производительностью по сравнению с Array и List!

#kotlin
Если вы хотите понять как устроен компилятор Kotlin, то изучите репозиторий. Там описаны понятия и принципы + даются полезные ссылки по темам

#kotlin #подкапотом
Используйте билдеры коллекций из стандартной библиотеки Kotlin

Иногда сталкиваюсь с кодом функций в Kotlin
val list = mutableListOf()
list.add(...)
list.add(..)
// другие добавления в коллекцию
return list.toList()


Вместо такого подхода я использую функцию buildList(MutableList<E>.() -> Unit), которая принимает на вход лямбду для наполнения коллекции
return buildList {
add(...)
add(...)
// другие добавления в коллекцию
}


Помимо этого функция buildList() позволяет задать capacity - ожидаемое количество элементов в списке (если вы конечно можете это понять). Например,
// задаю capacity на основе максимального ожидаемого кол-ва элементов
return buildList(capacity = 2) {
add(...) // Добавление 1 элемента
if (conidition()) add(...) // Возможное добавление 1 элемента
}


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

Смотрите также функции buildMap() и buildSet()

#kotlin
EitherNet - KMP библиотека для удобной работы с ответами из сети, когда нужно обработать различные типы ответов и не хочется всё это ловить через NetworkException.

Очень давно я делал видео (доступно на YouTube) как сделать такую же обёртку и зачем это нужно

#kotlin #kmp #jvm #android #ios #wasm #js
Чтоб скрыть детали реализации внутри библиотеки, иногда авторы используют классы с внутренней реализацией. Я такой подход использовал в ViewBindingPropertyDelegate для сокрытия реализации и отказа от if:

public object ViewBindingCache {

private var impl: ViewBindingCacheImpl = ViewBindingCacheImpl.Noop

internal fun <T : ViewBinding> getInflateWithLayoutInflater(
viewBindingClass: Class<T>
): InflateViewBinding<T> {
return impl.getInflateWithLayoutInflater(viewBindingClass)
}

internal fun <T : ViewBinding> getBind(
viewBindingClass: Class<T>
): BindViewBinding<T> {
return impl.getBind(viewBindingClass)
}

public fun clear() {
impl.clear()
}

public fun setEnabled(enabled: Boolean) {
impl = if (enabled) ViewBindingCacheImpl.Default() else ViewBindingCacheImpl.Noop
}
}

private sealed interface ViewBindingCacheImpl {
class Default : ViewBindingCacheImpl { ... }
data object Noop : ViewBindingCacheImpl
}


Если бы я не использовал внутреннюю реализацию, то подход был бы такой:
public object ViewBindingCache {

private var cacheEnabled = false
private val cache = mutableMapOf<...>()

internal fun <T : ViewBinding> getInflateWithLayoutInflater(
viewBindingClass: Class<T>
): InflateViewBinding<T> {
if (cacheEnabled) {
return ...
} else {
return ...
}
}

internal fun <T : ViewBinding> getBind(
viewBindingClass: Class<T>
): BindViewBinding<T> {
if (cacheEnabled) {
return ...
} else {
return ...
}
}

public fun clear() {
...
}

public fun setEnabled(enabled: Boolean) {
cache.clear()
this.cacheEnabled = enabled
}
}


Подобный подход используют в KMP, например Jetpack ViewModel. Также скрываются реализации различных lazy делегатов в Kotlin, но через фасад метода с параметром
fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>


#kotlin #AndroidBroadcast #БазаЗнаний
ADB GUI Desktop - KMP Desktop приложения для выполнения ADB с открытым исходным кодом. Дистрибутива нету, запуск только из исходников

#kmp #desktop
🏝 Как работает отмена Kotlin Coroutines под капотом (24м)

Подробная статья о том, что происходит при вызове функции cancel() - отмене корутине, а именно рассказывается про:
👉 Классы Job и JobSupport
👉 Состояния Job
👉 Как работает отмена в Structured Concurrency
👉 Коммуникация между родительской и дочерней Job
👉 Как отменяется функция delay()
👉 Как отменяются suspend функции

#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Если вы хотите найти примеры проектов на Kotlin Multiplatform и Compose Multiplatform - посмотрите подборку на сайте JetBrains.

#kotlin #kmp #compose
Советы по использованию kotlinx.serialization
👉 Создание собственных сериализаторов для данных
👉 Разные способы десериализации Enum Class
👉 Inline сериализация - десериализация объекта в JSON в простой объект вместо Kotlin класса
👉 Полиморфная сериализация - получения разных классов, на основе данных в JSON объекте. Полезно для sealed классов/интерфейсов
👉 Оптимизация JSON
👉 Работа со сложными типами данных
👉 Советы по использованию для высокой скорости работы

#kotlin #kotlinx #serialization #json
Вышел MVIKotlin 4.3.0 - фреймворк для разработки KMP приложений. Существенных новинок нету, а именно обновление на Kotlin 2.1 и др. зависимостей, стабилизация API Store.stateFlow(Lifecycle) и Store.labelsChannel(Lifecycle)

#kotlin #arkivanov #kmp #архитектура
😡 Перестаньте постоянно переключать потоки! (EN,7м)

Разработчика бомбануло что часто в коде видит постоянные переключения поток в корутинах! Написал статью, чтобы рассказать о том что этого делать не надо! Не буду рекомендовать, а ТРЕБУЮ к прочтению всеми разработчиками!

#kotlin #coroutines #concurrency
Sysnotify - KMP библиотека для показа системных уведомлений. Есть поддержка Android, iOS, Windows, macOS, Linux и WEB, но только Android поддерживает все возможности.

#kmp
Разбор Kotlin Coroutines Channels (EN, 13м)
👉 Что такое и зачем нужны
👉 Как устроены Channel
👉 Сравнение с Flow/SharedFlow
👉 Основные типы каналов
👉 Примеры использования

#kotlin #coroutines
Передавайте CoroutineContext вместо CoroutineDispatcher в конструкторы/функции (EN)

На примере различения поведения кода при использовании Dispatchers.Unconfined и EmptyCoroutineContext в статье показали, что принимать CoroutineDispatcher как параметр - не лучшая затея!

Dispatchers.Unconfined будет выполнять код на каком-то из потоков в рамках последнего использованного CoroutineDispatcher

#kotlin #coroutines
💉 Создатель и разработчик Koin поделился планами на будущее библиотеки (EN, 8 мин).

В статье представлен отчёт о текущем прогрессе и планах на ближайшие релизы (4.1 и 4.2):

👉 KMP API: появится KoinMultiplatformApplication, который упростит настройку библиотеки из common кода для всех платформ.

@Composable
fun App() {
KoinMultiplatformApplication(config = koinConfig) {
// ...
}
}


👉 В Composable функциях станет проще инжектировать динамические параметры:

fun MyComposable(
myFactory: MyFactory = koinInject(parameters = parametersOf("first_string"))
)


👉 Koin начнёт отслеживать, что именно он инжектирует в Composable функции, и будет очищать экземпляры после выхода из функции.

👉 Появятся Scope Archetype — шаблоны для управления зависимостями с scope. Это должно упростить работу. Выглядит похоже на Scope в Hilt: activityScope и другие.

👉 Идёт переработка DSL для описания зависимостей. Новый проект получил название koin-fu. Также появится плагин компилятора Kotlin для лучшего анализа метаданных и конфигурации графа зависимостей. Это упростит жизнь разработчикам.

👉 Koin Annotations 2.1: будет поддержка аннотаций @Inject и @Component из JSR 330. Это шаг в сторону функциональности Dagger и Hilt. 🤯

👉 Добавится поддержка Ktor 3.

Версия статьи без VPN: ссылка. (Ставьте 🔥, если стоит добавлять такие ссылки.)

#kmp #kotlin #di #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
Инструкция (EN, 9м) как с помощью библиотеки MockK подменять ответы API, реализованного на Ktor, с DI на Koin

#kotlin