Forwarded from Kotlin Multiplatform Broadcast
Подробная статья о том, что происходит при вызове функции cancel() - отмене корутине, а именно рассказывается про:
👉 Классы Job и JobSupport
👉 Состояния Job
👉 Как работает отмена в Structured Concurrency
👉 Коммуникация между родительской и дочерней Job
👉 Как отменяется функция delay()
👉 Как отменяются suspend функции
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🤯 Что не так с использование object и data class читайте в статье на Хабре (3м)
Буду очень признателем вашим лайкам текста на Хабре
#kotlin #android
Буду очень признателем вашим лайкам текста на Хабре
#kotlin #android
Forwarded from Kotlin Multiplatform Broadcast
Кажется, я совсем недавно еще работал с бета-версиями первой версии Kotlin, писал приложения с расписанием для университета, где учился, чтобы попробовать эту технологию. Тогда была только поддержка JVM и проводились эксперименты с JS.
Сегодня Kotlin - это уже целая экосистема
Уже появилось поколение разработчиков, которые начали свой путь именно с Kotlin для разработки под Android 🤯🤯🤯
Поделитесь в комментариях под постом в @kotlin_broadcast своей историей знакомства с этим языком и тем, что вас привлекло в нем.
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Проблема с валидацией DI графа зависимостей при использования Koin - очень актуальная. Авторы решили подойти к её решению через анализ кода проектов в IDE, хотя уже обсуждали перенос инструмента в CLI.
Для использования вам понадобится зарегистрироваться на сайте Kotzilla.
#kotlin #idea #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Koin Annotations — надстройка над Koin для описания зависимостей с помощью аннотаций и последующей генерации части графа для них.
Что нового в движке:
👉 Совместимость с KSP2
👉 Улучшена работа компилятора DI кода
👉 Улучшена генерация кода
👉 Полноценная поддержка KMP проектов
👉 Шаринг описаний зависимостей между модулями проектов
👉 Работает с Koin 4.0, Kotlin 2.0.21 и KSP 2.0.21-1.0.28
Новые фичи для разработчиков:
👉 Создание собственных аннотаций квалификаторов
👉 Автоматические биндинги
👉 ComponentScan работает сквозь Gradle модули
👉 Аннотации над ViewModel (работает с Jetpack и KMP)
@KoinViewModel
class MyViewModel(deps: Deps): ViewModel()
Ссылка без VPN
#kotlin #kmp #di #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Поддержите Koin IDE плагин на Product Hunt. Команда проделывают большую работу и точно заслуживает поддержки от сообщества!
#kotlin #koin #ide #androidstudio
#kotlin #koin #ide #androidstudio
Важное изменение - ускорение KAPT из-за перехода под капотом на K2 компилятор.
#kotlin #kapt
Please open Telegram to view this post
VIEW IN TELEGRAM
Новый Mobius приближается и традиционно открывается плейлист со всеми видео прошедшей конференции
Также можно посмотреть на
В комментариях делитесь самыми интересными докладами и что в них было полезного
#android #ios #flutter #kotlin #kmp #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
Чтобы добавить поддержку других платформ в Jetpack Room, необходимо было обеспечить совместимость с различными версиями SQLite, встроенными в ОС, а также с теми, которые могут подключаться отдельно. Результатом стал BundledSQLiteDriver, который позволяет использовать актуальную версию SQLite, поставляемую отдельно, и применять её на всех платформах.
В статье подробно рассматриваются особенности этого подхода к работе с SQLite в Room.
#kotlin #kmp #android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
В Kotlin 2.1.20 несовместим со свежей версий XCode, поддержка будет в Kotlin 2.1.21. Отложите обновление!
#kotlin #kmp #xcode
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Metro - Новый DI фреймворк на чистом Kotlin (ещё в разработке)
#kotlin #di #ksp
@DependencyGraph
interface AppGraph {
val httpClient: HttpClient
@Provides
private fun provideFileSystem(): FileSystem = FileSystem.SYSTEM
}
@Inject
class HttpClient(private val fileSystem: FileSystem)
@Inject
@Composable
fun App(circuit: Circuit)
#kotlin #di #ksp
Forwarded from Kotlin Multiplatform Broadcast
Вышел KSP 2.0, который теперь работает на KSP2 по умолчанию. Теперь работает на K2 и отдельный генератор исходников с большей гибкостью
#kotlin #ksp
#kotlin #ksp
Что нового:
👉 SavedState теперь полностью KMP библиотека с поддержкой Android, iOS, Linux, Mac и JVM
👉 LocalSavedStateRegistryOwner теперь не является частью Compose UI, а будет частью нового артефакта - savedstate-compose
👉 Появился обобщенный тип SavedState, который Bundle на Android и Map<String, Any> на других платформах
// Создаем SavedState с помощью DSL:
val savedState = savedState {
putInt("currentPage", 1)
putString("filter", "favorites")
}
val currentPage = savedState.read { getInt("currentPage") }
savedState.write { remove("currentPage") }
@Serializable
data class Person(val firstName: String, val lastName: String)
fun main() {
val person = Person("John", "Doe")
val encoded: SavedState = encodeToSavedState(person)
val decoded: Person = decodeFromSavedState(encoded)
}
saved
в Activity и ViewModelclass MyActivity : ComponentActivity() {
var person by saved { Person("John", "Doe") }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.person = Person("Jane", "Doe")
}
}
class MyViewModel(handle: SavedStateHandle) : ViewModel() {
var person by handle.saved { Person("John", "Doe") }
fun onPersonChanged(person: Person) {
this.person = person
}
}
#android #jetpack #jetpackupdate #kmp #kotlin #ios #desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Очень классная статья от @nek_12_personal про лучшие практики для загрузки данных из UI, чтобы не выполнять лишнюю работу и не занимать ресурсы, когда UI не показывается
❌ Чего следует избегать
Запуск загрузки данных в блоке init может привести к устаревшей информации при возвращении пользователя к экрану после длительного отсутствия.
Такой подход может вызвать множественные параллельные запросы, что увеличивает нагрузку на систему и усложняет управление состоянием.
Сбор данных в viewModelScope без учёта видимости UI может привести к утечкам памяти и избыточному потреблению ресурсов.
Перенос логики загрузки данных в UI нарушает принцип разделения ответственности и усложняет архитектуру приложения.
Все подробности в статье, которую рекомендую вам изучить подробно!
🔗 Альтернативная ссылка
#kotlin #android #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Для конвертации холодного Flow в горячий StateFlow для работы с состоянием (обычно происходит в ViewModel) стоит использовать оператор Flow<T>.stateIn(), с заданием политики запуска SharingStarted.WhileSubscribed
flow..stateIn(
scope = viewModelScope,
initialValue, // задаём начальное значение
started = SharingStarted.WhileSubscribed(
stopTimeoutMillis = 5.seconds,
replayExpirationMillis = 5.seconds,
),
)
SharingStarted.WhileSubscribed() — умный способ включать сбор данных только когда есть подписчики, и автоматически останавливать его, когда они исчезают. Важно настроить несколько значений:
👉 Параметр
stopTimeoutMillis
- задаем какое время пройдет после того как пропадет последний подписчик чтобы остановить StateFlow. По умолчанию стоит 0 мс, но Google рекомендует выставлять 5 секунд. Это позволит не останавливать Flow при пересоздании UI при смене конфигурации или если пользователь быстро свернул/развернул приложений.👉 Параметр
replayExpirationMillis
- указывает через какое время после остановки сбросить кэш значений StateFlow и начать с начала, а именно initialValue
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Самый простой способ подключения - через Gradle плагин
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
В Jetpack делают KMP API для обработки системных жестов нажатия назад или Predictive Back
Новая библиотека Jetpack NavigationEvent содержит в себе API для обработки нажатия назад или для отслеживания прогресса жеста назад. API cхоже с Dispatcher которое было сделано для Back ранее. Поддерживаются KMP таргеты: Android, Desktop/JVM, iOS, JS, Linux, WASM, watchOS, tvOS, Ming
ComponentActivity реализует интерфейс
В Android Activity можно подписаться на обработку события
#android #jetpack #навигация #kmp #kotlin
Новая библиотека Jetpack NavigationEvent содержит в себе API для обработки нажатия назад или для отслеживания прогресса жеста назад. API cхоже с Dispatcher которое было сделано для Back ранее. Поддерживаются KMP таргеты: Android, Desktop/JVM, iOS, JS, Linux, WASM, watchOS, tvOS, Ming
ComponentActivity реализует интерфейс
NavigationEventDispatcherOwner
:interface NavigationEventDispatcherOwner {
val navigationEventDispatcher: NavigationEventDispatcher
}
NavigationEventDispatcher
представляет собой класс, для передачи системны событий Назад:class NavigationEventDispatcher(
private val fallbackOnBackPressed: (() -> Unit)?,
private val onHasEnabledCallbacksChanged: ((Boolean) -> Unit)?,
)
// Добавления callback чтобы слушать когда произйдет нажатие "Назад"
fun addCallback(
callback: NavigationEventCallback,
priority: NavigationEventPriority = NavigationEventPriority.Default
)
fun dispatchOnStarted(event: NavigationEvent)
fun dispatchOnProgressed(event: NavigationEvent)
fun dispatchOnCompleted()
fun dispatchOnCancelled()
}
В Android Activity можно подписаться на обработку события
class MyActivity : ComponentActivity() {
init {
navigationEventDispatcher.addCallback(
callback = object : NavigationEventCallback(
isEnabled = true,
priority = NavigationEventPriority.Default
) {
override fun onEventCompleted() {
// Back сделан
}
},
priority = NavigationEventPriority.Default
)
}
}
#android #jetpack #навигация #kmp #kotlin