Kotlin
2.17K subscribers
270 photos
123 videos
18 files
393 links
Подборки полезного материала по Kotlin. По всем вопросам @evgenycarter
Download Telegram
Kotlin Explorer — это настольный инструмент для быстрого изучения дизассемблированного кода на Kotlin.

Он позволяет быстро и удобно дизассемблировать Kotlin-код в:

* байткод Java,
* байткод Android DEX,
* ассемблер Android OAT (AOT-компиляция).

Как использовать

После запуска Kotlin Explorer введите корректный Kotlin-код в левую панель, затем нажмите Build > Build & Disassemble или используйте Cmd-Shift-D (macOS) / Ctrl-Shift-D (Linux и Windows).

По умолчанию:
* средняя панель покажет DEX-байткод Android,
* правая панель — нативный ассемблер, полученный в результате предварительной компиляции (AOT).
Видимость панелей настраивается через меню View.


Возможности
* Build > Optimize with R8 — включает оптимизации R8. Может повлиять на отображение номеров строк исходного кода в байткоде и DEX.
* View > Sync Lines — синхронизация текущей строки между исходным кодом, байткодом и DEX. Для корректной работы может потребоваться отключение R8.
* View > Presentation Mode — увеличивает размер шрифта для презентаций.
* Build > Build on Startup — автоматическая компиляция при запуске приложения.
* Build > Run — компиляция и локальный запуск Kotlin-кода. Результаты отображаются в логах.
* Нажатие на команду перехода (jump instruction) показывает стрелку к целевой инструкции.
* Отображается количество инструкций и ветвлений на метод.
* Клик по инструкции или регистру подсвечивает все их вхождения.
* Встроенная документация по aarch64 (ARM 64-bit). Включается через View > Show Logs & Documentation.

https://github.com/romainguy/kotlin-explorer

✍️ @kotlin_lib
👍2
Kotlin Multiplatform: Лайфхак для Java-разработчиков. Пишем ОДИН код для ВСЕХ проектов!

Приглашаем на открытый урок.

🗓 14 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

Что вас ждёт:
✔️ Узнаете, как интегрировать Kotlin Multiplatform в Java-проекты и настроить совместимость с существующим стеком.
✔️ Сможете избежать дублирования логики и сэкономите время на поддержке разных модулей для разных платформ.
✔️ Получите практические знания, как создавать общий код для JVM, Android и iOS.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cLEqPT

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Как мы «убили» Application Context, и проект стал чище

В большинстве Android-проектов Application и его Context используются как "корзина" для синглтонов, сервисов, preferences и всего подряд. Это удобно, но быстро превращает код в неуправляемую помойку. В одном из проектов мы решили отказаться от хранения зависимостей в Application, и вот что получилось.


🧩 Проблема
В проекте Application класс использовался для:

* инициализации SDK,
* предоставления доступа к SharedPreferences,
* доступа к репозиториям,
* передачи контекста в ViewModel и утилиты.

Со временем этот "божественный" объект стал точкой ошибок и зависимостей, которые тяжело мокать, тестировать и отслеживать.


Что сделали

1. DI в Application только для инициализации
Application остался, но теперь он инициализирует Dagger/Hilt-модули, не предоставляя никаких данных напрямую.

2. Всё через DI

* Репозитории, UseCase’ы, утилиты — больше не держатся в Application, а инжектятся через Hilt.
* SharedPreferences теперь обёрнуты в провайдер, который зависит от @ApplicationContext и инициализируется DI.

3. ViewModel не знает про контекст
Никаких передач context в конструктор ViewModel. Всё, что нужно, приходит через зависимости. Даже WorkManager задачи создаются через HiltWorkerFactory.

4. Утилиты без статиков
Вынесли "утильные" классы в сервисы или обёртки. Например, AnalyticsTracker стал интерфейсом, имплементация которого инжектится в нужные классы.


🚀 Результат

* Код стал легче тестировать — особенно ViewModel и UseCase.
* Снизили количество «странных» багов, где терялся или менялся context.
* Избавились от синглтонов, создающих утечки памяти.


