可组合函数可以调用不可组合函数吗?

Can composable functions call non-composable functions?

我在 Android 中看到了新的 Jetpack Compose,并决定去看看。我一直在尝试了解有关可组合项的一些基本概念。 我的问题是:composable functions 可以调用 non-composable 函数吗? 我已经搜索 Google 没有结果。

My question is: Can composable functions call non-composable functions?

是的。 Kotlin 中的几乎所有内容都以函数调用结束,您可用的大多数函数是 non-composable.

这是 Google 的示例 Compose UI 代码之一:

@Composable
fun NewsStory() {
    val image = imageResource(R.drawable.header)
    Column(
        modifier = Modifier.padding(16.dp)
    ) {
        val imageModifier = Modifier
            .preferredHeight(180.dp)
            .fillMaxWidth()

        Image(image, modifier = imageModifier,
                  contentScale = ContentScale.Crop)
        Spacer(Modifier.preferredHeight(16.dp))

        Text("A day in Shark Fin Cove")
        Text("Davenport, California")
        Text("December 2018")
    }
}

也就是说,以下函数不是@Composable:

  • imageResource()
  • Modifier.padding()
  • Modifier.preferredHeight()
  • Modifier.fillMaxWidth()

规则是标记为 @Composable 的函数需要被标记为 @Composable 的另一个函数或可组合函数的一小部分最终消费者之一调用。这让人想起协程,其中 suspend 函数需要被其他 suspend 函数或 suspend 函数的一小部分最终消费者之一调用(例如,协程构建器 launch()).