gpt4 book ai didi

kotlin - 如何将 registerForActivityResult 与 StartIntentSenderForResult 契约(Contract)一起使用?

转载 作者:行者123 更新时间:2023-12-04 07:23:35 24 4
gpt4 key购买 nike

我正在编写一个 Kotlin 应用程序并使用 Firebase 进行身份验证。
onActivityResult现在已弃用,我正在尝试迁移我的应用程序以使用 registerForActivityResult .我有一个指向 Google 帐户功能的链接,它以 Google 登录流程开始,如图所示 here .我的代码:

    private fun initGoogleSignInClient() =
activity?.let {

// Configure Google Sign In
val gso =
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()

// Build a GoogleSignInClient with the options specified by gso.
viewModel.googleSignInClient = GoogleSignIn.getClient(it, gso)
}

private fun showLinkWithGoogle() =
startActivityForResult(viewModel.googleSignInClient.signInIntent, RC_LINK_GOOGLE)
在哪里 initGoogleSignInClient在片段的 onCreateView 中调用, 和 showLinkWithGoogle当用户点击屏幕上的按钮时调用。这完美地工作。
我用 registerForActivityResult 找了一个例子,而我找到的最好的是在 this 的底部页。我添加了这段代码:
    private val linkWithGoogle =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
viewModel.handleGoogleResult(it.data)
}

private fun showLinkWithGoogle() =
linkWithGoogle.launch(IntentSenderRequest.Builder(viewModel.googleSignInClient.signInIntent))
但意识到 IntentSenderRequest.Builder需要 IntentSender而不是 Intent .我还没有找到任何关于如何构建 IntentSender 的示例来自 Intent ,也没有办法从我的 GoogleSignInClient .
谁能提供一个完整的使用示例 registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) ?
非常感谢你!

最佳答案

对于这个用例,您不需要 ActivityResultContracts类型 StartIntentSenderForResult但类型之一 StartActivityForResult .这是一个示例(因为您没有提供完整的实现):
分段

private val googleRegisterResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
result.checkResultAndExecute {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
val account = task.getResult(ApiException::class.java)
loginViewModel.onEvent(LoginRegistrationEvent.SignInWithGoogle(account))
}.onFailure { e -> toast("Error: ${e.message}") }
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
myGoogleSignInButton.setOnClickListener {
googleRegisterResult.launch(viewModel.googleSignInClient.signInIntent)
}
}
然后,在您的 View 模型中,您可以像往常一样处理登录,唯一的区别是,您不再需要 RC_SIGN_IN View 模型示例
class YourViewModel : ViewModel() {
fun onEvent(event: LoginRegistrationEvent) {
when(event) {
is LoginRegistrationEvent.SignInWithGoogle -> {
viewModelScope.launch {
val credential = GoogleAuthProvider.getCredential(event.account.idToken)
Firebase.auth.signInWithCredential(credential).await()
}
}
}
}
}
为了让我的生活更轻松,我创建了一个扩展函数,它检查登录是否成功,然后执行一段代码(在这种情况下,获取帐户),同时缓存任何异常。此外,在您的 block 中,您可以访问 ActivityResult 的实例为 this :
inline fun ActivityResult.checkResultAndExecute(block: ActivityResult.() -> Unit) =
if (resultCode == Activity.RESULT_OK) runCatching(block)
else Result.failure(Exception("Something went wrong"))

关于kotlin - 如何将 registerForActivityResult 与 StartIntentSenderForResult 契约(Contract)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68346074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com