👍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
)
}
  Kotlin Multiplatform Broadcast
Что бы вы изменили в это коде и почему?  fun PersonDto?.toPerson(): Person? =       if (this == null) {          null      } else {          Person(               name = name,               surname = surname,               age = age          )      }
Не делайте single-expression функции, если она занимает у вас больше 1 строки
Пример кода из поста выше читается очень сложно из-за многострочного if/else, который используется как выражения для функции чтобы не писать тело. Правило просто - в функции больше одной строки, то точно объявляете тело {}
Исключения бывают, о них ниже
Код и поста станет выглядеть так
Пример кода из поста выше читается очень сложно из-за многострочного 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 функции могут быть полезны. Все они связаны с вызовом функции/инструкции с телом, например
Есть удобные кейсы, когда многострочные single-expression функции могут быть полезны. Все они связаны с вызовом функции/инструкции с телом, например
fun a() = when(...)  {
    // Позволяет сделать exhausted when,
    // через обязательный возврат значений в каждой ветке
    
    // Предпочитаю с каждом case делать только одну строчку,
    // все что больше - переношу в функции и вызываю её
    // С if-else так красиво не выглядит, но тоже можно
}
fun b() = buildList {
    // билдер функция коллекции
}
fun c(...) = with(...) {
    // Изменил this в блоке кода
}👍11
  Смысл делать расширения для 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 боле красивой. Давайте на примере:
теперь мне надо добавить новое свойство и задавать его
После таких изменений в VCS отразиться изменения в 2 строчках - номер 4 и 5. Если же изначально я использовал trailing comma везде, то изменение было бы только в одной строке - 5.
Другой пользы от trailing comma фичи я не знаю, а вы можете поделиться в комментариях
UPD: в IDE ещё удобно менять порядок передачи именованных аргументов в многострочном вызове функции
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
  Какой подход вы предпочитаете для маппинга моделей ? (пишите в комментариях почему)
  Anonymous Poll
    63%
    fun PersonDto.toPerson(): Person
      
    5%
    fun Person.from(PersonDto): Person
      
    4%
    fun Person(PersonDto): Person
      
    15%
    interface Mapper<IN, OUT> { fun map(IN): OUT }
      
    2%
    Генерация кода маппинга
      
    3%
    Другой подход
      
    8%
    Не участвую в опросе
      
    👍5
  Вы используете Decompose?
  Anonymous Poll
    12%
    Да, в KMP проекте
      
    8%
    Да, в проекте под одну платформу
      
    19%
    Что это?
      
    53%
    Нет
      
    1%
    Не пишу код
      
    8%
    Не участвую в опросе
      
    👍14
  Пример (EN,8М) автоматизации генерации классов UI модели на основе параметров Composable функциb. Используется KSP для генерации кода
🔗 Ссылка без VPN
#kotlin #compose #ksp
🔗 Ссылка без VPN
#kotlin #compose #ksp
👍10