Android Compose 中获取和使用 Context 的完备指南

[复制链接]
发表于 2025-4-8 20:47:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 Android Jetpack Compose 中,固然大多数 UI 组件不再需要直接使用 Context,但有时你仍然需要访问它来执行一些 Android 平台特定的操纵。以下是几种在 Compose 中获取和使用 Context 的方法:
1. 使用 LocalContext
这是 Compose 中最常用的获取 Context 的方式:
  1. @Composable
  2. fun MyComposable() {
  3.     val context = LocalContext.current
  4.    
  5.     Button(onClick = {
  6.         Toast.makeText(context, "Hello from Compose!", Toast.LENGTH_SHORT).show()
  7.     }) {
  8.         Text("Show Toast")
  9.     }
  10. }
复制代码
2. 通过参数传递 Context
对于可测试性和明确性,你可以选择将 Context 作为参数传递:
  1. @Composable
  2. fun MyComposable(context: Context) {
  3.     // 使用 context
  4. }
复制代码
3. 在非 @Composable 函数中获取 Context
如果你需要在非 Composable 函数中访问 Context,可以通过参数传递:
  1. fun nonComposableFunction(context: Context) {
  2.     // 使用 context
  3. }
  4. @Composable
  5. fun WrapperComposable() {
  6.     val context = LocalContext.current
  7.     nonComposableFunction(context)
  8. }
复制代码
常见使用场景
表现 Toast:
  1. Toast.makeText(context, "Message", Toast.LENGTH_SHORT).show()
复制代码
启动 Activity:
  1. context.startActivity(Intent(context, MyActivity::class.java))
复制代码
访问资源:
  1. val string = context.getString(R.string.app_name)
复制代码
系统服务:
  1. val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
复制代码
注意事项
避免在 Composable 函数中长时间持有 Context 引用,这可能导致内存走漏
对于资源访问,Compose 提供了更直接的替代方案,如 stringResource(R.string.app_name)
在主题和样式方面,Compose 有自己的系统,通常不需要直接使用 Context
其他相关的 Local 对象
除了 Context,Compose 还提供了其他有用的 Local 对象:
  1. val activity = LocalActivity.current
  2. val configuration = LocalConfiguration.current
  3. val resources = LocalResources.current
复制代码
这些都可以在需要时通过雷同的模式获取。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表