EitherNet - KMP библиотека для удобной работы с ответами из сети, когда нужно обработать различные типы ответов и не хочется всё это ловить через NetworkException.
Очень давно я делал видео (доступно на YouTube) как сделать такую же обёртку и зачем это нужно
#kotlin #kmp #jvm #android #ios #wasm #js
Очень давно я делал видео (доступно на YouTube) как сделать такую же обёртку и зачем это нужно
#kotlin #kmp #jvm #android #ios #wasm #js
👍28
Чтоб скрыть детали реализации внутри библиотеки, иногда авторы используют классы с внутренней реализацией. Я такой подход использовал в ViewBindingPropertyDelegate для сокрытия реализации и отказа от if:
Если бы я не использовал внутреннюю реализацию, то подход был бы такой:
Подобный подход используют в KMP, например Jetpack ViewModel. Также скрываются реализации различных lazy делегатов в Kotlin, но через фасад метода с параметром
#kotlin #AndroidBroadcast #БазаЗнаний
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 #БазаЗнаний
🔥12👍7
ADB GUI Desktop - KMP Desktop приложения для выполнения ADB с открытым исходным кодом. Дистрибутива нету, запуск только из исходников
#kmp #desktop
#kmp #desktop
👍25
Подробная статья о том, что происходит при вызове функции cancel() - отмене корутине, а именно рассказывается про:
👉 Классы Job и JobSupport
👉 Состояния Job
👉 Как работает отмена в Structured Concurrency
👉 Коммуникация между родительской и дочерней Job
👉 Как отменяется функция delay()
👉 Как отменяются suspend функции
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍6❤2
Советы по использованию kotlinx.serialization
👉 Создание собственных сериализаторов для данных
👉 Разные способы десериализации Enum Class
👉 Inline сериализация - десериализация объекта в JSON в простой объект вместо Kotlin класса
👉 Полиморфная сериализация - получения разных классов, на основе данных в JSON объекте. Полезно для sealed классов/интерфейсов
👉 Оптимизация JSON
👉 Работа со сложными типами данных
👉 Советы по использованию для высокой скорости работы
#kotlin #kotlinx #serialization #json
👉 Создание собственных сериализаторов для данных
👉 Разные способы десериализации Enum Class
👉 Inline сериализация - десериализация объекта в JSON в простой объект вместо Kotlin класса
👉 Полиморфная сериализация - получения разных классов, на основе данных в JSON объекте. Полезно для sealed классов/интерфейсов
👉 Оптимизация JSON
👉 Работа со сложными типами данных
👉 Советы по использованию для высокой скорости работы
#kotlin #kotlinx #serialization #json
❤21👍8
Вышел MVIKotlin 4.3.0 - фреймворк для разработки KMP приложений. Существенных новинок нету, а именно обновление на Kotlin 2.1 и др. зависимостей, стабилизация API
#kotlin #arkivanov #kmp #архитектура
Store.stateFlow(Lifecycle)
и Store.labelsChannel(Lifecycle)
#kotlin #arkivanov #kmp #архитектура
👍25❤4🔥4
😡 Перестаньте постоянно переключать потоки! (EN,7м)
Разработчика бомбануло что часто в коде видит постоянные переключения поток в корутинах! Написал статью, чтобы рассказать о том что этого делать не надо! Не буду рекомендовать, а ТРЕБУЮ к прочтению всеми разработчиками!
#kotlin #coroutines #concurrency
Разработчика бомбануло что часто в коде видит постоянные переключения поток в корутинах! Написал статью, чтобы рассказать о том что этого делать не надо! Не буду рекомендовать, а ТРЕБУЮ к прочтению всеми разработчиками!
#kotlin #coroutines #concurrency
🔥27👍11
👍43🔥4❤2
Разбор Kotlin Coroutines Channels (EN, 13м)
👉 Что такое и зачем нужны
👉 Как устроены Channel
👉 Сравнение с Flow/SharedFlow
👉 Основные типы каналов
👉 Примеры использования
#kotlin #coroutines
👉 Что такое и зачем нужны
👉 Как устроены Channel
👉 Сравнение с Flow/SharedFlow
👉 Основные типы каналов
👉 Примеры использования
#kotlin #coroutines
👍29🔥7
Передавайте CoroutineContext вместо CoroutineDispatcher в конструкторы/функции (EN)
На примере различения поведения кода при использовании Dispatchers.Unconfined и EmptyCoroutineContext в статье показали, что принимать CoroutineDispatcher как параметр - не лучшая затея!
Dispatchers.Unconfined будет выполнять код на каком-то из потоков в рамках последнего использованного CoroutineDispatcher
#kotlin #coroutines
На примере различения поведения кода при использовании Dispatchers.Unconfined и EmptyCoroutineContext в статье показали, что принимать CoroutineDispatcher как параметр - не лучшая затея!
#kotlin #coroutines
👍15🔥4🎉1
В статье представлен отчёт о текущем прогрессе и планах на ближайшие релизы (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
🔥78❤3🎉3👍2
Инструкция (EN, 9м) как с помощью библиотеки MockK подменять ответы API, реализованного на Ktor, с DI на Koin
#kotlin
#kotlin
🔥11👍2
Какую фичу вы считаете самой лучшей в Kotlin? (Обязательно пиши в комментариях почему именно она)
Anonymous Poll
17%
data class/object
13%
sealed class/interface
20%
extention function/property
34%
Nullable типы
3%
inline функции (с reified или без)
1%
companion object
2%
delegated property
2%
delegate в классах
1%
Другая (пиши в комментариях)
7%
Не участвую
🔥5👍3
Для меня ключевой фичёй языка Kotlin является - Nullable типы (Null-safety)
Почему?Это позволило сделать систему типов более строгой, избавиться от проверок на null или наоборот принуждает их выполнить! После опыта Java именно проблема с null была самой большой (известная как “Billion Dollar Mistake”)!
Выделить отдельную фичу невероятно трудно, но я это делал именно по ценности для конечного продукта и его стабильности. Все возможности Kotlin как набор звуков - соединив их вместе, получаешь прекрасную музыку. Только как и с любым музыкальным инструментом в раках дилетанта может получиться что-то страшное и пугающее 🤬
Почему?
Выделить отдельную фичу невероятно трудно, но я это делал именно по ценности для конечного продукта и его стабильности. Все возможности Kotlin как набор звуков - соединив их вместе, получаешь прекрасную музыку. Только как и с любым музыкальным инструментом в раках дилетанта может получиться что-то страшное и пугающее 🤬
🔥52👍16❤6
SKIE от TouchLab обзавелся возможность расширения через сабплагины
API расширения позволит вам добавить фичи, которых нет в SKIE, или добавить фичи, которые нужны для вашего проекта. Пример написания плагина в анонсе, а исходный код на GitHub
#kmp #swift #touchlab
SKIE - плагин Kotlin компилятора для генерации удобного для вызова в Swift кода из Kotlin кода
API расширения позволит вам добавить фичи, которых нет в SKIE, или добавить фичи, которые нужны для вашего проекта. Пример написания плагина в анонсе, а исходный код на GitHub
#kmp #swift #touchlab
🔥11👍3
Традиционный релиз, который ждут многие, чтобы переходить на новую версию языка. Релиз содержит исправление ошибок и улучшения
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
Что нового:
👉 Обновленный дизайн
👉 Упростили настройку проекта
👉 Превью проекта, который будет сгенерирован
#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
)
}