Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions learning/gradle/version-catalogs.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,45 @@ sidebar_position: 9
<br/>
<br/>

Сейчас в наших проектах используются и 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 )
16 changes: 11 additions & 5 deletions onboarding/generate-localized-strings.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
37 changes: 8 additions & 29 deletions university/3-kotlin-multiplatform-mobile/multiplatform-settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
binaries.all {
freeCompilerArgs += "-Xlazy-ir-for-caches=disable"
}
}
}
```
Более подробно о проблеме можете прочитать [здесь](https://githubhot.com/repo/russhwolf/multiplatform-settings/issues/106).
:::

## Подключение, используя expect/actual
Создайте expect/actual функцию, для получения `settings` на платформах
- получение `settings` для Android
Expand All @@ -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
}
```
Expand All @@ -48,15 +27,15 @@ kotlin {
```kotlin
actual fun getSettings(): Settings {
val delegate = NSUserDefaults.standardUserDefaults
val settings: Settings = AppleSettings(delegate)
val settings: Settings = NSUserDefaultsSettings(delegate)
return settings
}
```

## Подключение 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`, сохраните значение, а затем прочитайте
- протестируйте на обеих платформах

Expand All @@ -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
Expand All @@ -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

Expand Down