Kotlin Adept Notes
1.98K subscribers
67 photos
10 videos
113 links
Канал о разработке на Kotlin и обо всем, что с ним связано
По всем вопросам и рекламе: @ajiekcx
Download Telegram
Коллега из Контура, Василий Рылов, поделился архитектурным примером KMP проекта 🔥

В репозитории вы найдете пример приложения построенного по следующим принципам:

🟣Каждая фича представлена группой модулей: feature-component, feature-domain, feature-ui и feature-data
🟣Комбинация FSM-based MVI и MVVM+ подхода с простой небиблиотечной ViewModel
🟣Навигация абстрагирована от Decompose, Decompose компоненты выделены в собственные модули
🟣Многомодульный DI, каждый модуль может использовать собственную реализацию DI

В примере использованы библиотеки:
🔵Multiplatform Room
🔵Multiplatform Settings
🔵Decompose
🔵Compose Multiplatform
🔵Варианты с Kotlin-inject и Koin DI

#KMP #Decompose #Sample
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
33🔥17👍5
Веб – это скам


Мобильный разработчик решил сделать веб-приложение, что могло пойти не так?

Контекст: мне нужно было сделать простое веб-приложение, в котором нужно дёрнуть пару запросов из апишки, предварительно получив токен аутентификации. Очень простая задача для мобильного разработчика.

Итак я расчехлил Compose Multiplatform для JS, начал работу и сразу же огреб 💀

Нужно редиректить на страницу аутентификации, а как это вообще сделать? Документация по KMP в JS оставляет желать лучшего, но благо ChatGPT тут помог и говорит, что мы можем просто использовать js подобный код в main функции, поэтому делаем так:
window.location.href = "your_url"

Ок, с этим разобрались, переходим на страницу входа и говорим, что хотим после успешного входа вернуться обратно в наше приложение, но ничего не работает, так как есть whitelist доменов, на которые можно возвращаться.. Поэтому идём в etc/hosts и прописываем другой домен заместо localhost.

Редирект заработал и после успешного логина в браузере проставляется кука, и я хочу ее прочитать в приложении, чтобы авторизовать запросы в апишку, но не тут то было, эту куку нельзя читать в js 🤯

Я думаю ок, токен можно и другими способами достать, пробуем дёрнуть запрос к апишке сервиса и получаем пинок от CORS. Браузер запрещает вам дергать произвольные апишки, если сервер, на который вы стучитесь не настроил корректные политики.

Тут моя жопа окончательно сгорела и я понял, что без своего бека, который тупо будет проксировать запросы к другому апи не обойтись 😕

Поэтому в очередной раз убедился, что никакая кроссплатформа не избавляет вас от знания особенностей среды выполнения!

А про приключения мобильного разработчика в бекенде читайте в следующей серии 🤨

#KMP #JS #WEB
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35🔥8👍6😍5🙉33
Стартует конференция Mobius и сегодня Community day, поэтому можно бесплатно посмотреть некоторые доклады.

Приходите послушать интересный доклад Kotlin in GitHub Actions. Расширяем горизонты KMP от Макса Качинкина.

Я там тоже буду присутствовать в качестве "эксперта", так что до встречи 🤝
🔥103
Сегодня буду выступать на Mobius с докладом про отличия Compose и SwiftUI.

В докладе сравним следующие моменты:
🟣Принцип работы под капотом
🟣Стейт и жизненный цикл
🟣Система модификаторов
🟣Корутины в UI
🟣Подход к анимациям

Если вы на площадке, то приходите во второй зал в 12:15 мск или подключайтесь онлайн, если у вас есть билет на Mobius.

До встречи 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33👍7
Обзор Mobius 2024 Autumn

Давайте уже по традиции сделаем обзор докладов с прошедшего Mobius, напишу свой личный топ докладов, которые удалось посмотреть:

Последнее слово в Android-навигации
🔵Отличная подача и повествование, очень красивая и проработанная презентация, интересный подход к навигации, чтобы свести ее к вызову двух методов open/close и уменьшить бойлерплейт.
🔸Однако не факт, что такой подход подойдет именно вам, у него есть свои ограничения и очень не хватило реального примера, где все это можно опробовать.

