Forwarded from Kotlin Multiplatform Broadcast
Вышел Coil 3.1.0 - популярный загрузчик картинок с поддержкой KMP
👉 Улучшили производительность AsyncImage: скорость работы стала лучше на 25-40%, а потребление памяти - на 35-48%
👉 FakeImage теперь deprecated
👉 Появился ColorImage - полезен для возвращения фейковых значений в тестах и для Compose превью
👉 coil-compose-core больше не зависит от
🛠 Множество других исправлений и улучшений API
#kmp #android #compose
👉 Улучшили производительность AsyncImage: скорость работы стала лучше на 25-40%, а потребление памяти - на 35-48%
👉 FakeImage теперь deprecated
👉 Появился ColorImage - полезен для возвращения фейковых значений в тестах и для Compose превью
👉 coil-compose-core больше не зависит от
Dispatchers.Main.immedate
, что позволило исправить баги в работе Paparazzi и Roborazzi🛠 Множество других исправлений и улучшений API
#kmp #android #compose
Media is too big
VIEW IN TELEGRAM
В Android Studio Meerkat 2024.3.1 появится возможность создавать KMP Shared модуль для Android и iOS
#androidstudio #kmp #android #ios
#androidstudio #kmp #android #ios
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаю рассказывать про ход разработки KMP + Compose клиента для Frame.io. В новой части показываю как я настроил анализаторы кода: KtLint, Detekt, Gitleaks, Manifest Guard и другие, а также как стоит подходить к оптимизации скорости проверок локально и на CI. Полезно как для командных проектов, так и для ваших личных проектов (я бы тут даже сказал что еще важнее)!
Список всех вышедших и планируемых видео тут
#AndroidBroadcast #frameio #kmp #android #ios #качествокода
Please open Telegram to view this post
VIEW IN TELEGRAM
В AndroidX Lifecycle 2.9.0 появилось новое API для тестирования ViewModel - ViewModelScenario. Для использования этого API необходимо подключить артефакт "androidx.lifecycle:lifecycle-viewmodel-testing".
Пример использования:
class JetpackViewModelTest {
@Test
fun testStateRestoration() = runTest { // this = TestScope
viewModelScenario { // this = CreationExtras
SampleViewModel(
scope = this@runTest,
saveStateHandle = createSavedStateHandle(),
)
}.use { scenario: ViewModelScenario ->
scenario.state.data = "testValue"
scenario.recreate()
assertEquals("testValue", scenario.state.data)
}
}
}
class SampleViewModel(
scope: CoroutineScope,
private val saveStateHandle: SavedStateHandle,
) : ViewModel(scope) {
companion object {
private const val STATE_KEY = "state_key"
}
var data: String?
get() = saveStateHandle.get<String>(STATE_KEY)
set(value) {
saveStateHandle.set(STATE_KEY, value)
}
}
#android #kmp #тестирование #jetpackupdate
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Room 2.7.0-rc01 где исправили баг Room, который приводил к крешу KSP процессора на iOS с Kotlin 2.1
#android #jetpack #kmp #sqlite
#android #jetpack #kmp #sqlite
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
Media is too big
VIEW IN TELEGRAM
Обзор библиотеки Kotlin Inject - DI для KMP, API которого аналогично Dagger. В видео происходит демонстрация возможностей, сравнение с другими DI и личное мнение о том стоит ли использовать эту библиотеку в проде.
#видео #kmp #di
Please open Telegram to view this post
VIEW IN TELEGRAM
Всё также идет подготовка к первому стабильному релизу Room с поддержкой KMP, самые важные:
🔥 Исправлено падение компилятора с NPE при обработке не JVM исходников через KSP
🛠 Исправлены Авто Миграции при добавление новой колонки в FTS таблице
#android #jetpack #room #sql #kmp
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
#android #jetpack #jetpackupdate #kmp
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
🔥 Главное нововведение этой версии Room — рефакторинг библиотеки для поддержки нескольких платформ через KMP: Android, iOS, JVM (Desktop), native Mac и native Linux. Документацию о том, как начать, можно найти здесь. В рамках поддержки KMP было выделено SQLiteDriver.
#android #kmp #jetpack #ios #desktop #mac #linux
Please open Telegram to view this post
VIEW IN TELEGRAM
Reanimator - простоя библиотека для Jetpack ViewModel (с поддержкой KMP) для работы с состоянием. Подробный разбор в статье (EN,11м) или альтернативной ссылке
#android #kmp
@Serializable
data class MyUiState(
// Persistent
val data: List<String> = emptyList(),
val selectedItem: String? = null,
// Transient
val isLoading: Boolean = false,
val error: String? = null
)
class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
// Define which properties are transient
private val transientProps = listOf("isLoading", "error")
// Declare your state flow - Reanimator handles the rest!
private val _uiState by savedStateHandle.getMutableStateFlow(
defaultValue = MyUiState(), // Initial/default state
coroutineScope = viewModelScope, // Scope for saving changes
transientProperties = transientProps // What NOT to save
// key = "custom_state_key" // Optional: custom key
)
val uiState: StateFlow<MyUiState> = _uiState.asStateFlow()
// ... rest of your ViewModel logic ...
fun updateData(newData: List<String>) {
// Just update the state - Reanimator saves persistent parts automatically
_uiState.update { it.copy(data = newData, isLoading = false) }
}
}
#android #kmp
Когда: четверг, 8 мая, 18:30 (GMT+3)
Буквально вчера вышел Compose iOS Stable и конечно же открывает возможности Android разработчиками по написанию мобильных приложений под обе платформы. Но всё ли так сладко, как заявляет JetBrains? Будем разбираться в этом с экспертом кто уже познал прелести продакшена!
👨💻 Эксперт - Никита, фуллстек Kotlin разработчик, автор проектов FlowMVI и respawn.pro. При анонсе Compose iOS Stable, его приложение было в официальном анонсе 🔥
👨💻 И еще одни эксперт - Чикишев Тимур, Senior Android разработчик в KTS. Начал пробовать Compose iOS еще до официального релиза. Успел адаптировать Android приложение с Compose на iOS, буквально на этой неделе сделали релиз
Задавайте свои вопросы в комментариях к посту, чтобы они были заданы на эфире
#android #compose #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Software Engineers Dustin Lam и Yigit Boyar присоединяются к ведущему Tor Norbye, чтобы обсудить Kotlin Multiplatform (KMP).
0:00 - Введение
0:29 - Что такое KMP: не новый продукт, а Kotlin с новыми возможностями
3:20 - Зачем нужен KMP: преимущества и цели
6:17 - KMP vs. другие кроссплатформенные фреймворки
6:41 - Общая бизнес-логика — основной сценарий использования
9:18 - Практическое внедрение: превращение Android-приложения в KMP
13:15 - Работа с платформо-специфичными зависимостями
28:56 - Поддержка библиотек в Kotlin Multiplatform
35:56 - Developer Experience: инструменты и интеграция
40:16 - Совместимость с iOS: как добиться взаимодействия
42:51 - KMP в действии: как Google использует эту технологию
47:17 - Долгосрочное видение и потенциал KMP
51:30 - Консистентность поведения vs. нативная производительность
55:32 - Попробуйте KMP и присоединяйтесь к разработке!
#android #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Значительные переработки под капотом для улучшения поддержки KMP
👉 Добавлена поддержка обработки deep link из Kotlin Common кода
👉 Улучшения API
#jetpack #jetpackupdate #navigation #compose #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Новый артефакт
lifecycle-viewmodel-testing
- KMP библиотека для тестирования ViewModel в изоляции с помощью ViewModelScenario👉 SavedStateHandle теперь может возвращать MutableStateFlow
👉 CreationExtras добавили перегрузки операторов in, +=, и +
Больше поддержки KMP
👉
lifecycle-testing
, lifecycle-viewmodel-savedstate
теперь полностью KMP библиотеки👉 LocalLifecycleOwner стал доступен из common кода
👉 ViewModelProvider.NewInstanceFactory теперь доступна для Android и JVM
#android #jetpack #jetpackupdate #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
Что нового:
👉 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