What if I want to share string resources between C...
# multiplatform
a
What if I want to share string resources between Compose Multiplatform app (mobile, desktop, wasm) and Ktor server? Can I do this with this method?
It seems I need to convert my KotlinJVM modules (database, server) to multiplatform modules, am I right? If so, it seems strange
h
No, you just have to depend on the JVM (desktop) target. You don’t need to convert your backend modules but just create/use a shared module.
a
@hfhbd khmm, I have shared top-level
resources
module where I put my strings.xml files I also have
server/data
KotlinJVM module where I'm trying to get a String from
ResourcesProvider
which inside of
resources
module My
server/data/build.gradle.kts
looks like this
Copy code
plugins {
    alias(libs.plugins.kotlinJvm)
    alias(libs.plugins.kotlinSerialization)
}

dependencies {
    /**
     * MODEL SHARED
     */
    implementation(projects.modelShared)
    /**
     * DATABASE
     */
    implementation(projects.database.domain)
    implementation(projects.database.tables)
    /**
     * RESOURCES
     */
    implementation(projects.resources)
    /**
     * DEPENDENCIES
     */
    implementation(libs.bundles.database)
}
But when I'm trying to get something from
ResourcesProvider
inside
database
module
Copy code
override suspend fun signIn(request: SignInRequest): User {
    val user = userStorage.getUser(request.email) ?: run {
        buildError("It seems this email is not in our system.")
    }
    return when {
        request.password == user.password -> user
        else -> {
            val error = ResourcesProvider().getStringFromResources(
                Res.string.auth_wrong_email_password_error
            )
            buildError(error)
        }
    }
}
I'm getting an error:
Copy code
Cannot access class 'org.jetbrains.compose.resources.StringResource'. Check your module classpath for missing or conflicting dependencies.
It looks like I can't include multiplatform
recources
module to KotlinJVM
server
module? It seems I can't include Compose
I made
resources
module multiplatform because it required to have
Copy code
implementation(compose.components.resources)
So I had to add
Copy code
plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.androidLibrary)
    alias(libs.plugins.jetbrainsCompose)
    alias(libs.plugins.compose.compiler)
}
When I'm trying to apply
compose
plugin to
database/data
module
Copy code
plugins {
    alias(libs.plugins.kotlinJvm)
    alias(libs.plugins.kotlinSerialization)
    alias(libs.plugins.jetbrainsCompose)
}

dependencies {
    implementation(compose.components.resources)
}
I'm getting this error
Copy code
Cause: e: Configuration problem: Since Kotlin 2.0.0-RC2 to use Compose Multiplatform you must apply "org.jetbrains.kotlin.plugin.compose" plugin.
Ok, I made my
database/data/build.gradle
looks like this:
Copy code
plugins {
    alias(libs.plugins.kotlinJvm)
    alias(libs.plugins.kotlinSerialization)
    alias(libs.plugins.jetbrainsCompose)
    alias(libs.plugins.compose.compiler) // <-- ADDED
}

dependencies {
    implementation(projects.resources)
    implementation(compose.runtime) // <-- ADDED
    implementation(compose.components.resources)
}
And when I'm trying to get something from
ResourcesProvider
, which is inside
resource
module, I'm getting this error:
Copy code
java.lang.ExceptionInInitializerError
	at org.jetbrains.skiko.SystemTheme_awtKt.getCurrentSystemTheme(SystemTheme.awt.kt:4)
	at org.jetbrains.compose.resources.ResourceEnvironment_desktopKt.getSystemEnvironment(ResourceEnvironment.desktop.kt:11)
	at org.jetbrains.compose.resources.ResourceEnvironmentKt$getResourceEnvironment$1.invoke(ResourceEnvironment.kt:83)
	at org.jetbrains.compose.resources.ResourceEnvironmentKt$getResourceEnvironment$1.invoke(ResourceEnvironment.kt:83)
	at org.jetbrains.compose.resources.ResourceEnvironmentKt.getSystemResourceEnvironment(ResourceEnvironment.kt:90)
	at org.jetbrains.compose.resources.StringResourcesKt.getString(StringResources.kt:42)
	at ResourcesProvider$getStringFromResources$2.invokeSuspend(ResourcesProvider.kt:12)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)
Caused by: org.jetbrains.skiko.LibraryLoadException: Cannot find libskiko-macos-arm64.dylib.sha256, proper native dependency missing.
	at org.jetbrains.skiko.Library.findAndLoad(Library.kt:103)
	at org.jetbrains.skiko.Library.load(Library.kt:56)
	at org.jetbrains.skiko.SystemThemeHelper.<clinit>(SystemTheme.awt.kt:12)
	... 13 more
To sum it up, Jetbrains wants me to make
database/data
module as multiplatform module.....
304 Views