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,步骤如下:
- 添加Navigation Compose依赖(在app模块的
build.gradle.kts中):
dependencies { implementation("androidx.navigation:navigation-compose:2.7.7") }
- 定义路由并设置导航宿主:
先创建路由密封类:
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 } } } } } }
- 修改
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
相关产品推荐
相关产品推荐