Совместная работа Kotlin/Native GC и ARC в iOS
🔵Хороший, а главное понятный доклад, чтобы узнать каким образом происходит интероп между двумя моделями памяти в Swift и Kotlin Native, в каких случаях в игру будет вступать ARC, а когда Kotlin Native GC
🔸Доклад безусловно хорош для общего развития, но вряд ли вам эти знания пригодятся на практике.

Танцы вокруг дерева семантики
🔵Интересный доклад про проблемы UI-тестирования в Compose и недостатки API в Kakao/Kaspresso, а также о том, как эти недостатки можно исправить.
🔸Для людей незнакомых с UI-тестированием в Compose может быть сложен для восприятия.

Опасности в Android: уязвимости и защитные меры
🔵Хороший обзор частых уязвимостей в Android и как от них защититься, что-то я уже знал, с чем-то сталкивался на практике, а что-то было в новинку.
🔸Но большинство уязвимостей неактуальны на новых API и если нельзя открыть произвольный URL в приложении.

Как проводить собеседования интересно и продуктивно
🔵Классный доклад о том, как превратить собеседование из экзамена в живое общение, а также возможность вспомнить о чем спрашивают на большинстве собеседований и сделать пометки, что еще стоит подучить.
🔸В целом уже не новый подход, мы у себя в компании уже давно стараемся проводить собеседования в формате диалога без заготовленного списка вопросов, но заместо кучи этапов сжали все это в одно собеседование.


🫠 На этом все, если хотите, чтобы я написал выжимку каких-либо докладов в посте, пишите в комментарии интересующий доклад ⬇️

#Mobius
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍19
SQLDelight vs Exposed

Для моего бека на Ktor нужно было выбрать ORM для реляционной БД и я решил посмотреть на решение от JetBrains под названием Exposed.

Библиотека довольно интересная, но сильно непривычная, так как с SQL вообще не нужно контактировать, поверх него написан свой dsl на Kotlin, который не такой уж интуитивный и без документации никакой более менее сложный запрос не напишешь. Однако там хотя бы можно из коробки создавать таблицы, в отличие от SQLDelight, но при этом в Exposed напрочь отсутствует поддержка миграций.

Поэтому я решил сделать небольшое сравнение в изображении к этому посту 👆

По итогу я все же выбрал SQLDelight в связке с Flyway для миграций и HikariCP для соединения с БД, так как этот инструмент уже привычный и его более чем достаточно для моих целей.

А что выбрали бы вы?

#SQLDelight #Exposed #ORM #Kotlin
@kotlin_adept
6🔥4👍2
Сегодня на ревью прислали нижний код. Это вообще законно?
🔥50😁29🏆8🥴72👏1🌚1
🎥 Рад анонсировать первый онлайн-митап на этом канале, в программе будут два доклада:

🔸 Данил Колесников покажет концептуально новый подход к навигации, где есть всего две команды: open и close. И расскажет о том, как это работает на основе декларации иерархии экранов, алгоритмам поиска в деревьях, а также Decompose.

🔸 Алексей Панов расскажет про отличия двух декларативных UI-фреймворков: Compose и SwiftUI, разберет как они устроены под капотом и сравнит основные концепции.

📍 Стрим будет проходить в Толке, а также параллельно в этом telegram-канале. Лучше подключаться через Толк, так как можно будет задать вопросы спикерам в прямом эфире.

🗓 Начинаем 7 ноября в 19:00 мск.

Прийти на стрим могут все желающие, записи стрима не будет, так что не пропустите!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🎉20👍42
Live stream scheduled for
Рубрика идиоматичный Kotlin. Что вернет выражение listOf(false).any() ?
Anonymous Quiz
54%
true
46%
false
🤝17😁1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
Адаптивный UI проще, чем кажется

Раньше с Android View, если требовалось поддержать верстку для планшетов, довольно часто просто делали отдельную верстку с нуля, и несмотря на то, что можно было расположить несколько фрагментов на одном экране, это не избавляло от сложностей навигации 🥲

