[Решено] Разрешены только безопасные (?.) Или ненулевые вызовы (!!.) На обнуляемом получателе типа AuthResult? - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь закодировать систему аутентификации пользователя. Но каждый раз, когда я получаю эту ошибку, "только безопасные (?.) Или ненулевые утвержденные (!!.) Вызовы разрешены для обнуляемого получателя типа AuthResult?"

FirebaseAuth.getInstance().createUserWithEmailAndPassword(email,password).addOnCompleteListener{

     if(!it.isSuccessful) return@addOnCompleteListener

     Log.d("Main","Successfully created user with uid: ${it.result.user.uid}")
}

Ответы [ 2 ]

3 голосов
/ 02 ноября 2019

Может показаться, что AuthResult? - это обнуляемый тип (возвращается из it.result / it.getResult()), который является фундаментальной концепцией Kotlin. Это означает, что компилятор не может гарантировать, что полученный AuthResult будет нулевым или нет, поэтому он говорит вам, что вы должны проверить себя.

Используя !!, вы говорите: «Я знаю,это не будет нулевым, просто заставьте его в необнуляемый тип ". Это может привести к NullPointerException.

Используя оператор ?., вы говорите, что если AuthResult не ноль, выполните эту операцию

0 голосов
/ 03 ноября 2019

Ответ Уильяма близок, но не совсем точен на 100%.

createUserWithEmailAndPassword () возвращает задание. Task.getResult () на самом деле аннотируется как возвращение @Nullable в Java следующим образом:

@Nullable
public abstract TResult getResult();

На мгновение игнорируя, имеет ли смысл в действительности определять его следующим образом,Это определение говорит Kotlin, что возвращаемое значение getResult() должно быть проверено на нулевое значение, прежде чем его можно будет безопасно использовать. Поэтому вам нужно как-то тщательно проверять результат перед вызовом его методов. Вот один способ, который явно проверяет:

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() на ноль, так как он также определен @Nullable. Обязательно проверьте в своей среде IDE типы и определения вещей, чтобы вы могли лучше понять их гарантии обнуляемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...