【问题标题】:How to get Context in Jetpack Compose如何在 Jetpack Compose 中获取上下文
【发布时间】:2020-03-03 17:27:47
【问题描述】:
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()
                })

        }
    }
  }
}

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

【问题讨论】:

  • 你添加了“@Composable”注解吗?
  • 是的。 @Composable 注解
  • 您可能想准确解释您的问题是什么。我在 Compose 中的 onClick 处理程序中使用了 Toast 没有问题。如果您遇到编译错误,请提供错误的完整详细信息。如果您遇到运行时错误,请编辑您的问题并发布堆栈跟踪。
  • 仅供参考:虽然以下答案是有效的,但撰写团队现在建议在 Compose 中使用 Snackbar 而不是 Toastkotlinlang.slack.com/archives/CJLTWPH7S/…

标签: android kotlin android-jetpack android-jetpack-compose


【解决方案1】:

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

val context = LocalContext.current

上一个答案供参考:

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

示例:

val context = ContextAmbient.current

【讨论】:

  • compose 是声明性的并且作为树,所以如果你有复杂的树并且你需要一些无法从根组件提供的状态,你可以使用环境或备忘录
  • 是否有任何文档解释了这个 unaryPlus 运算符的使用?我找不到任何可靠的东西来理解它是什么以及如何使用它@Raka
  • 当我添加 val context = +ambient(ContextAmbient) 到 Clickable 然后得到 java.lang.IllegalStateException: Composition requires an active composition context
  • 请展示你的代码(by gist.github.com)@AlexZezekalo
  • @RakaAdiNugroho 我发现我使用了错误的位置来获取上下文:首先我在 Clickable 中编写了 val context = +ambient(ContextAmbient) 和这就是那个例外的原因。然后我把这条线从 <i>Clickable</i> 放到函数的头部,一切都变好了。我的错。
【解决方案2】:

ContextAmbientAmbientContext 已弃用

您可以将它们替换为

val context = LocalContext.current

【讨论】:

    【解决方案3】:

    ContextAmbient.currentalpha-09 起已弃用。

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

    LocalContext.current 是您现在在可组合中获取上下文的方式。

    【讨论】:

      【解决方案4】:

      执行此操作的方法已更新。现在是:

      val context = LocalContext.current
      

      LocalContext docs

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          你需要创建单独的函数来使用上下文

          示例代码

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

          【讨论】:

            【解决方案7】:

            在 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))
            

            【讨论】:

              【解决方案8】:

              我认为您永远不会以正常方式显示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
              

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

                  如果您需要从最后一个 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()
                  

                  【讨论】:

                  • 不安全,因为上下文可能不是活动。
                  • @EmadRazavi 同意,我更新了答案
                  【解决方案11】:
                  val context = LocalContext.current
                  Toast.makeText(context,"Hello Compose",Toast.LENGTH_LONG).show()
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2022-01-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-10-15
                    • 2022-11-02
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-07
                    相关资源
                    最近更新 更多