Kotlin多平台(KMP)多模块项目中字体资源未生成、无法引用的问题求助
我完全能理解你碰到这个问题的烦躁——KMP的资源生成机制有时候确实会有让人摸不着头脑的小坑!针对你在theme模块里字体资源无法生成对应引用、Res.kt仅生成空font对象的问题,我整理了几个排查和解决的步骤,你可以一步步试试:
先检查资源目录和文件名的合规性
这是最容易踩的坑!KMP的资源生成器要求字体文件必须放在commonMain/resources/font目录下——注意是单数的font,不是你建的fonts!另外文件名必须是小写字母、数字和下划线的组合,不能有大写、空格或者特殊字符,比如你的字体文件得是inter_regular.ttf(或otf格式),不能是Inter_Regular.ttf。确认theme模块的build.gradle.kts配置是否正确
首先要确保你引入了必要的插件和资源配置:plugins { id("org.jetbrains.kotlin.multiplatform") id("com.android.library") // 如果包含Android目标的话 } kotlin { sourceSets { val commonMain by getting { // 明确指定资源目录 resources.srcDir("src/commonMain/resources") dependencies { // 确保引入了Compose相关依赖(如果用Compose的话) implementation("androidx.compose.ui:ui:1.5.4") implementation("androidx.compose.material3:material3:1.1.2") } } // 其他平台目标配置... } } // 如果有Android目标,补充资源配置 android { namespace = "com.yourpackage.theme" // 替换成你的实际包名 // ...其他Android配置 sourceSets["main"].resources.srcDir("src/commonMain/resources") }清理缓存并彻底重建项目
KMP的资源生成经常会受缓存影响,先执行命令行:./gradlew clean ./gradlew build或者在IDE里执行
Build -> Clean Project,然后Rebuild Project。如果还是不行,试试File -> Invalidate Caches... -> Invalidate and Restart,强制IDE刷新所有生成文件。检查生成的Res.kt目录是否被IDE识别
生成的Res.kt通常在theme模块/build/generated/kotlin-resources/main/[你的包名]/Res.kt路径下,如果IDE没自动识别这个目录,右键它选择Mark Directory as -> Generated Sources Root,让IDE把它当成源码目录,这样就能正确引用里面的属性了。验证字体文件本身的有效性
有时候损坏或者不兼容的字体文件会被生成器跳过,你可以换一个已知可用的字体文件(比如系统自带的字体)放到font目录里,看能不能生成对应的引用,排除文件本身的问题。
如果以上步骤都试过还是无法解决,建议你把theme模块的完整build.gradle.kts代码和资源目录结构贴出来,这样能更精准地定位问题。
内容来源于stack exchange

