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,7м)

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

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

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

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

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

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

#kotlin #coroutines
👍15🔥4🎉1
💉 Создатель и разработчик 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
🔥783🎉3👍2
Инструкция (EN, 9м) как с помощью библиотеки MockK подменять ответы API, реализованного на Ktor, с DI на Koin

#kotlin
🔥11👍2
Для меня ключевой фичёй языка Kotlin является - Nullable типы (Null-safety)

Почему? Это позволило сделать систему типов более строгой, избавиться от проверок на null или наоборот принуждает их выполнить! После опыта Java именно проблема с null была самой большой (известная как “Billion Dollar Mistake”)!

Выделить отдельную фичу невероятно трудно, но я это делал именно по ценности для конечного продукта и его стабильности. Все возможности Kotlin как набор звуков - соединив их вместе, получаешь прекрасную музыку. Только как и с любым музыкальным инструментом в раках дилетанта может получиться что-то страшное и пугающее 🤬
🔥52👍166
This media is not supported in your browser
VIEW IN TELEGRAM
KtorCLI - утилита командной строки для генерации новых проектов на Ktor

#kotlin #ktor
🔥39👍94
SKIE от TouchLab обзавелся возможность расширения через сабплагины

SKIE - плагин Kotlin компилятора для генерации удобного для вызова в Swift кода из Kotlin кода

API расширения позволит вам добавить фичи, которых нет в SKIE, или добавить фичи, которые нужны для вашего проекта. Пример написания плагина в анонсе, а исходный код на GitHub

#kmp #swift #touchlab
🔥11👍3
🏝 Вышел Kotlin 2.1.10

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

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Вышло обновление Web Wizard генератора Ktor проекта

Что нового:
👉 Обновленный дизайн
👉 Упростили настройку проекта
👉 Превью проекта, который будет сгенерирован

#kotlin #ktor
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍7
Что бы вы изменили в это коде и почему?

fun PersonDto?.toPerson(): Person? = 
if (this == null) {
null
} else {
Person(
name = name,
surname = surname,
age = age
)
}
Kotlin Multiplatform Broadcast
Что бы вы изменили в это коде и почему? fun PersonDto?.toPerson(): Person? = if (this == null) { null } else { Person( name = name, surname = surname, age = age ) }
Не делайте single-expression функции, если она занимает у вас больше 1 строки

Пример кода из поста выше читается очень сложно из-за многострочного if/else, который используется как выражения для функции чтобы не писать тело. Правило просто - в функции больше одной строки, то точно объявляете тело {}

Исключения бывают, о них ниже

Код и поста станет выглядеть так
fun PersonDto?.toPerson(): Person? {
if (this == null) {
return null
} else {
return Person(
name = name,
surname = surname,
age = age
)
}
}
👍16🎉1
Когда полезно использовать single-exression fun

Есть удобные кейсы, когда многострочные single-expression функции могут быть полезны. Все они связаны с вызовом функции/инструкции с телом, например

fun a() = when(...)  {
// Позволяет сделать exhausted when,
// через обязательный возврат значений в каждой ветке

// Предпочитаю с каждом case делать только одну строчку,
// все что больше - переношу в функции и вызываю её

// С if-else так красиво не выглядит, но тоже можно
}

fun b() = buildList {
// билдер функция коллекции
}

fun c(...) = with(...) {
// Изменил this в блоке кода
}
👍11
‼️ Избегайте расширений для Nullable типов

Смысл делать расширения для Nullable типа бывает очень редко. В примере, что я привёл вам выше произошло только усложнения кода и добавления дополнительной инструкций т.к. null вернет null. Операторы для работы с Null safety (?. и ?:) прекрасно справляются с этим

Как понять стоит ли делать расширение для Nullable функции - объясните себе нестандартное поведение для null значения либо функция имеет суть только в случае Nullable типа

Обновленный код будет выглядеть так:
fun PersonDto.toPerson(): Person {
return Person(
name = name,
surname = surname,
age = age
)
}

val personDto: Person? = ...
val person: Person? = personDto?.toPerson()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39🎉6
Используйте trailing comma при работе с аргументами

trailing comma полезная фича, чтобы сделать историю в VCS боле красивой. Давайте на примере:
Person(
name = name,
surname = surname,
age = age // Без необязательной запятой после последнего аргумента
)

теперь мне надо добавить новое свойство и задавать его
1 Person(
2 name = name,
3 surname = surname,
4 age = age, // Добавил запятую для отделения инструкций
5 id = id
6)

После таких изменений в VCS отразиться изменения в 2 строчках - номер 4 и 5. Если же изначально я использовал trailing comma везде, то изменение было бы только в одной строке - 5.

Другой пользы от trailing comma фичи я не знаю, а вы можете поделиться в комментариях

UPD: в IDE ещё удобно менять порядок передачи именованных аргументов в многострочном вызове функции
👍37
Forwarded from In AsyncTask We Trust
👍103🔥5716