Теперь же с приходом Compose и нового api делать адаптивную верстку стало значительно проще. И вот несколько рекомендаций как сделать современный адаптивный UI:

1️⃣ Не используйте флаги вроде isTablet и т.д., используйте window size classes для динамического определения размера окна: Compact, Medium, Expanded

2️⃣ Используйте готовые адаптивные компоненты вроде ListDetailPaneScaffold, SupportingPaneScaffold, NavigationSuiteScaffold

3️⃣ Рассмотрите возможность использования LazyGrid вместо LazyList

4️⃣ Меняйте расположение UI компонентов с помощью BoxWithConstraint и movableContentOf во избежание лишних рекомпозиций

5️⃣ Не блокируйте ориентацию экрана и не отключайте resizeableActivity

6️⃣ Меняйте размер и соотношение сторон у UI компонентов в зависимости от размеров окна

🌳 В Decompose также появилась поддержка адаптивной навигации и благодаря ChildPanels реализовать list-detail навигацию стало очень просто без лишнего бойлерплейта.

А есть ли адаптивная верстка в вашем приложении
🫡 — только screenOrientation portrait, только хардкор
😎 — есть адаптивная верстка под любые экраны

#Compose #AdaptiveUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡55😎6👍5❤‍🔥21
Целую неделю при работе с Compose Multiplatform для JS ловил какие-то фантомные баги, связанные с тем, что отваливался Applier, то все работало, то падало в рантайме 🤩

Applier — это платформенная сущность, которая на основе списка изменений создает дерево узлов на дальнейшую отрисовку.


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

Здесь есть те, кто гадает по мемам? Пишите свои предположения, в чем была проблема, в комментарии 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18😱5
🔔 Напомню, что сегодня в 19:00 мск пройдет стрим, где будут два интересных доклада. Подробнее здесь.

🤖🍏 Доклады будут полезны как Android, так и iOS разработчикам.

Так что приходите посмотреть доклады, пообщаться в чате с другими участниками, задать вопросы спикерам, ну и просто с пользой провести время 😉
19👍4
Live stream started
Live stream finished (1 hour)
Мы в команде недавно подняли свой сервис автоматизации на Kotlin и реализовали там много всяких полезных штук:

🟣 Интеграция YouTrack и GitLab для автоматического перевода тасок в актуальное состояние и заполнения данных
🟣 Напоминание о забытых ревью
🟣 Уведомления о релизах
🟣 И другие полезные мелочи

🔖 Подробнее о наших процессах и как мы делали такой сервер читайте в статье.

〰️ И пишите в комментарии какие must have автоматизации есть в ваших процессах

#Kotlin #Ktor #Server
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4👏1😎1
Как установить iOS приложение из браузера

Недавно пришлось на практике столкнуться с этой задачей и мой необремененный мозг Android разработчика ожидал, что все будет очень просто 😆

Вот у нас есть установочный .ipa файл и мы просто загружаем его в браузере и система любезно предлагает установить его по аналогии как это работает с .apk файлами на Android думал я...


Но Apple не была бы Apple, если бы не придумала как сделать разработчикам максимально больно, поэтому здесь не все так просто и вот как это выглядит на самом деле:

🟡 Разумеется наш установочный ipa файл должен быть подписан подписью разработчика и UUID тестовых устройств должны быть прописаны в админке Apple, но сегодня не об этом.

🟡 Далее формируем ссылку для установки приложения в следующем виде:

itms-services://?action=download-manifest&url=your_url

И если вы подумали, что здесь должна быть ссылка на ipa файл, то придется вас огорчить. Здесь должна быть ссылка на специальный манифест в виде plist файла, где указано имя приложения, его версия и наконец ссылка на скачивание файла.

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

Так что простая, на первый взгляд, задача превратилась в приключение совсем не на 20 минут.

💭 А как вы распространяете дебажные сборки iOS приложений?

#iOS
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯9👍2🔥2
Написал небольшую статью о рефакторинге архитектуры приложения с запутанной логикой.

По итогу получилось значительно  упростить логику приложения и повысить надёжность. В этом помогли корутины, а точнее их не совсем стандартное применение.

Приятного чтения 📖

#Architecture #Coroutines
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥5