在 Android Jetpack Compose 中,雖然大多數 UI 組件不再需要直接使用 Context,但有時你仍然需要訪問它來執行一些 Android 平臺特定的操作。以下是幾種在 Compose 中獲取和使用 Context 的方法:
1. 使用 LocalContext
這是 Compose 中最常用的獲取 Context 的方式:
@Composable
fun MyComposable() {val context = LocalContext.currentButton(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.currentnonComposableFunction(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
這些都可以在需要時通過類似的模式獲取。