0

我在 Firebase 中有这个身份验证代码:

auth.signInWithCredential(credential).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val firebaseUser = auth.currentUser!!
        val user = User(firebaseUser.uid, firebaseUser.displayName!!) //KotlinNullPointerException
    } 
}

这是我的用户类:

data class User constructor(var uid: String? = null): Serializable {
    var name: String? = null

    constructor(uid: String, name: String) : this(uid) {
        this.name = name
    }
}

KotlinNullPointerException在突出显示的行上得到了一个。构造函数的调用怎么会产生这个异常呢?我怎样才能避免它?

4

2 回答 2

2

只需像这样声明你的类:

data class User(var uid: String? = null, var name: String? = null) : Serializable

然后你可以这样称呼它:

auth.signInWithCredential(credential).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        auth.currentUser?.apply {  // safe call operator, calls given block when currentUser is not null
            val user = User(uid, displayName)
        }
    } 
}

可以像这样创建 User 的实例:

User() // defaults to null as specified
User("id") // only id is set, name is null
User(name = "test-name") // only name is set id is null

= null完全允许调用可选地传递参数,当不传递时默认为null.

编辑:正如@GastónSaillén 所建议的,您应该在 Android 中使用 Parcelable。

@Parcelize
data class User(var uid: String? = null, var name: String? = null) : Parcelable
于 2020-06-09T14:16:33.283 回答
0

您可以像这样处理 Kotlin 中的可为空字段:

val user = auth.currentUser?.let { firebaseUser -> 
   firebaseUser.displayName?.let { displayName -> 
      User(firebaseUser.uid,  displayName)
   }
}

操作员!!非常危险,在大多数情况下应避免使用

于 2020-06-09T14:12:45.440 回答