【问题标题】:Smart cast to 'CredentialsClient!' is impossible following turtorial智能投射到“凭据客户端!”按照教程是不可能的
【发布时间】:2020-07-10 11:21:11
【问题描述】:

我正在按照教程添加推荐的身份验证方法,但出现此错误:

智能转换为“CredentialsClient!”是不可能的,因为 'mCredentialsClient' 是一个可变属性,此时可能已更改

按照教程Smart Lock for Passwords on Android

我也在尝试使用 Kotlin(也是 Android 推荐的开发语言)

这是我的代码:

import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.auth.api.credentials.*
import com.google.android.gms.tasks.OnCompleteListener
import com.google.android.gms.tasks.Task


class new_MainActivity : AppCompatActivity(){
    var mCredentialsClient: CredentialsClient? = null
    var mCredentialRequest: CredentialRequest? = null

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main_login)

        mCredentialsClient = Credentials.getClient(this)

        mCredentialRequest = CredentialRequest.Builder()
                .setPasswordLoginSupported(true)
                .setAccountTypes(IdentityProviders.GOOGLE)
                .build()

        mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
                object : OnCompleteListener<CredentialRequestResponse?>() {
                    fun onComplete(@NonNull task: Task<CredentialRequestResponse?>) {
                        if (task.isSuccessful()) {
                            // See "Handle successful credential requests"
                            onCredentialRetrieved(task.getResult().getCredential())
                            return
                        }

                        // See "Handle unsuccessful and incomplete credential requests"
                        // ...
                    }
                })


    }

    private fun onCredentialRetrieved(credential: Any) {

    }
}

【问题讨论】:

    标签: android kotlin google-signin


    【解决方案1】:

    那是因为您使用 ? 定义了 mCredentialsClient 一个可为空的变量?操作员。 所以每次你想使用 mCredentialsClient 你应该检查它是否为空。 在使用 mCredentialsClient 字段之前执行此操作,您可以说:

    if(mCredentialsClient != null){
    //send request
    }
    

    或者如果您想以 kotlin 方式处理它,请使用 'let' 函数,如下所示:

    mCredentialsClient?.let{
            it.request
        }
    

    这里检查 mCredentialsClient 是否为空,如果 mCredentialsClient 为空,则不会发生任何事情,但如果 mCredentialsClient 不为空,则将执行大括号内的函数。 请注意,您将在 let 函数块中使用

    作为

    mCredentialsClient

    【讨论】:

    • 非常感谢。如果需要,我会尝试并跟进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多