📌 Вывод
Контекст приложения не должен быть мусорной корзиной. Если у вас в проекте Application весит больше 100 строк — это красный флаг. Попробуйте вынести оттуда всё, что можно заменить инжекцией зависимостей.

✍️ @kotlin_lib
👍2
Управляем зависимостями и lifecycle во Flutter: yx_scope без генерации кода 📢

13 мая в 20:00 МСК в OTUS пройдёт открытый вебинар «DI и жизненный цикл модулей во Flutter на yx_scope».

Что разберём
— yx_scope vs Kiwi, Injector, Auto Injector, Scope — когда и почему выигрывает первое решение
— Безопасное DI на этапе компиляции — без глобальных синглтонов
— Гибкий lifecycle — как избежать утечек памяти при навигации
— Интеграция yx_scope в многомодульный интернет‑магазин (live‑код)

Спикер — Дмитрий Золотов, Flutter + Kotlin Developer в Yandex. 23 года опыта: full‑stack (Flutter/Python/Kotlin/Go/C++), DevOps, системное администрирование. Контрибьютор ReOpenLDAP, автор серий вебинаров по Kubernetes и кроссплатформенной разработке, приглашённый преподаватель в ИТМО.

Кому будет полезно
— Flutter‑инженерам, которые ищут чистую архитектуру без лишнего codegen
— Разработчикам, поддерживающим проекты с десятками экранов и активной навигацией
— Тем, кто хочет ускорить релизы, сохраняя контроль над памятью и зависимостями

После вебинара вы сможете
— Внедрять зависимости без шаблонов и ловить ошибки до запуска
— Управлять жизненным циклом компонентов так, чтобы память оставалась под контролем
— Масштабировать фичи, не переписывая DI‑слой

Участие бесплатное. Мест ограничено — бронируйте прямо сейчас.

Регистрируйтесь

Реклама. ООО «Отус онлайн‑образование», ОГРН 1177746618576
Cryptography for Kotlin Multiplatform

Проект предоставляет криптографические API, работающие на JVM, Android, JS и Native. Цель — дать разработчикам безопасный и кроссплатформенный способ работы с криптографией на Kotlin.

Основные возможности:
• Хэш-функции: SHA-256, SHA-512 и др.
• HMAC
• Генерация ключей
• Подписи и проверка: Ed25519 и др.
• Шифрование/дешифрование: AES (в процессе)
• Безопасные API с прицелом на использование Kotlin DSL и корутин

Текущий статус:
Проект ещё не стабилен и активно развивается. Пока нет релизов — используется только через mavenLocal() или сборку из исходников.

Пример использования (HMAC):

val key = HMAC.keyGenerator().generate()
val hmac = HMAC(key).digest("data".encodeToByteArray())



https://github.com/whyoleg/cryptography-kotlin

✍️ @kotlin_lib
👍2
Media is too big
VIEW IN TELEGRAM
Автоматическое обнаружение проблем с производительностью в ваших Kotlin-приложениях

Узнайте, как эффективно диагностировать и устранять проблемы с производительностью в Kotlin-приложениях, использующих Koin, с помощью платформы Kotzilla — нового инструмента отладки, специально разработанного для приложений на базе фреймворка Koin. Он решает распространённую задачу выявления проблем производительности в мобильных приложениях. Это руководство познакомит вас с автоматизированным подходом к оптимизации производительности.

0:00 Introduction to Performance Debugging
0:41 Understanding the Kotzilla Platform Dashboard
0:52 Automated Issue Detection
1:20 Deep Dive: Performance Issue Analysis
2:35 IntelliJ & Android Studio Integration
2:45 How to get started

источник

✍️ @kotlin_lib
👍2🔥1
Осталось 2 дня до вебинара! Успейте зарегистрироваться ⌛️

Управляем зависимостями и lifecycle во Flutter: yx_scope без генерации кода

🗓 13 мая, 20:00 МСК — открытый вебинар OTUS

Коротко о программе
— yx_scope vs Kiwi / Injector / Auto Injector / Scope — покажем, где выигрывает yx_scope
— Безопасное DI на этапе компиляции, никаких глобальных синглтонов
— Гибкий lifecycle: как избежать утечек памяти при навигации
— Live-код: интегрируем yx_scope в многомодульный интернет-магазин

