You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose新手遇@Composable调用错误:启动Activity失败

问题解决:Jetpack Compose按钮跳转报错@Composable invocations can only happen from the context of a @Composable function

错误原因

你的错误出在MainScreen()::class.java这行——MainScreen是一个@Composable函数,并非Android的Activity类,但你试图把它当作Activity传入Intent。Intent要求接收的是继承自Activity的类的class对象,Composable只是UI组件,不能用这种Activity跳转的方式打开。

两种解决方式

方式1:如果MainScreen属于另一个Activity

假设MainScreen是在MainActivity中作为主UI展示的,直接传入对应Activity的class即可:

OutlinedButton(
    onClick = {
        if (password.equals("Abac@xi123")) {
            val intent = Intent(mContext, MainActivity::class.java)
            mContext.startActivity(intent)
        }
    },
    modifier = Modifier
        .fillMaxWidth()
        .padding(35.dp),
) {
    Text(text = "Entrar")
}

方式2:使用Navigation Compose在同一Activity内切换Composable(推荐)

Jetpack Compose项目更推荐用官方导航组件管理页面跳转,无需创建多个Activity,步骤如下:

  1. 添加Navigation Compose依赖(在app模块的build.gradle.kts中):
dependencies {
    implementation("androidx.navigation:navigation-compose:2.7.7")
}
  1. 定义路由并设置导航宿主:
    先创建路由密封类:
sealed class Screen(val route: String) {
    object AdminAuth : Screen("admin_auth")
    object MainScreen : Screen("main_screen")
}

在主Activity中配置NavHost:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            YourAppTheme {
                val navController = rememberNavController()
                NavHost(navController = navController, startDestination = Screen.AdminAuth.route) {
                    composable(Screen.AdminAuth.route) {
                        AdminAuth(navController = navController)
                    }
                    composable(Screen.MainScreen.route) {
                        MainScreen() // 你的MainScreen Composable
                    }
                }
            }
        }
    }
}
  1. 修改AdminAuth函数,通过NavController完成跳转:
@Composable
fun AdminAuth(navController: NavController) {
    // 原有布局逻辑保持不变...
    
    OutlinedButton(
        onClick = {
            if (password.equals("Abac@xi123")) {
                navController.navigate(Screen.MainScreen.route)
            }
        },
        modifier = Modifier
            .fillMaxWidth()
            .padding(35.dp),
    ) {
        Text(text = "Entrar")
    }
}

这种方式符合Jetpack Compose的开发最佳实践,能更优雅地管理页面跳转逻辑。

内容的提问来源于stack exchange,提问作者Juan Carlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:34