从同一项目中的 android 模块调用可组合函数

Calling a Composable function from an android module in the same project

我有一个 android 模块 (ComposeLib) 作为与应用程序相同的项目的一部分。这只是为了测试使用库中的 Compose。在“项目结构”对话框中,我添加了 ComposeLib 作为应用程序的实现依赖项。

build.gradle (:app) 包含...

dependencies {
    ...
    implementation "androidx.compose.ui:ui:$compose_version"
    implementation "androidx.compose.material:material:$compose_version"
    implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
    implementation 'androidx.activity:activity-compose:1.4.0-rc01'
    implementation "com.google.accompanist:accompanist-appcompat-theme:0.16.0"

    implementation project(path: ':ComposeLib')
    ...
}
ComposeLib 中的

Atoms.kt 包括...

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

然后在 MainActivity.kt 我尝试使用 CounterButton...

import com.example.composelib.Atoms

class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val myComposeView = findViewById<ComposeView>(R.id.composeView)
        myComposeView.setContent {
            val counter = remember{ mutableStateOf(0) }

            AppCompatTheme {
                CounterButton( // <== Unresolved Reference!?
                    count = counter.value,
                    updateCount = {newCount -> counter.value = newCount})
            }
        }
    }
}

正如您在屏幕截图左下角看到的,该应用无法从 ComposeLib.Atoms 中找到 CounterButton。知道为什么吗?

如果我将 CounterButton() 放入 MainActivity 中的应用程序,此代码将起作用,因此这不是 Jetpack 问题,而是构建配置问题。

我还尝试用我能想到的每一种方式来限定对 CounterButton 的调用(Atoms.CounterButtonpublic.example.composelib.Atoms.CounterButton 等)。甚至代码完成也无法识别它。

如何从同一项目中的另一个模块引用 @Composable 函数?

出于某种原因,您已经在 class Atoms 中定义了 Composable,因此应该在 class 实例上调用此函数。

定义没有任何 classes 的可组合函数完全没问题,就像

@Composable
fun CounterButton(count: Int, updateCount: (Int) -> Unit) {
}

它已经在一些包裹中,所以我认为不需要任何容器。但是,如果您想添加某种模块化,可以将 class 替换为 object,在这种情况下,您可以将其称为 Atoms.CounterButton