How to get Context in Jetpack Compose

fun createListItem(itemIndex: Int) {
Padding(left = 8.dp, right = 8.dp, top = 8.dp, bottom = 8.dp) {
FlexRow(crossAxisAlignment = CrossAxisAlignment.Center) {
expanded(1.0f) {
Text("Item $itemIndex")
}
inflexible {
Button(
"Button $itemIndex",
style = ContainedButtonStyle(),
onClick = {
Toast.makeText(
this@MainActivity,
"Item name $itemIndex",
Toast.LENGTH_SHORT
).show()
})
}
}
}
}

I try to make Toast in a normal way. but I got the error I tried a lot of multiples source but failed.

60187 次浏览

不推荐使用 ContextAmbientAmbientContext

更新

现在喷气背包做这件事的方法已经被更新了,现在是:

val context = LocalContext.current

更新于2021年3月: 之前的答案已被否决,现在应该使用:

val context = LocalContext.current

以上答案供参考:

可以通过定义 ambientContext访问上下文。

例如:

val context = ContextAmbient.current

这个方法已经更新了,现在是:

val context = LocalContext.current

LocalContext 文档

了解喷气背包的背景:

val context = ContextAmbient.current

正在处理0.1.0-dev14

如何在 干杯中使用:

@Composable
fun cardViewImplementer(item: Int) {
val context = ContextAmbient.current
Card(
shape = RoundedCornerShape(10.dp),
modifier = Modifier.padding(10.dp)
) {
Box(
modifier = Modifier
.fillMaxWidth()
.drawShadow(5.dp)
.clickable(onClick = {
Toast.makeText(context, "Clicked $item", Toast.LENGTH_SHORT).show()
}), children = {


})
}

访问 资源:

Text("Read this string: "+context.getString(R.string.name))

已不推荐使用 ContextAmbient.current,改为使用 val context = LocalContext.current

alpha-09开始就不推荐使用 ContextAmbient.current

不推荐使用 AmbientContext.current ,我认为从 alpha-11开始。

LocalContext.current是现在获得可组合上下文的方法。

ContextAmbientAmbientContext已被弃用。

你可以用 LocalContext代替它们

例如:

val context = LocalContext.current

compose_version = '1.0.0-alpha12'的问题? AmbientContext现在是 LocalContext

val context = LocalContext.current
Toast.makeText(context,"Hello Compose",Toast.LENGTH_LONG).show()

Current-是正确的方法,但问题是你 不能在@Composable 函数中使用 LocalContext.current

您需要创建单独的函数来使用 Context

样本代码

@Composable
fun DoneButton() {
val context = LocalContext.current
Button(onClick = { showToast(context, "Button clicked")}) {
Text(name = "Done")
}
}


fun showToast(context: Context, msg: String) {
Toast.makeText(context, msg, Toast.LENGTH_LONG).show()
}

如果你需要从上一个 Android Studio 模板中获取活动的上下文,那么一些有用的东西:

val view = LocalView.current
(view.context as Activity).<activity method>

更好的解决办法

fun Context.getActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.getActivity()
else -> null
}


val activity = LocalContext.current.getActivity()

你可使用 LocalUriHandler:

val handler = LocalUriHandler.currenthandler


Button(
onClick = { handler.openUri("https://www.stackoverflow.com") }
) {
Text("Open")
}