75
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()
                })

        }
    }
  }
}

我尝试以正常方式制作吐司。但我得到了错误我尝试了很多倍数来源但失败了。

4

11 回答 11

147

2021 年 3 月更新:之前的答案已被弃用。您现在应该使用:

val context = LocalContext.current

上一个答案供参考:

您可以使用 define 访问上下文ambientContext

例子:

val context = ContextAmbient.current
于 2019-11-13T09:46:54.957 回答
31

ContextAmbient并且AmbientContext已弃用

您可以将它们替换为

val context = LocalContext.current
于 2021-02-12T13:56:30.820 回答
24

ContextAmbient.current自 起已弃用alpha-09

AmbientContext.current已弃用。我认为alpha-11.

LocalContext.current是您现在如何在可组合中获取上下文。

于 2020-12-23T19:30:46.500 回答
22

执行此操作的方法已更新。下雪了:

val context = LocalContext.current

LocalContext 文档

于 2020-03-09T20:50:14.900 回答
9

ContextAmbient.current已弃用,请val context = LocalContext.current改用。

于 2020-12-23T15:24:39.763 回答
4

LocalContext.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()
}
于 2021-07-05T10:48:07.707 回答
4

我认为你从来没有表现出Toast正常的方式。Jetpack Compose 使用自定义Kotlin编译器插件将这些可组合函数转换为应用程序的 UI 元素。例如,Text()函数由Compose UI library. Jetpack Compose 处于非常早期的开发阶段。您可以在下面的链接中查看带有示例和集成测试检查的 Jetpack 的所有 repo

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/ui

更新

现在 Jetpack 执行此操作的方式已更新。下雪了:

val context = LocalContext.current
于 2019-11-07T07:51:31.707 回答
4

在 jetpack compose 中获取上下文:

val context = ContextAmbient.current

在 0.1.0-dev14 上工作

如何在TOAST中使用它:

@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))
于 2020-06-25T11:41:25.800 回答
3

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

于 2021-02-24T21:31:22.100 回答
1

如果您需要从最后一个 Android Studio 模板获取上下文作为 Activity ,则有些有用:

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()
于 2021-11-20T00:29:53.300 回答
0
val context = LocalContext.current
Toast.makeText(context,"Hello Compose",Toast.LENGTH_LONG).show()
于 2021-04-16T19:59:19.657 回答