下面的代码来自项目。
我发现fun MainScreen()添加了@Composable,fun launchDetailsActivity没有添加@Composable。
这让我很困惑。我认为所有用于撰写的函数都应该添加@Composable,为什么fun launchDetailsActivity不添加@Composable?
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
setContent {
ProvideWindowInsets {
ProvideImageLoader {
CraneTheme {
MainScreen(
onExploreItemClicked = { launchDetailsActivity(context = this, item = it) }
)
}
}
}
}
}
}
@Composable
fun MainScreen(onExploreItemClicked: OnExploreItemClicked) {
...
}
fun launchDetailsActivity(context: Context, item: ExploreModel) {
context.startActivity(createDetailsActivityIntent(context, item))
}发布于 2021-09-30 06:39:52
函数与@Composable不仅仅是一个函数,它告诉compose编译器这是一个UI元素。获取这些数据并使用它构建一个Widget。
因此,您必须根据此函数是否在UI中绘制某些内容来确定何时添加@Composable。在非合成世界中,您可以将此函数视为视图。
例如,这个函数接受一个参数名,并使用文本"Hello“构建文本小部件,您可以在UI中看到它。
@Composable
fun Greeting(name: String) {
Text("Hello $name")
}但
fun getName(firstName: String, lastName: String): String {
return "$firstName $lastName"
}这个函数不是一个可组合的函数。它没有使用@Composable进行注释,因为它不是一个小部件,它不应该在UI中呈现任何内容。它只需要两个参数,Concaten化它们,并返回字符串。
在您的示例中,MainScreen是呈现应用程序主屏幕的函数,因此它是一个UI元素。但是函数launchDetailsActivity并没有在UI中绘制任何东西。它只是从一个活动导航到另一个活动。
很少有事情需要记住:
函数的@Composable不返回任何内容。
不能从不可组合函数调用可组合函数。
与不可组合函数不同,可组合函数以大写字母开头。
您可以阅读此文档获得详细信息https://developer.android.com/jetpack/compose/mental-model。
发布于 2021-09-30 05:53:30
您需要用@Composable标记视图构建器函数,以便从另一个@Composable直接调用。
如果您有一个副作用函数,它不应该被称为直接从可组合的。它可以通过触摸处理程序调用,比如在示例中单击,或者使用副作用,比如LaunchedEffect。查看更多关于文档的副作用的信息。
@Composable
fun SomeView() {
// this is directly called from view builder and should be marked with @Composable
OtherView()
LaunchedEffect(Unit) {
// LaunchedEffect a side effect function, and as it's called
// from LaunchedEffect it can be a suspend fun (optionally)
handleLaunchedEffect()
}
Button(onClick = { handleButtonClick() }) { // or onClick = ::handleButtonClick
}
}
@Composable
fun OtherView() {
}
suspend fun handleLaunchedEffect() {
}
fun handleButtonClick() {
}发布于 2021-09-28 01:28:41
如果使用的是调用另一个带有@Composable注释的函数,则应该使用@Composable,这非常简单。
通常,所有@Composable函数都以大写字母开头,但也有一些以小写开头,就像所有以remember开头的函数一样。
因此,当您在另一个函数中使用这些函数时,您需要使用@Composable,否则,即使是android也会对您大喊大叫,因为可以从另一个可组合函数调用可组合函数。
https://stackoverflow.com/questions/69342583
复制相似问题