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 ) 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). 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