如何使用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()
    )
}


以上是如何使用JetpackCompose处理Activity.onActivityResult()?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>