我可以将可组合函数存储在变量中吗?

Can I store a composable function in a variable?

在 Kotlin 中,函数是第一个 class 公民。我们可以将函数存储在变量中,如下所示

val functionVariable: () -> Unit = ::myFunction

fun myFunction() { }

但是,对于@Composable函数,我该怎么做呢?

如果我做了下面的事情,它会大喊大叫,即 org.jetbrains.kotlin.diagnostics.SimpleDiagnostic@e93b05f8 (error: could not render message)

val functionVariable: () -> Unit = ::myFunction

@Composable
fun myFunction() { }

有没有办法将可组合函数存储为变量?

尚不支持可组合函数引用(这就是错误消息的实际含义)。此外,@Composable 注释是函数签名的一部分,因为它为函数添加了一些参数。所以你需要使用 val functionVariable: @Composable () -> Unit = { myFunction() }.

您可以声明一个可组合的函数变量,例如:

var functionVariable: @Composable () -> Unit = {}

稍后您可以重新分配它(本质上是重新定义它),例如:

functionVariable = { myFunction1() }

functionVariable = { myFunction2() }

但是,如果您已将 functionVariable 植入较大的可组合项中,则重新分配可能不会触发重组。我所做的是声明一个状态变量,如:

var functionAssigned by mutableStateOf(0)

在你放置 functionVariable 的更大的 Composable 中,做:

if (functionAssigned >= 0) functionVariable()

每当你想重新分配变量时,做:

functionVariable = { myFunction2() }
functionAssigned++

这将触发所需的重组。