在类型为AuthResult的可为空的接收器上仅允许安全(?。)或非空声明(!!。)调用。

时间:2019-11-02 20:51:24

标签: android firebase kotlin firebase-authentication

我正在尝试对用户身份验证系统进行编码。但是,每次出现此错误时,“在AuthResult类型的可为空的接收器上只允许安全(?。)或非空声明(!!。)调用吗?”

error: bundling failed: Error: Unable to resolve module `react-native-device-info` from `App.js`: react-native-device-info could not be found within the project.

2 个答案:

答案 0 :(得分:3)

看来AuthResult?是可空类型(从it.result / it.getResult()返回),它是Kotlin的基本概念。这意味着编译器无法保证结果AuthResult是否为null,因此它告诉您必须进行检查。

您使用!!时说:“我知道这不会为空,只需将其强制为不可为空的类型”。这可能会带来NullPointerException

使用?.运算符,是说如果AuthResult不为空,请执行此操作

答案 1 :(得分:0)

威廉姆斯的答案很接近,但并非100%准确。

createUserWithEmailAndPassword()返回一个任务。实际上,Task.getResult()被注释为在Java中返回@Nullable,如下所示:

@Nullable
public abstract TResult getResult();

暂时忽略这样定义是否有意义,此定义告诉Kotlin:getResult()的返回值需要先检查是否为null,然后才能安全使用。因此,您需要在调用其方法之前以某种方式保护检查结果。这是一种显式检查的方法:

val result = it.result  // Kotlin says result is of type "AuthResult?"
if (result != null) {
    val user = result.user   // Kotlin says user is of type "FirebaseUser?"
    if (user != null) {
        Log.d("Main", "Successfully created user with uid: ${user.uid}")
    }
}

同样也不必检查result.getUser()是否为null,因为它也已定义为@Nullable。请确保在您的IDE中检查事物的类型和定义,以便您可以更好地了解它们的可空性保证。