从同一项目中的 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.CounterButton
、public.example.composelib.Atoms.CounterButton
等)。甚至代码完成也无法识别它。
如何从同一项目中的另一个模块引用 @Composable
函数?
出于某种原因,您已经在 class Atoms
中定义了 Composable,因此应该在 class 实例上调用此函数。
定义没有任何 classes 的可组合函数完全没问题,就像
@Composable
fun CounterButton(count: Int, updateCount: (Int) -> Unit) {
}
它已经在一些包裹中,所以我认为不需要任何容器。但是,如果您想添加某种模块化,可以将 class
替换为 object
,在这种情况下,您可以将其称为 Atoms.CounterButton
我有一个 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.CounterButton
、public.example.composelib.Atoms.CounterButton
等)。甚至代码完成也无法识别它。
如何从同一项目中的另一个模块引用 @Composable
函数?
出于某种原因,您已经在 class Atoms
中定义了 Composable,因此应该在 class 实例上调用此函数。
定义没有任何 classes 的可组合函数完全没问题,就像
@Composable
fun CounterButton(count: Int, updateCount: (Int) -> Unit) {
}
它已经在一些包裹中,所以我认为不需要任何容器。但是,如果您想添加某种模块化,可以将 class
替换为 object
,在这种情况下,您可以将其称为 Atoms.CounterButton