首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我什么时候需要添加@Composable与?

我什么时候需要添加@Composable与?
EN

Stack Overflow用户
提问于 2021-09-27 07:15:54
回答 3查看 1.1K关注 0票数 0

下面的代码来自项目

我发现fun MainScreen()添加了@Composablefun launchDetailsActivity没有添加@Composable

这让我很困惑。我认为所有用于撰写的函数都应该添加@Composable,为什么fun launchDetailsActivity不添加@Composable?

代码语言:javascript
复制
@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))
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-30 06:39:52

函数与@Composable不仅仅是一个函数,它告诉compose编译器这是一个UI元素。获取这些数据并使用它构建一个Widget。

因此,您必须根据此函数是否在UI中绘制某些内容来确定何时添加@Composable。在非合成世界中,您可以将此函数视为视图。

例如,这个函数接受一个参数名,并使用文本"Hello“构建文本小部件,您可以在UI中看到它。

代码语言:javascript
复制
@Composable
fun Greeting(name: String) {
    Text("Hello $name")
}

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2021-09-30 05:53:30

您需要用@Composable标记视图构建器函数,以便从另一个@Composable直接调用

如果您有一个副作用函数,它不应该被称为直接从可组合的。它可以通过触摸处理程序调用,比如在示例中单击,或者使用副作用,比如LaunchedEffect。查看更多关于文档的副作用的信息。

代码语言:javascript
复制
@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() {

}
票数 1
EN

Stack Overflow用户

发布于 2021-09-28 01:28:41

如果使用的是调用另一个带有@Composable注释的函数,则应该使用@Composable,这非常简单。

通常,所有@Composable函数都以大写字母开头,但也有一些以小写开头,就像所有以remember开头的函数一样。

因此,当您在另一个函数中使用这些函数时,您需要使用@Composable,否则,即使是android也会对您大喊大叫,因为可以从另一个可组合函数调用可组合函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69342583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档