You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一项目中调用其他安卓模块的Composable函数报错如何解决?

问题解决方案

1. 给ComposeLib模块开启Compose编译支持

仅在app模块配置Compose是不够的,库模块自身也需要开启Compose编译开关,修改ComposeLib模块的build.gradle配置:

android {
    // 保持compileSdk与app模块一致,要求不低于31
    compileSdk 33

    buildFeatures {
        // 开启Compose支持
        compose true
    }
    composeOptions {
        // 版本号与app模块的compose编译版本完全一致
        kotlinCompilerExtensionVersion "你的compose版本号"
    }
}

dependencies {
    // 库模块自身也要引入用到的Compose依赖
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    // 若需要将依赖暴露给上层app模块,可将implementation替换为api
}

2. 修正@Composable函数的调用方式

你当前将CounterButton定义为普通Atoms类的成员方法,未实例化的情况下无法直接调用,两种优化方案:

方案A:使用顶层函数(符合Compose官方开发惯例)

直接删除Atoms类的包裹,将CounterButton定义为Atoms.kt文件的顶层函数:

// ComposeLib模块的Atoms.kt
@Composable
fun CounterButton(count: Int, updateCount: (Int) -> Unit) {
    Button( onClick = {updateCount(count+1)},
        modifier = Modifier
            .background(MaterialTheme.colors.secondary)){
        Text("Clicked $count times")
    }
}

之后在MainActivity中直接导入函数即可调用:

import com.example.composelib.CounterButton
// 直接调用
CounterButton(count = counter.value, updateCount = {newCount -> counter.value = newCount})

方案B:保留Atoms类封装

如果需要保留类结构,可以将Atoms改为单例类:

object Atoms {
    @Composable
    fun CounterButton(count: Int, updateCount: (Int) -> Unit) {
        // 原有代码不变
    }
}

调用时直接使用Atoms.CounterButton(...)即可。
如果保留普通类结构,需要先实例化再调用:

val atoms = Atoms()
atoms.CounterButton(...)

3. 全量构建生效

配置修改完成后,执行Build -> Clean Project,再执行Rebuild Project清除旧缓存即可。


内容的提问来源于stack exchange,提问作者Clark Battle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:54:03