Forwarded from Kotlin Multiplatform Broadcast
Поддержите Koin IDE плагин на Product Hunt. Команда проделывают большую работу и точно заслуживает поддержки от сообщества!
#kotlin #koin #ide #androidstudio
#kotlin #koin #ide #androidstudio
👍38👎15
Важное изменение - ускорение KAPT из-за перехода под капотом на K2 компилятор.
#kotlin #kapt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34
Новый Mobius приближается и традиционно открывается плейлист со всеми видео прошедшей конференции
Также можно посмотреть на
В комментариях делитесь самыми интересными докладами и что в них было полезного
#android #ios #flutter #kotlin #kmp #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
👍49
Чтобы добавить поддержку других платформ в Jetpack Room, необходимо было обеспечить совместимость с различными версиями SQLite, встроенными в ОС, а также с теми, которые могут подключаться отдельно. Результатом стал BundledSQLiteDriver, который позволяет использовать актуальную версию SQLite, поставляемую отдельно, и применять её на всех платформах.
В статье подробно рассматриваются особенности этого подхода к работе с SQLite в Room.
#kotlin #kmp #android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
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
👍33
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
👍20
Forwarded from Kotlin Multiplatform Broadcast
Вышел KSP 2.0, который теперь работает на KSP2 по умолчанию. Теперь работает на K2 и отдельный генератор исходников с большей гибкостью
#kotlin #ksp
#kotlin #ksp
👍27
Разыгрываю книгу "Kotlin. Программирование для профессионалов. 2-е изд."
Для участия надо подписаться на @android_broadcast и @kotlin_broadcast. Итоги розыгрыша подведу 20 апреля 2025
#kotlin #розыгрыш
Kotlin — это язык программирования со статической типизацией, который взяла на вооружение Google в ОС Android. Кроме того, это мультиплатформенный язык, позволяющий создавать приложения для macOS, Windows и iOS.
Джош Скин, Дэвид Гринхол, Эндрю Бэйли на практических примерах познакомят вас с ключевыми концепциями Kotlin и фундаментальными API.
Вы начнете с основных принципов и перейдете к расширенному использованию нетривиальных возможностей Kotlin, чтобы создавать надежные и эффективные приложения, а так же освоите среду разработки IntelliJ IDEA от JetBrains.
Для участия надо подписаться на @android_broadcast и @kotlin_broadcast. Итоги розыгрыша подведу 20 апреля 2025
#kotlin #розыгрыш
👍61
Что нового:
👉 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
🔥30👍9🤔5
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍18❤1
Очень классная статья от @nek_12_personal про лучшие практики для загрузки данных из UI, чтобы не выполнять лишнюю работу и не занимать ресурсы, когда UI не показывается
❌ Чего следует избегать
Запуск загрузки данных в блоке init может привести к устаревшей информации при возвращении пользователя к экрану после длительного отсутствия.
Такой подход может вызвать множественные параллельные запросы, что увеличивает нагрузку на систему и усложняет управление состоянием.
Сбор данных в viewModelScope без учёта видимости UI может привести к утечкам памяти и избыточному потреблению ресурсов.
Перенос логики загрузки данных в UI нарушает принцип разделения ответственности и усложняет архитектуру приложения.
Все подробности в статье, которую рекомендую вам изучить подробно!
🔗 Альтернативная ссылка
#kotlin #android #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
❤28👍12🤔12
Для конвертации холодного 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
❤33👍20
Forwarded from Kotlin Multiplatform Broadcast
Самый простой способ подключения - через Gradle плагин
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27
В 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
❤24👍11🔥7🤔3
Forwarded from Kotlin Multiplatform Broadcast
Все сессии можно найти в расписании. Пока только на сайте, но там встроен YouTube плеер, так что позже выпустят плейлист. В @kotlin_broadcast буду выкладывать доклады и рассказывать самое интересное
#kotlin #kotlinconf
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26❤4
Forwarded from Kotlin Multiplatform Broadcast
Что нового в релизе языка:
👉 Превью context parametr
👉 Non-local break и continue теперь stable
👉 Kotlin/JVM: изменения в генерации метода по умолчанию
👉 Kotlin/Native: улучшения в управлением памятью
👉 Kotlin/Wasm: wasmJs таргет отделили от js таргета
👉 Base64 стало Stable
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤39👍5🔥2
Media is too big
VIEW IN TELEGRAM
Прошла Kotlin Conf и в рамках keynote показали 3 фичи:
Версия на
#AndroidBroadcast #kotlin #kotlinconf25
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍14❤5🤯1
Именно по этой причине Google не фокусируется на этих таргетах, хотя mingwX64 не обходит стороной.
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Forwarded from Kotlin Multiplatform Broadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥1
Стек: #kotlin, #material3, #compose, Ktor, Room
#android #пример
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🤯17❤4🔥2🎉1🤝1