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
属性。如果你想在它们之间共享状态,你可以使用 StateFlow
或 Composition Local.
选项 B:使用扩展函数
enum class UINavigator {
MAIN;
}
@Composable operator fun UINavigator.invoke() {
val nav: NavHostController = rememberNavController()
// ...
}
所有效果,同选项A
如何克服/解决下一个片段来实现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
属性。如果你想在它们之间共享状态,你可以使用 StateFlow
或 Composition Local.
选项 B:使用扩展函数
enum class UINavigator {
MAIN;
}
@Composable operator fun UINavigator.invoke() {
val nav: NavHostController = rememberNavController()
// ...
}
所有效果,同选项A