Спикер — Дмитрий Золотов, Flutter + Kotlin Developer в Yandex, 23 года опыта full-stack и DevOps.

Кому зайдёт
— Flutter-инженерам, ищущим чистую архитектуру без лишнего codegen
— Разработчикам, поддерживающим большие проекты с активной навигацией
— Всем, кто хочет ускорить релизы и держать память под контролем

После вебинара вы сможете
— Внедрять зависимости без шаблонов и ловить ошибки до запуска
— Управлять жизненным циклом компонентов без утечек
— Масштабировать фичи без переписывания DI-слоя

Участие бесплатное, мест всё меньше.

Регистрируйтесь сейчас

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Media is too big
VIEW IN TELEGRAM
Language Integrated Query for Kotlin Multiplatform

SQL Queries at Compile Time
Forget eq, use regular EqEq
Forget Case().When, use regular if and when.
Forget Column<T>, use regular primitives!
Cross-Platform: JVM, iOS, Android, Linux, Windows, MacOS, JS-coming soon!
Functional, Composable, Powerful, and Fun!

https://github.com/ExoQuery/ExoQuery

✍️ @kotlin_lib
👍2
📱 FlexibleBottomSheet — это легкий и настраиваемый компонент нижнего листа (Bottom Sheet) для Android, основанный на BottomSheetDialogFragment. Он поддерживает различные режимы (STRETCH, HALF, FULL) и динамически адаптируется под содержимое.

Особенности

* Поддержка режимов STRETCH, HALF и FULL.
* Анимация при изменении размеров.
* Слушатели состояния нижнего листа.
* Совместим с ViewBinding и Jetpack Compose.
* Высокая настраиваемость.

Установка


dependencies {
implementation "com.github.skydoves:flexible-bottomsheet:1.0.4"
}


Быстрый старт


class MyBottomSheet : FlexibleBottomSheet() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.my_bottom_sheet, container, false)
}
}


Настройка режима


MyBottomSheet().apply {
bottomSheetStyle = BottomSheetStyle.FLEXIBLE
bottomSheetConfig = BottomSheetConfig(
sheetHeight = SheetHeight.FULL,
isCancelable = true,
isDraggable = true,
)
}


https://github.com/skydoves/FlexibleBottomSheet

✍️ @kotlin_lib
👍3
Интеллект внутри: делаем умные Flutter‑приложения с ML и AI 🤖

20 мая в 20:00 МСК OTUS проведёт открытый вебинар для мобильных разработчиков, которые хотят вывести свои приложения на новый уровень: жесты, эмоции, LLM‑подсказки — всё прямо на устройстве.

Что будет:
— TensorFlow Lite и ONNXRuntime — запускаем модели офлайн;
— MediaPipe — работаем с камерой, жестами и лицами;
— Интеграция OpenAI / Google AI / Hugging Face — подключаем LLM за 15 минут;
— Живой код: интернет‑магазин, в который добавляем ML‑функции шаг за шагом.

Спикер: Дмитрий Золотов, Flutter + Kotlin Developer в Yandex, 23 года опыта, контрибьютор ReOpenLDAP, приглашённый преподаватель ИТМО.

Участие бесплатное, места ограничены. Забронируйте прямо сейчас и добавьте AI‑магию в своё портфолио.

Зарегистрироваться

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Роман Елизаров про Kotlin, корутины и работу в Jetbrains / ЧТУК

00:00:00 Как стал программистом
00:11:39 Алгоритмы
00:24:47 Собеседования
00:26:44 Как попал в JetBrains
00:30:13 "Котлин - новый Си?"
00:33:42 Tracing GC в Kotlin
00:36:49 "Что революционного в корутинах?"
00:45:24 Почему Котлин популярный в мобилке
00:48:16 Менеджмент
00:57:19 История и перспективы Kotlin
01:02:45 Уход из JetBrains и олимпиадное программирование
01:11:36 Яндекс
01:15:11 Новое поколение разработчиков
01:21:16 "Современные айти технологии устойчивы"
01:24:23 "Своя" разработка и Open Source
01:35:12 ИИ в разработке
01:51:55 Вопросы подписчиков
02:00:11 Всем пока

