使用 Compose 在 onCreate() 之外注册 ForActivityResult()
registerForActivityResult() outside onCreate() with Compose
所以我正在尝试启动意图 Intent.ACTION_OPEN_DOCUMENT
。我首先尝试使用 startActivityForResult
但我注意到它已贬值,所以我试图找到另一种方法来做到这一点。所以我找到了 registerForActivityResult
方法,但事实证明它必须在 onCreate() 完成后 运行 :
Note: While it is safe to call registerForActivityResult() before your fragment or activity is created, you cannot launch the ActivityResultLauncher until the fragment or activity's Lifecycle has reached CREATED.
由于我使用的是 Jetpack Compose 并且 setContent 在 onCreate() 中,所以我的 Activity 实际上从未完成创建,因为我的所有可组合函数都在 运行 的 Main[=20= 的 setContent 中]
那么我该如何实现呢?
使用最新版本的 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 {
//...
}
所以我正在尝试启动意图 Intent.ACTION_OPEN_DOCUMENT
。我首先尝试使用 startActivityForResult
但我注意到它已贬值,所以我试图找到另一种方法来做到这一点。所以我找到了 registerForActivityResult
方法,但事实证明它必须在 onCreate() 完成后 运行 :
Note: While it is safe to call registerForActivityResult() before your fragment or activity is created, you cannot launch the ActivityResultLauncher until the fragment or activity's Lifecycle has reached CREATED.
由于我使用的是 Jetpack Compose 并且 setContent 在 onCreate() 中,所以我的 Activity 实际上从未完成创建,因为我的所有可组合函数都在 运行 的 Main[=20= 的 setContent 中]
那么我该如何实现呢?
使用最新版本的 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 {
//...
}