- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
我看到的问题是您必须保证在您自己的 Activity 的 OnCreate() 完成之前调用 registerForActivityResult() 。 OnCreate() 显然不是挂起函数,所以我
最近我根据这个更新了我对activity-ktx的依赖 https://developer.android.com/jetpack/androidx/releases/activity#1.2.0 但
我最近迁移到用于注册请求权限的最新回调机制但是从未触发用于注册请求回调的最新 api 我正在附加代码 fragment ,任何人都可以帮助我找出问题所在, @AndroidEntryP
我尝试使用新的 registerForActivityResult 拍照。我可以打开相机 Intent ,但拍照后,没有触发回调,我看不到任何关于 Activity 结果或 logcat 错误的信息。
如何将此蓝牙 Activity 从 startActivityForResult 更改为 registerForActivityResult?请帮助我,因为我是 java 和 Android Stud
我需要在我的 webviewActivity 中实现选择文件选项,我发现的所有教程都只有带有 startActivityResult 的示例,但它目前已被弃用,所以我想要一些关于如何将此代码转换为新模
因为startActivityForResult已弃用。 所以我替换 startActivityForResult至registerForActivityResult这是我的代码: ActivityR
我正在使用 ActivityResultLauncher 从 Activity A 调用 Activity B并在任务完成时设置 Activity B 的结果。如果方向没有改变,这将非常有效。问题是当
我正在尝试使用此处所述的 ActivityResult API ActivityResult APIs 但它给出了 Unresolved reference 错误。 我正在使用以下依赖项 api 'a
我有一个简单的空 Activity 来检查是否需要请求权限。当registerForActivityResult被调用,它会崩溃并出现错误 java.lang.IllegalStateExceptio
我正在编写一个 Kotlin 应用程序并使用 Firebase 进行身份验证。 如onActivityResult现在已弃用,我正在尝试迁移我的应用程序以使用 registerForActivityR
我用 registerForActivityResult就像 : package com.example.livedata import android.Manifest import android
ActivityResultLauncher launcherImportFileSelection = requireActivity().registerForActivityResult(...
初始问题 (18/05/2020): 所以最新的更新来自 androidx.fragment:fragment:1.3.0- alpha07 到 androidx.fragment:fragment:
我是一名优秀的程序员,十分优秀!