如何使用JetpackCompose处理Activity.onActivityResult()?
我正在尝试使用 Jetpack Compose 在我的 Android 应用程序中实现登录提示,但此 API 需要一个Activity才能工作。
fun showPhoneNumberHint(activity: Activity) {
val hintRequest: HintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Auth.CredentialsApi.getHintPickerIntent(apiClient, hintRequest)
val requestCode = 12345
try {
startIntentSenderForResult(activity, intent.intentSender, requestCode, null, 0, 0, 0, null)
} catch (exception: SendIntentException) {
// Error handling
}
}
所以我想我必须将 Activity 对象一直传递到需要它的 Composable ,这看起来不是很干净,但它应该可以工作。
但是现在提示的结果将在 Activity 中收到onActivityResult(),我不确定将它返回到需要它的 Composable 的正确方法是什么。
有没有一些干净/标准/替代的方法来做到这一点?最好我只是将所有这些逻辑包含在 Composable 中。
回答
我最终rememberLauncherForActivityResult结合 ActivityResultContracts.StartIntentSenderForResult()合同使用来听取结果。这将返回launcher可用于启动意图的 。
相反的Auth.CredentialsApi,这就要求弃用GoogleApiClient,现在,我使用的Credentials.getClient。为此,我仍然需要Activity使用LocalContext.current.
val phoneNumberHintLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartIntentSenderForResult()
) {
if (it.resultCode != RESULT_OK) {
return@rememberLauncherForActivityResult
}
val credential: Credential? = it.data?.getParcelableExtra(Credential.EXTRA_KEY)
val hintResult = credential?.id
if (hintResult !== null) {
phoneNumber = hintResult
}
}
val context = LocalContext.current
LaunchedEffect(Unit) {
val hintRequest: HintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val phoneNumberHintIntent = Credentials.getClient(context)
.getHintPickerIntent(hintRequest)
phoneNumberHintLauncher.launch(
IntentSenderRequest.Builder(phoneNumberHintIntent)
.build()
)
}
THE END
二维码