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

SNM*_*SNM 13 android kotlin android-jetpack android-jetpack-compose

我试图在单击工具栏操作时显示 Toast 消息,但出现此错误

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

代码:

@Composable
fun Toolbar() {
    TopAppBar(title = { Text(text = "Jetpack Compose") }, navigationIcon = {
        IconButton(onClick = {}) {
            Icon(Icons.Filled.Menu)
        }
    }, actions = {
        IconButton(onClick = {
            showMessage(message = "test")
        }) {
            Icon(vectorResource(id = R.drawable.ic_baseline_save_24))
        }
    })
}

@Preview
@Composable
fun ToolbarPreview(){
    Toolbar()
}

@Composable
fun showMessage(message:String){
    Toast.makeText(ContextAmbient.current, message, Toast.LENGTH_SHORT).show()
}
Run Code Online (Sandbox Code Playgroud)

gus*_*knz 18

我遇到了同样的错误,我的解决方案是@Composable在我传递另一个可组合函数的方法中向参数添加注释。

例子:

fun drawScreen(navigationIcon: @Composable () -> Unit) {
    navigationIcon()
    ...
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 10

onClick参数不接受可组合函数。取出@Composable的注解showMessage
使用类似的东西:

@Composable
fun Toolbar() {

    val context = LocalContext.current

    TopAppBar(title = {},
            actions = {
        IconButton(onClick = {
            showMessage(context, message = "test")
        }){}
    })
}

fun showMessage(context: Context, message:String){
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
Run Code Online (Sandbox Code Playgroud)

  • @user901790:您的 UI 应该基于状态数据组成,这意味着 UI 永远不会直接修改。相反,要“修改”UI,您需要修改状态,从而导致 UI 重新组合并在视觉上发生变化。 (7认同)
  • 为什么你不能这样做呢?这是任何其他框架中的基本 UI 行为吗?如何通过 onClick() 事件显示视图或更改视图状态? (4认同)