https://www.youtube.com/watch?v=PlykPBtsL8E

✍️ @kotlin_lib
👍3
Возможности Kotlin для создания DSL на примере JsonBuilder

Приглашаем на открытый урок.

🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

Что вас ждёт:
✔️ рассмотрим общую теорию о DSL: назначение, особенности, практика;
✔️ попрактикуемся в создании DSL на примере JsonBuilder;
✔️ рассмотрим возможности Kotlin, полезные для создания DSL.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cLUeee

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблемы масштабируемости Kotlin Multiplatform на крупном проекте

Я начал заниматься нативной разработкой под Android в 2015 году, а в 2017 меня вдохновили два новых мультиплатформенных фреймворка: Flutter и Kotlin Multiplatform. Хотя KMP было сложнее собирать и использовать по сравнению с Flutter, с самого начала я верил, что у него больше потенциала.
В основном потому, что он использует родной язык и практики Android, предлагая при этом максимально тонкий подход к мультиплатформенности.

С тех пор я продолжал следить за его развитием, экспериментируя с новыми возможностями в своих open-source проектах, таких как Coffegram.

Когда KMP стал стабильным, я начал искать возможность применить его в реальном проекте. Здесь я опишу свой опыт работы с ним в одном крупном проекте.

https://proandroiddev.com/kotlin-multiplatform-scalability-challenges-on-a-large-project-b3140e12da9d

✍️ @kotlin_lib
👍2
BikeShare — шаринг велосипедов на Kotlin Multiplatform

BikeShare — проект Kotlin Multiplatform с Jetpack Compose и SwiftUI на основе CityBikes API. Поддерживает iOS, Android, десктопы, веб. Для сборки нужна Android Studio Arctic Fox и Xcode 13.2.

https://github.com/joreilly/BikeShare

✍️ @kotlin_lib
👍6
Через два дня — живой разбор AI в Flutter

20 мая, 20:00 МСК. Бесплатный вебинар «Интеллект внутри: делаем умные Flutter‑приложения с ML и AI».

Почему стоит подключиться:
— увидите, как запустить нейросети офлайн без серверных счетов;
— разберётесь, чем MediaPipe лучше готовых SDK для жестов;
— научитесь подключать LLM‑подсказки к любому экрану приложения;
— получите скидку на курс «Flutter Mobile Developer».

Код пишем в прямом эфире вместе с Дмитрием Золотовым (Yandex).

Не откладывайте — регистрация закроется при наборе группы.

Забронировать место

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Video Player App — приложение для просмотра видео на MVVM и Kotlin

Пример приложения для Android, написанный на Kotlin и Jetpack Compose, поддерживающий различное расположение навигации в зависимости от размера экрана. Media 3 Exoplayer реализован на основе single activity архитектуры. Он полностью функционален и поддерживает функцию «картинка в картинке».

Еще в приложении используется MVVM, корутины и Flow, Dagger Hilt, Material 3, динамический лейаут с Windows Size Class, Gradle Kotlin DSL, базовые профили.

https://github.com/ryanw-mobile/video-player-app

✍️ @kotlin_lib
👍6
Секреты Kotlin: 7 мощных фич, которые ежедневно используют топ-1% разработчиков

🔹1. run для безопасной работы с null

Когда тебе нужно выполнить несколько операций с переменной, которая может быть null, вместо длинного if лучше использовать run:


val user: User? = getUser()
user?.run {
println(name)
println(email)
}



🔹2. takeIf и takeUnless

Эти функции позволяют элегантно фильтровать значения:


val input = readLine()

val number = input?.toIntOrNull()?.takeIf { it > 0 }
// number будет null, если условие не выполнено



🔹3. Расширения для sealed классов и enum

Расширения можно использовать, чтобы "добавить" поведение к sealed классам или enum'ам:


sealed class Result
object Success : Result()
object Error : Result()

fun Result.log() = when (this) {
Success -> println("Успех")
Error -> println("Ошибка")
}



🔹4. Smart cast с кастомными проверками

Можно создавать собственные методы-проверки с smart cast внутри:


