【问题标题】:TopAppBar @composable invocations can only happen from the context of an @composable functionTopAppBar @composable 调用只能在 @composable 函数的上下文中发生
【发布时间】:2021-12-05 14:52:02
【问题描述】:

我试图添加TopAppBar。当我尝试添加以下代码时,我得到了

@composable 调用只能在 @composable 函数** 错误的上下文中发生。

@Composable
fun appTopBar(name: String) {
    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
    Scaffold(
        scaffoldState = scaffoldState,
        topBar = {
            TopAppBar(
                title = { Text(text = name) },
                backgroundColor = MaterialTheme.colors.primary
            ) {
                
            }
        }, content = {

        })
}

但是当我尝试删除TopAppBar 的最后一个{} 时,错误已解决。像下面的代码。

@Composable
fun appTopBar(name: String) {
    val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
    Scaffold(
        scaffoldState = scaffoldState,
        topBar = {
            TopAppBar(
                title = { Text(text = name) },
                backgroundColor = MaterialTheme.colors.primary
            )
        }, content = {

        })
}

我的问题是TopAppBar(){}TopAppBar() 有什么区别。 {} 由 Android Studio 自动生成。

【问题讨论】:

    标签: kotlin android-jetpack-compose


    【解决方案1】:

    Kotlin 尾随 lambda 只能与最后一个 lambda 参数一起使用。

    当您为TopAppBar 指定它时,唯一可能的变体没有title 参数:

    @Composable
    fun TopAppBar(
        modifier: Modifier = Modifier,
        backgroundColor: Color = MaterialTheme.colors.primarySurface,
        contentColor: Color = contentColorFor(backgroundColor),
        elevation: Dp = AppBarDefaults.TopAppBarElevation,
        contentPadding: PaddingValues = AppBarDefaults.ContentPadding,
        content: @Composable RowScope.() -> Unit
    ) ...
    

    另一方面,接受 titleTopAppBar 没有最后一个 lambda 参数:

    fun TopAppBar(
        title: @Composable () -> Unit,
        modifier: Modifier = Modifier,
        navigationIcon: @Composable (() -> Unit)? = null,
        actions: @Composable RowScope.() -> Unit = {},
        backgroundColor: Color = MaterialTheme.colors.primarySurface,
        contentColor: Color = contentColorFor(backgroundColor),
        elevation: Dp = AppBarDefaults.TopAppBarElevation
    ) ...
    

    它是由 AS 生成的,因为一个错误。我已经reported了。

    【讨论】:

      【解决方案2】:

      {} 是您的TopAppBar 的参数,必须传递!

      当你删除它时,你得到了那个错误。

      更多信息请阅读这篇文章:

      https://kotlinlang.org/docs/lambdas.html#higher-order-functions

      【讨论】:

        猜你喜欢
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        相关资源
        最近更新 更多