Сегодня буду выступать на Mobius с докладом про отличия Compose и SwiftUI.
В докладе сравним следующие моменты:
🟣 Принцип работы под капотом
🟣 Стейт и жизненный цикл
🟣 Система модификаторов
🟣 Корутины в UI
🟣 Подход к анимациям
Если вы на площадке, то приходите во второй зал в 12:15 мск или подключайтесь онлайн, если у вас есть билет на Mobius.
До встречи 🤝
В докладе сравним следующие моменты:
Если вы на площадке, то приходите во второй зал в 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
Давайте уже по традиции сделаем обзор докладов с прошедшего Mobius, напишу свой личный топ докладов, которые удалось посмотреть:
Последнее слово в Android-навигации
Совместная работа Kotlin/Native GC и ARC в iOS
Танцы вокруг дерева семантики
Опасности в Android: уязвимости и защитные меры
Как проводить собеседования интересно и продуктивно
#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
Для моего бека на Ktor нужно было выбрать ORM для реляционной БД и я решил посмотреть на решение от JetBrains под названием Exposed.
Библиотека довольно интересная, но сильно непривычная, так как с SQL вообще не нужно контактировать, поверх него написан свой dsl на Kotlin, который не такой уж интуитивный и без документации никакой более менее сложный запрос не напишешь. Однако там хотя бы можно из коробки создавать таблицы, в отличие от SQLDelight, но при этом в Exposed напрочь отсутствует поддержка миграций.
Поэтому я решил сделать небольшое сравнение в изображении к этому посту 👆
По итогу я все же выбрал
А что выбрали бы вы?
#SQLDelight #Exposed #ORM #Kotlin
@kotlin_adept
❤6🔥4👍2
Прийти на стрим могут все желающие, записи стрима не будет, так что не пропустите!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🎉20👍4 2
Рубрика идиоматичный 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
Раньше с Android View, если требовалось поддержать верстку для планшетов, довольно часто просто делали отдельную верстку с нуля, и несмотря на то, что можно было расположить несколько фрагментов на одном экране, это не избавляло от сложностей навигации
Теперь же с приходом Compose и нового api делать адаптивную верстку стало значительно проще. И вот несколько рекомендаций как сделать современный адаптивный UI:
А есть ли адаптивная верстка в вашем приложении
🫡 — только screenOrientation portrait, только хардкор
😎 — есть адаптивная верстка под любые экраны
#Compose #AdaptiveUI
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡55😎6👍5❤🔥2❤1
Целую неделю при работе с Compose Multiplatform для JS ловил какие-то фантомные баги, связанные с тем, что отваливался Applier, то все работало, то падало в рантайме 🤩
И вчера я потратил минут 30, чтобы прошерстить интернет в поисках ошибки, построчно сравнить конфигурацию своего проекта с другими и путем экспериментов наконец найти проблему...
Здесь есть те, кто гадает по мемам? Пишите свои предположения, в чем была проблема, в комментарии 👇
Applier — это платформенная сущность, которая на основе списка изменений создает дерево узлов на дальнейшую отрисовку.
И вчера я потратил минут 30, чтобы прошерстить интернет в поисках ошибки, построчно сравнить конфигурацию своего проекта с другими и путем экспериментов наконец найти проблему...
Здесь есть те, кто гадает по мемам? Пишите свои предположения, в чем была проблема, в комментарии 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18😱5
🔔 Напомню, что сегодня в 19:00 мск пройдет стрим, где будут два интересных доклада. Подробнее здесь.
🤖🍏 Доклады будут полезны как Android, так и iOS разработчикам.
Так что приходите посмотреть доклады, пообщаться в чате с другими участниками, задать вопросы спикерам, ну и просто с пользой провести время 😉
🤖🍏 Доклады будут полезны как Android, так и iOS разработчикам.
Так что приходите посмотреть доклады, пообщаться в чате с другими участниками, задать вопросы спикерам, ну и просто с пользой провести время 😉
❤19👍4
Мы в команде недавно подняли свой сервис автоматизации на Kotlin и реализовали там много всяких полезных штук:
🟣 Интеграция YouTrack и GitLab для автоматического перевода тасок в актуальное состояние и заполнения данных
🟣 Напоминание о забытых ревью
🟣 Уведомления о релизах
🟣 И другие полезные мелочи
🔖 Подробнее о наших процессах и как мы делали такой сервер читайте в статье.
〰️ И пишите в комментарии какие must have автоматизации есть в ваших процессах
#Kotlin #Ktor #Server
@kotlin_adept
#Kotlin #Ktor #Server
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4👏1😎1
Как установить iOS приложение из браузера
Недавно пришлось на практике столкнуться с этой задачей и мой необремененный мозг Android разработчика ожидал, что все будет очень просто😆
Но Apple не была бы Apple, если бы не придумала как сделать разработчикам максимально больно, поэтому здесь не все так просто и вот как это выглядит на самом деле:
🟡 Разумеется наш установочный ipa файл должен быть подписан подписью разработчика и UUID тестовых устройств должны быть прописаны в админке Apple, но сегодня не об этом.
🟡 Далее формируем ссылку для установки приложения в следующем виде:
И если вы подумали, что здесь должна быть ссылка на ipa файл, то придется вас огорчить. Здесь должна быть ссылка на специальный манифест в виде plist файла, где указано имя приложения, его версия и наконец ссылка на скачивание файла.
Все бы ничего, но и ссылка на манифест, и ссылка на скачиваемый файл должны быть доступны напрямую без аутентификации, что может быть капельку не секьюрно, если вы собираетесь таким образом тестировать дебаг сборки приложений, поэтому по-хорошему придется еще и по времени ограничивать доступность этих файлов на вашем сервере.
Так что простая, на первый взгляд, задача превратилась в приключение совсем не на 20 минут.
💭 А как вы распространяете дебажные сборки iOS приложений?
#iOS
@kotlin_adept
Недавно пришлось на практике столкнуться с этой задачей и мой необремененный мозг Android разработчика ожидал, что все будет очень просто
Вот у нас есть установочный .ipa файл и мы просто загружаем его в браузере и система любезно предлагает установить его по аналогии как это работает с .apk файлами на Android думал я...
Но Apple не была бы Apple, если бы не придумала как сделать разработчикам максимально больно, поэтому здесь не все так просто и вот как это выглядит на самом деле:
itms-services://?action=download-manifest&url=your_url
И если вы подумали, что здесь должна быть ссылка на ipa файл, то придется вас огорчить. Здесь должна быть ссылка на специальный манифест в виде plist файла, где указано имя приложения, его версия и наконец ссылка на скачивание файла.
Все бы ничего, но и ссылка на манифест, и ссылка на скачиваемый файл должны быть доступны напрямую без аутентификации, что может быть капельку не секьюрно, если вы собираетесь таким образом тестировать дебаг сборки приложений, поэтому по-хорошему придется еще и по времени ограничивать доступность этих файлов на вашем сервере.
Так что простая, на первый взгляд, задача превратилась в приключение совсем не на 20 минут.
#iOS
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯9👍2🔥2
Написал небольшую статью о рефакторинге архитектуры приложения с запутанной логикой.
По итогу получилось значительно упростить логику приложения и повысить надёжность. В этом помогли корутины, а точнее их не совсем стандартное применение.
Приятного чтения📖
#Architecture #Coroutines
@kotlin_adept
По итогу получилось значительно упростить логику приложения и повысить надёжность. В этом помогли корутины, а точнее их не совсем стандартное применение.
Приятного чтения
#Architecture #Coroutines
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegraph
Корутины — архитектурные помощники
Представьте, что у вас есть приложение, которое управляет пользовательскими данными. И вам пришла задача — отрефакторить подтверждение владения учётной записью для выполнения различных критически важных действий с аккаунтом пользователя. Таких действий может…
👍29🔥5
Использование null допустимо в domain типах?
Anonymous Poll
78%
Вполне, если очевидно, что подразумевается под отсутствием значения
22%
Нет,всегда использую sealed class, чтобы уйти от nullable типов
SwiftExport
Вчера вышел Kotlin 2.1, и мы стали еще на один шаг ближе к тому, чтобы отказаться от прослойки с Objective-C хедерами и использовать скомпилированный Kotlin-код напрямую в Swift😎
Но интересно даже не это — теперь, наконец, станет возможным разделять код на разные модули для Swift. Раньше все фичи, использующие KMP, могли обращаться к любой его части, а теперь это можно инкапсулировать.
🐱 Посмотреть пример кода можно здесь.
P.S. Я же очень жду возможность использования нескольких KMP библиотек в одном Swift проекте без создания umbrella модуля, чтобы была возможность переиспользовать рантайм Kotlin Native и общие библиотеки.
#KMP #Swift
@kotlin_adept
Вчера вышел Kotlin 2.1, и мы стали еще на один шаг ближе к тому, чтобы отказаться от прослойки с Objective-C хедерами и использовать скомпилированный Kotlin-код напрямую в Swift
Но интересно даже не это — теперь, наконец, станет возможным разделять код на разные модули для Swift. Раньше все фичи, использующие KMP, могли обращаться к любой его части, а теперь это можно инкапсулировать.
P.S. Я же очень жду возможность использования нескольких KMP библиотек в одном Swift проекте без создания umbrella модуля, чтобы была возможность переиспользовать рантайм Kotlin Native и общие библиотеки.
#KMP #Swift
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥9
Как подключить KMP в iOS проект без CocoaPods
Я задумался об этом еще в прошлом году и подключил всё, как описано в инструкции. Но как только в Xcode-проекте появились кастомные конфигурации, начало происходить нечто странное...
Проект продолжал компилироваться, но при этом все новые изменения в общем коде перестали отображаться в Xcode. А если почистить кеш, то и вовсе выводилась ошибка: "No such module Shared". Я поспрашивал в чате, сталкивался ли кто-то с подобной проблемой, но узнал лишь, что с CocoaPods всё работает хорошо. Поэтому я просто забил и перешел на CocoaPods, думая, что, если проблема есть, её наверняка исправят🔥
Однако CocoaPods стали deprecated, и вся наша iOS-команда уже давно мигрировала на SPM. Представьте лица iOS-разработчиков, к которым вы не только притащили KMP, но еще и хотите заставить их вернуться на CocoaPods👍
Поэтому я снова вернулся к этой задаче и, к моему удивлению, спустя год ничего не изменилось: проблема всё ещё присутствует даже на новых версиях. Я стал разбираться и выяснил, что по каким-то причинам Xcode визуально подтягивает только фреймворк по пути build/xcode-frameworks/debug. Но путь для сборки фреймворка меняется, как только появляются кастомные конфигурации, и отвечает за это переменная окружения CONFIGURATION.
Тут я подумал: а зачем нам вообще разделять на разные папки для каждой конфигурации? В любом случае каждую конфигурацию мы маппим в Debug или Release build type с помощью переменной KOTLIN_FRAMEWORK_BUILD_TYPE.
Поэтому я для себя сделал следующий workaround. В Build Phase в Xcode, где собирается Kotlin-фреймворк, нужно переопределить переменную окружения конфигурации:
Таким образом, для всех конфигураций, которые маппятся в Debug, всё будет работать, а для релизных конфигураций нам важнее успешная сборка, нежели подсветка кода в Xcode.
Официального ответа по этому issue я всё ещё не получил, поэтому поддержите лайком, чтобы команда JetBrains заметила и дала официальные рекомендации.
#KMP #Xcode #iOS
@kotlin_adept
Я задумался об этом еще в прошлом году и подключил всё, как описано в инструкции. Но как только в Xcode-проекте появились кастомные конфигурации, начало происходить нечто странное...
Проект продолжал компилироваться, но при этом все новые изменения в общем коде перестали отображаться в Xcode. А если почистить кеш, то и вовсе выводилась ошибка: "No such module Shared". Я поспрашивал в чате, сталкивался ли кто-то с подобной проблемой, но узнал лишь, что с CocoaPods всё работает хорошо. Поэтому я просто забил и перешел на CocoaPods, думая, что, если проблема есть, её наверняка исправят
Однако CocoaPods стали deprecated, и вся наша iOS-команда уже давно мигрировала на SPM. Представьте лица iOS-разработчиков, к которым вы не только притащили KMP, но еще и хотите заставить их вернуться на CocoaPods
Поэтому я снова вернулся к этой задаче и, к моему удивлению, спустя год ничего не изменилось: проблема всё ещё присутствует даже на новых версиях. Я стал разбираться и выяснил, что по каким-то причинам Xcode визуально подтягивает только фреймворк по пути build/xcode-frameworks/debug. Но путь для сборки фреймворка меняется, как только появляются кастомные конфигурации, и отвечает за это переменная окружения CONFIGURATION.
Тут я подумал: а зачем нам вообще разделять на разные папки для каждой конфигурации? В любом случае каждую конфигурацию мы маппим в Debug или Release build type с помощью переменной KOTLIN_FRAMEWORK_BUILD_TYPE.
Поэтому я для себя сделал следующий workaround. В Build Phase в Xcode, где собирается Kotlin-фреймворк, нужно переопределить переменную окружения конфигурации:
export CONFIGURATION=$KOTLIN_FRAMEWORK_BUILD_TYPE
cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode
Таким образом, для всех конфигураций, которые маппятся в Debug, всё будет работать, а для релизных конфигураций нам важнее успешная сборка, нежели подсветка кода в Xcode.
Официального ответа по этому issue я всё ещё не получил, поэтому поддержите лайком, чтобы команда JetBrains заметила и дала официальные рекомендации.
#KMP #Xcode #iOS
@kotlin_adept
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👏5❤4👍1