Jetpack Compose 不遵守高阶 类

Jetpack Compose doesn't respect Higher Order Classes

如何克服/解决下一个片段来实现Jetpack Compose编译器(综合示例):

enum class UINavigator: @Composable () -> Unit {
    MAIN;

    private val nav: NavHostController = rememberNavController()

    override operator fun invoke() = ...
}

错误:

@Composable invocations can only happen from the context of a @Composable function

但是,UINavigator 已经实现了高阶函数。

这是文档中没有涵盖的错误或限制吗?

这个错误可能来自两部分。

A) nav定义为class里面的一个属性。这是在创建 class 时实例化的,它不一定在可组合范围内。此外,这是一个枚举 class,这意味着它是静态实例化的(取决于 VM,可能在启动时或首次读取时发生)。

B) Compose 编译器插件为函数添加了一些魔力,因此即使我们将@Composable 注释添加到被覆盖的函数中,也会引入冲突:

您可以尝试以下几种方法:

选项 A:定义运算符而不扩展函数类型:

enum class UINavigator {
    MAIN;

    @Composable operator fun invoke() {
        val nav: NavHostController = rememberNavController()
        // ...
    }
}

您仍然可以将其用作函数。注意nav属性。如果你想在它们之间共享状态,你可以使用 StateFlowComposition Local.

选项 B:使用扩展函数

enum class UINavigator {
    MAIN;
}

@Composable operator fun UINavigator.invoke() {
    val nav: NavHostController = rememberNavController()
    // ...
}

所有效果,同选项A