我正在尝试对用户身份验证系统进行编码。但是,每次出现此错误时,“在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.
答案 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中检查事物的类型和定义,以便您可以更好地了解它们的可空性保证。