fun Any.isString(): Boolean = this is String

val value: Any = "Hello"
if (value.isString()) {
println((value as String).length) // не очень
}


Лучше использовать:


if (value is String) {
println(value.length) // безопаснее
}



🔹5. Nothing как маркер "никогда не возвращается"

Тип Nothing указывает, что функция либо кидает исключение, либо бесконечна:


fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}



🔹6. Рефлексия через ::class

В Kotlin можно получить ссылку на класс:


fun <T : Any> printClassName(value: T) {
println(value::class.simpleName)
}



🔹7. Деструктуризация для data классов и пар

Kotlin позволяет удобно "распаковывать" объекты:


data class User(val name: String, val email: String)

val user = User("Oleg", "[email protected]")
val (name, email) = user



Эти фичи не просто украшения синтаксиса — они помогают писать чище, безопаснее и выразительнее. Изучи их и попробуй внедрить в свою повседневную разработку.

https://proandroiddev.com/kotlin-secrets-7-powerful-features-the-top-1-of-developers-use-daily-161e16e2464d

✍️ @kotlin_lib
👍5
5 фишек Kotlin, которые должен освоить каждый Android-разработчик

Kotlin — мощный и выразительный язык, который помогает писать чистый и лаконичный код. Ниже — пять возможностей, которыми стоит овладеть каждому Android-разработчику.


1. Расширения функций (Extension Functions)

Расширения позволяют добавлять функции к существующим классам без необходимости наследования. Это особенно полезно для повышения читаемости кода.


fun String.capitalizeFirstLetter(): String {
return this.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
}


Теперь можно использовать эту функцию так:


val name = "john"
println(name.capitalizeFirstLetter()) // John



2. Инлайновые функции (Inline Functions)

Инлайновые функции — это способ уменьшить накладные расходы на вызов лямбда-выражений. Часто применяются с higher-order функциями.


inline fun <T> measureTime(block: () -> T): T {
val start = System.currentTimeMillis()
val result = block()
println("Заняло времени: ${System.currentTimeMillis() - start} мс")
return result
}



3. Объекты-одиночки (Object Declarations / Singletons)

В Kotlin ключевое слово object позволяет создавать синглтоны — это удобно, например, для хранения глобальных зависимостей.


object NetworkManager {
fun makeRequest(endpoint: String) {
// логика запроса
}
}



4. Sealed классы

Sealed классы дают возможность моделировать ограниченные иерархии. Это особенно полезно в when выражениях без необходимости писать else.


sealed class Result {
object Loading : Result()
data class Success(val data: String) : Result()
data class Error(val error: Throwable) : Result()
}



fun handleResult(result: Result) {
when (result) {
is Result.Loading -> println("Загрузка...")
is Result.Success -> println("Успех: ${result.data}")
is Result.Error -> println("Ошибка: ${result.error}")
}
}



5. Корутины (Coroutines)

Корутины позволяют писать асинхронный код, который выглядит как синхронный. Это облегчает работу с потоками и упрощает логику.


suspend fun fetchData(): String {
delay(1000)
return "Данные получены"
}

fun main() = runBlocking {
val result = fetchData()
println(result)
}



Овладение этими фичами сделает твой код более читаемым, безопасным и мощным. Kotlin действительно раскрывается, когда используешь его возможности по максимуму.

https://artemasoyan.medium.com/5-kotlin-features-every-android-developer-should-master-6ebe8e4e1abd

✍️ @kotlin_lib
2👍2
Ищете эффективные инструменты для создания DSL?

Узнайте, как Kotlin может упростить разработку с помощью JsonBuilder!

Приглашаем на открытый урок.

🗓 22 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Kotlin Backend Developer. Professional».

На открытом уроке вы разберете, как Kotlin позволяет создавать DSL (Domain-Specific Languages), оптимизируя процесс разработки. Мы покажем теорию и практику создания DSL на примере JsonBuilder.

Вы не только научитесь создавать собственные DSL, но и освоите замыкания и extension-методы Kotlin, которые дадут вам дополнительные преимущества при написании чистого и гибкого кода.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

👉 Регистрация на вебинар: https://vk.cc/cM6Wwm

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2