使用 Compose 在 onCreate() 之外注册 ForActivityResult()

Sca*_*eer 5 android android-intent android-jetpack-compose

所以我正在尝试启动这个意图Intent.ACTION_OPEN_DOCUMENT。我第一次尝试,startActivityForResult但我注意到它已经贬值了,所以我试图找到另一种方法来做到这一点。所以我找到了该registerForActivityResult方法,但事实证明它必须在 onCreate() 完成后运行:

注意:虽然在创建片段或活动之前调用 registerForActivityResult() 是安全的,但在片段或活动的生命周期达到 CREATED 之前,您无法启动 ActivityResultLauncher。

由于我使用的是 Jetpack Compose 并且 setContent 位于 onCreate() 中,所以我的 Activity 实际上从未完成创建,因为我所有的可组合项函数都在 MainActivity 的 setContent 中运行

那么我怎样才能做到这一点呢?

Gab*_*tti 13

使用最新版本的 Activity-compose,您可以用来rememberLauncherForActivityResult()注册对Activity#startActivityForResult.

就像是:

val result = remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
    result.value = it
}

Button(onClick = { launcher.launch(arrayOf("application/pdf")) }) {
    Text(text = "Open Document")
}

result.value?.let {
   //...
}
Run Code Online (Sandbox Code Playgroud)