moko-resources icon indicating copy to clipboard operation
moko-resources copied to clipboard

Expected object 'MR' has no actual declaration in module <composeApp_debug> for JVM

Open maitriyogin opened this issue 1 year ago • 2 comments

Hi, so, I've just

  1. created a new CMP project with the wizard ( https://kmp.jetbrains.com )
  2. added moko resources to composeApp build.gradle
  3. added a font to composeApp/src/commonMain/resources/MR/fonts
  4. synchronised ( no errors )
  5. then run composeApp
  6. and get. ... Expected object 'MR' has no actual declaration in module <composeApp_debug> for JVM

The MR file has been generated I assume by the plugin, but something is up ??

It would be great if anyone could shine some light on this?

/Stephen.

Here's my files:

import org.jetbrains.compose.ExperimentalComposeLibrary
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.jetbrainsCompose)
    alias(libs.plugins.multiplatformResources)
}


kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "1.8"
            }
        }
    }
    
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "ComposeApp"
            isStatic = true
        }
    }
    
    sourceSets {
        
        androidMain.dependencies {
            implementation(libs.compose.ui.tooling.preview)
            implementation(libs.androidx.activity.compose)
        }
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(compose.foundation)
            implementation(compose.material)
            implementation(compose.ui)
            @OptIn(ExperimentalComposeLibrary::class)
            implementation(compose.components.resources)
            // resources
            implementation(libs.moko.resources)
            implementation(libs.moko.resources.compose)
        }
    }

    multiplatformResources {
        multiplatformResourcesPackage = "sw.test.resources" // required
        multiplatformResourcesSourceSet = "commonMain"  // optional, default "commonMain"
    }
}

android {
    namespace = "sw.test"
    compileSdk = libs.versions.android.compileSdk.get().toInt()

    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    sourceSets["main"].res.srcDirs("src/androidMain/res")
    sourceSets["main"].resources.srcDirs("src/commonMain/resources")

    defaultConfig {
        applicationId = "sw.test"
        minSdk = libs.versions.android.minSdk.get().toInt()
        targetSdk = libs.versions.android.targetSdk.get().toInt()
        versionCode = 1
        versionName = "1.0"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    dependencies {
        debugImplementation(libs.compose.ui.tooling)
    }
}
package ResourceTest.composeApp

import dev.icerock.moko.resources.AssetResource
import dev.icerock.moko.resources.ColorResource
import dev.icerock.moko.resources.FileResource
import dev.icerock.moko.resources.FontResource
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.PluralsResource
import dev.icerock.moko.resources.ResourceContainer
import dev.icerock.moko.resources.StringResource

public expect object MR {
  public object strings : ResourceContainer<StringResource>

  public object plurals : ResourceContainer<PluralsResource>

  public object images : ResourceContainer<ImageResource>

  public object fonts : ResourceContainer<FontResource> {
    public object Interstate {
      public val regularCondensed: FontResource
    }
  }

  public object files : ResourceContainer<FileResource>

  public object colors : ResourceContainer<ColorResource>

  public object assets : ResourceContainer<AssetResource>
}

maitriyogin avatar Dec 18 '23 09:12 maitriyogin

Hello @maitriyogin !

I was facing the same problem that you, what worked for me is putting this to the top of sourceSets:

sourceSets {

    getByName("androidMain").dependsOn(commonMain.get())
    getByName("desktopMain").dependsOn(commonMain.get())
    getByName("iosArm64Main").dependsOn(commonMain.get())
    getByName("iosX64Main").dependsOn(commonMain.get())
    getByName("iosSimulatorArm64Main").dependsOn(commonMain.get())

... }

RhSantos avatar Dec 18 '23 21:12 RhSantos

I was facing the same problem that you, what worked for me is putting this to the top of sourceSets:

It really did help. I don't know how many time I lost trying to connect this library and your soultion really did the job

PS: But i crashed another part of my App. First I had error that there's not actual class for iOS. Somehow I managed it. But after that I started getting and error that there's not drawable resource. Maybe it's because I didn't use drawables of moco but used shared resources provided by KMM.

derynia avatar Jan 28 '24 16:01 derynia

should be fixed in 0.24.0-beta-1

Alex009 avatar Apr 19 '24 14:04 Alex009