【问题标题】:Jetpack Compose doesn't respect Higher Order ClassesJetpack Compose 不尊重高阶类
【发布时间】:2021-12-13 15:14:45
【问题描述】:

如何克服/解决下一个 sn-p 以实现 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 已经实现了高阶函数。

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

【问题讨论】:

    标签: android kotlin android-jetpack-compose higher-order-functions


    【解决方案1】:

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

    A) nav 被定义为类内的属性。这是在创建类时实例化的,不一定在可组合作用域中。此外,这是一个枚举类,这意味着它是静态实例化的(取决于 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。

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2022-11-25
      相关资源
      最近更新 更多