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