如何使用 Jetpack Compose 通过单击按钮以编程方式打开外部 URL?

dsh*_*dev 43 android onclick kotlin android-jetpack-compose

如何使用 Jetpack Compose 通过单击按钮以编程方式打开外部 URL?

@Composable
fun MyButton() {
  Button(onClick = {
    //enter code here
  })
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*uke 112

一个更简单的替代方法是使用LocalUriHandler

val uriHandler = LocalUriHandler.current
uriHandler.openUri(uri)
Run Code Online (Sandbox Code Playgroud)

保持简短而甜蜜

  • @Kukiwon您需要在`onClick`处理程序之外提升`val uriHandler = LocalUriHandler.current`。然后你应该能够从你的处理程序中调用 `uriHandler.openUri(uri)` (6认同)
  • 请注意,这在“onClick”处理程序中不起作用。当访问 `onClick` 处理程序内的 `LocalUriHandler` 时,我收到错误:“@Composable 调用只能在 @Composable 函数的上下文中发生”。` (2认同)

pau*_*aap 24

这是一种可能的方法:

@Composable
fun MyButton() {
    val context = LocalContext.current
    val intent = remember { Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com/")) }

    Button(onClick = { context.startActivity(intent) }) {
        Text(text = "Navigate to Google!")
    }
}
Run Code Online (Sandbox Code Playgroud)

在 @Composable 函数内部,有一个叫做“Composition Locals”的东西。

CompositionLocal 类允许通过可组合函数隐式地将数据传递给其可组合后代

LocalContext 就是这些类之一。指定的 Intent 是 Android 上打开外部 URL 的常用方法。


Kuk*_*won 10

我发现访问处理LocalUriHandler.current程序内部onClick会引发错误:"@Composable invocations can only happen from the context of a @Composable function"

我通过将这行代码移到按钮之外解决了这个问题:

val uriHandler = LocalUriHandler.current
Button(onClick = {
    uriHandler.openUri(...)
) {
    // Your label goes here
}
Run Code Online (Sandbox Code Playgroud)