按照教程智能投射到 'CredentialsClient!' 是不可能的

Smart cast to 'CredentialsClient!' is impossible following turtorial

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

Smart cast to 'CredentialsClient!' is impossible, because 'mCredentialsClient' is a mutable property that could have been changed by this time

学习教程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) {

    }
}

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

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

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

mCredentialsClient?.let{
        it.request
    }

这里检查的是mCredentialsClient是否为null,如果mCredentialsClient为null则什么也不会发生,但是如果mCredentialsClient不为null则执行花括号内的函数。 请注意,在 let 函数块内,您将使用

it

作为

mCredentialsClient