From 7b4ed6e148f605681b93088274a7421c3b886967 Mon Sep 17 00:00:00 2001 From: "@maiow" <113892176+maiow@users.noreply.github.com> Date: Tue, 8 Jul 2025 12:21:30 +0300 Subject: [PATCH 1/3] Update multiplatform-settings.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit обновлены платформенные реализации multiplatform-settings в связи с изменением апи, а также версии зависимостей --- .../multiplatform-settings.md | 37 ++++--------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/university/3-kotlin-multiplatform-mobile/multiplatform-settings.md b/university/3-kotlin-multiplatform-mobile/multiplatform-settings.md index 6d54d6ac6..c0a605a96 100644 --- a/university/3-kotlin-multiplatform-mobile/multiplatform-settings.md +++ b/university/3-kotlin-multiplatform-mobile/multiplatform-settings.md @@ -7,27 +7,6 @@ sidebar_position: 3 Ознакомьтесь с [multiplatform-settings](https://github.com/russhwolf/multiplatform-settings) - библиотекой, позволяющей сохранять key-value данные в параметры устройства из общего кода, используя `SharedPreferences` для Android и `NSUserDefaults` для iOS Разберем варианты ее подключения к проекту. -:::info -Если вы используете [0.8.1](https://github.com/russhwolf/multiplatform-settings/releases/tag/v0.8.1) версию библиотеки, и [Kotlin 1.6.20](https://github.com/JetBrains/kotlin/releases/tag/v1.6.20), то, при выполнении таска `:linkDebugFrameworkIos` у вас произойдет ошибка: -```text -e: The symbol of unexpected type encountered during IR deserialization: IrSimpleFunctionPublicSymbolImpl, com.russhwolf.settings/Settings|-62081702699614493[0]. IrClassifierSymbol is expected. - -This could happen if there are two libraries, where one library was compiled against the different version of the other library than the one currently used in the project. Please check that the project configuration is correct and has consistent versions of dependencies. -``` - -Чтобы ее избежать, добавьте в `commonMain/build.gradle` следующее: -```kotlin -kotlin { - targets.withType { - binaries.all { - freeCompilerArgs += "-Xlazy-ir-for-caches=disable" - } - } -} -``` -Более подробно о проблеме можете прочитать [здесь](https://githubhot.com/repo/russhwolf/multiplatform-settings/issues/106). -::: - ## Подключение, используя expect/actual Создайте expect/actual функцию, для получения `settings` на платформах - получение `settings` для Android @@ -37,7 +16,7 @@ kotlin { actual fun getSettings(): Settings { val delegate = appContext!!.getSharedPreferences("app", Context.MODE_PRIVATE) - val settings = AndroidSettings(delegate) + val settings: Settings = SharedPreferencesSettings(delegate) return settings } ``` @@ -48,7 +27,7 @@ kotlin { ```kotlin actual fun getSettings(): Settings { val delegate = NSUserDefaults.standardUserDefaults - val settings: Settings = AppleSettings(delegate) + val settings: Settings = NSUserDefaultsSettings(delegate) return settings } ``` @@ -56,7 +35,7 @@ kotlin { ## Подключение no-arg библиотеки Если вся работа с multiplatform-settings будет происходить в общем коде, вы можете использовать [no-arg-module](https://github.com/russhwolf/multiplatform-settings#no-arg-module). Используя его, вам не придется инициализировать `Settings` на платформе, для `Android`, в качестве делегата будет использоваться `PreferenceManager.getDefaultSharedPreferences()`, а для iOS - `NSUserDefaults.standardUserDefaults`. -- подключите `no-arg` библиотеку к commonMain модулю: `implementation("com.russhwolf:multiplatform-settings-no-arg:0.8.1")` +- подключите `no-arg` библиотеку к commonMain модулю: `implementation("com.russhwolf:multiplatform-settings-no-arg:1.3.0")` - создайте `settings`, сохраните значение, а затем прочитайте - протестируйте на обеих платформах @@ -67,17 +46,17 @@ kotlin { commonMain { dependencies { // ... - api("com.russhwolf:multiplatform-settings:0.8.1") + api("com.russhwolf:multiplatform-settings:1.3.0") } } ``` -Убедитесь, что класс `AndroidSettings` стал доступен в Android-проекте. +Убедитесь, что класс `SharedPreferencesSettings` стал доступен в Android-проекте. Однако, этого не достаточно, чтобы библиотека стала доступна и на iOS. Чтобы это сделать, необходимо добавить классы библиотеки в header iOS фреймворка, чтобы они стали видны из swift. По умолчанию, для `api`-зависимостей этого не происходит, потому что тогда бы бинарник фреймворка был бы огромный (кому интересно, почитайте об этом [тут](../../learning/kotlin-native/size_impact)). Но, при желании, добавить классы в хидер можно, для этого добавьте следующие строчки в раздел `cocoapods/framework` в `shared/build.gradle` файле: ```kotlin -export("com.russhwolf:multiplatform-settings:0.8.1") +export("com.russhwolf:multiplatform-settings:1.3.0") ``` Как должно получиться: ```kotlin @@ -88,13 +67,13 @@ cocoapods { podfile = project.file("../iosApp/Podfile") framework { baseName = "shared" - export("com.russhwolf:multiplatform-settings:0.8.1") + export("com.russhwolf:multiplatform-settings:1.3.0") } } ``` Более подробно о настройке фреймворка вы можете прочитать [тут](https://kotlinlang.org/docs/multiplatform-build-native-binaries.html#export-dependencies-to-binaries). -Наконец, выполните команду `pod install` и классы библиотеки mutliplatform-settings станут доступны на iOS, попробуйте создать `AppleSettings`. +Наконец, выполните команду `pod install` и классы библиотеки mutliplatform-settings станут доступны на iOS, попробуйте создать `NSUserDefaultsSettings`. ## KeyValueStorage From 411b023ee846011a7a4e960c943bc2cc053ff8d3 Mon Sep 17 00:00:00 2001 From: "@maiow" <113892176+maiow@users.noreply.github.com> Date: Tue, 8 Jul 2025 13:42:35 +0300 Subject: [PATCH 2/3] Update version-catalogs.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit дополнение про использование bundles в наших проектах с примером --- learning/gradle/version-catalogs.md | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/learning/gradle/version-catalogs.md b/learning/gradle/version-catalogs.md index 7ad30d643..3bb351d0d 100644 --- a/learning/gradle/version-catalogs.md +++ b/learning/gradle/version-catalogs.md @@ -8,6 +8,45 @@ sidebar_position: 9

+Сейчас в наших проектах используются и bundles, о которых упоминается в видео. +Например, ниже часть блоков [libraries] и [bundles] в каталоге версий нашего mobile-compose-boilerplate, с помощью которого стартуем ComposeMultiplatform проекты: +```kotlin +[libraries] +... +# Koin +koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koinBom" } +koin-core = { module = "io.insert-koin:koin-core" } +koin-annotations = { module = "io.insert-koin:koin-annotations", version.ref = "koinKsp" } +koin-compose = { module = "io.insert-koin:koin-compose" } +... +# moko +moko-resources = { module = "dev.icerock.moko:resources", version.ref = "mokoResources" } +moko-resources-compose = { module = "dev.icerock.moko:resources-compose", version.ref = "mokoResources" } +... + +[bundles] +koin = [ + "koin-core", + "koin-annotations", + "koin-compose" +] +moko-resources = [ + "moko-resources", + "moko-resources-compose" +] +``` +Использование bundles в buld.gradle фичи в общем коде mpp-library: +```kotlin +dependencies { + ... + commonMainImplementation(platform(libs.koin.bom)) + commonMainApi(libs.bundles.koin) + + commonMainApi(libs.bundles.moko.resources) + ... + } +``` + - [Gradle docs - Version catalogs](https://docs.gradle.org/7.2/userguide/platforms.html#sub:central-declaration-of-dependencies ) - [Gradle docs - Project accessors](https://docs.gradle.org/7.2/userguide/declaring_dependencies.html#sec:type-safe-project-accessors ) - [Gradle docs - Centralized repository declaration](https://docs.gradle.org/7.2/userguide/declaring_repositories.html#sub:centralized-repository-declaration ) From 63560e3ce3c45ede4413c06ba6b9a8e2aab5bc30 Mon Sep 17 00:00:00 2001 From: "@maiow" <113892176+maiow@users.noreply.github.com> Date: Tue, 8 Jul 2025 21:38:20 +0300 Subject: [PATCH 3/3] Update generate-localized-strings.md --- onboarding/generate-localized-strings.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/onboarding/generate-localized-strings.md b/onboarding/generate-localized-strings.md index 1de6c47ca..48ca83f46 100644 --- a/onboarding/generate-localized-strings.md +++ b/onboarding/generate-localized-strings.md @@ -14,19 +14,25 @@ sidebar_position: 10 function cmdLocalize() { # ... - npm start android strings "GSHEET_ID_HERE" 'platform!A1:C' ../mpp-library/shared/src/androidMain/res/ - npm start mpp strings "GSHEET_ID_HERE" 'mpp!A1:C' ../mpp-library/src/commonMain/resources/MR/ - npm start mpp plurals "GSHEET_ID_HERE" 'mpp-plurals!A1:D' ../mpp-library/src/commonMain/resources/MR/ - npm start ios strings "GSHEET_ID_HERE" 'platform!A1:C' ../ios-app/src/Resources/ + npm start android strings "GSHEET_ID_HERE" 'platform!A1:D' ../android-app/src/main/res/ + npm start mpp strings "GSHEET_ID_HERE" 'mpp!A1:D' ../mpp-library/resources/src/commonMain/moko-resources/ + npm start mpp plurals "GSHEET_ID_HERE" 'mpp-plurals!A1:D' ../mpp-library/resources/src/commonMain/moko-resources/ + npm start ios strings "GSHEET_ID_HERE" 'platform!A1:D' ../ios-app/SwiftUIApp/Resources/ + npm start mpp strings "GSHEET_ID_HERE" 'auth!A1:D' ../mpp-library/features/auth/src/commonMain/moko-resources/ + npm start mpp strings "GSHEET_ID_HERE" 'profile!A1:D' ../mpp-library/features/profile/src/commonMain/moko-resources/ + npm start mpp strings "GSHEET_ID_HERE" 'order!A1:D' ../mpp-library/features/order/src/commonMain/moko-resources/ } ``` Вместо GSHEET_ID_HERE должен стоять Google Sheet Id файла локализации. +Для каждой новой фичи в файле локализации создается вкладка с названием, которая должна быть добавлена в скрипт вместе с путем к директории moko-resources данной новой фичи. Выше в примере добавлены auth, profile и order. + +Если папку moko-resources в фиче пока не создавали, скрипт ее создаст при генерации строк локализации. Далее, чтобы обновить строки локализации в проекте необходимо вызвать команду: ```bash -./master.sh localize +sh master.sh localize ``` Для корректной работы скрипта у вас должен быть установлен [npm](https://www.npmjs.com).