Речь идет о плагине Flutter Firebase Authentication.
Я пытаюсь отправить письмо с подтверждением после создания нового пользователя, но sendEmailVerification () внутренне использует currentUser (). Мне это кажется ошибкой, но на всякий случай я отправляю вопрос в stackoverflow. Ошибка одинакова на Android и IOS.
Первые две строки возвращают FirebaseUser. Третий возвращает null. В-четвертых, если комментируется третий, выдается ошибка нулевой ссылки.
Спасибо,
Борис
user = await _auth.createUserWithEmailAndPassword(email: email, password: password);
// result is FirebaseUser
user = await _auth.signInWithEmailAndPassword(email: email, password: password);
// result is FirebaseUser
user = await _auth.currentUser();
// result is null
await user.sendEmailVerification();
//null reference, because it internally uses .currentUser()

Глядя на код firebase_auth, я вижу, что signInWithEmailAndPassword действительно создает и возвращает пользователя. Вероятно, это тот пользователь, с которым вам нужно вызвать в sendEmailVerification.
final user = await _auth.signInWithEmailAndPassword(email: email, password: password);
await user.sendEmailVerification();
Это действительно выглядит странно. Заглянув в плагин java, он вызывает firebaseAuth.signInWithEmailAndPassword, что означает, что должен быть установлен currentUser, если только не возникла проблема с входом в систему. Вы уверены, что пользователь существует и адрес электронной почты / пароль верны?
Если у вас есть существующий пользователь в Firebase, и после вызова _auth.signInWithEmailAndPassword с правильными учетными данными _auth.currentUser возвращает null, это ошибка.
Да, у меня нет проблем с аутентификацией с помощью signInWithEmailAndPassword и возвращением FirebaseUser. Я думаю, что это ошибка.
Вот что я обнаружил, и я не уверен, что это все еще ошибка или нет, но есть способ заставить ее работать. FirebaseUser, возвращаемый signInWithEmailAndPassword, на самом деле не аутентифицирован. Только пользователь, возвращенный потоком onAuthStateChanged, имеет значение. Итак, если вы вызываете user.sendEmailVerification () из контекста onAuthStateChanged, тогда все в порядке.
Это будет работать:
_firebaseUserChanged = _auth.onAuthStateChanged.listen((FirebaseUser user) {
if (user != null && !user.isEmailVerified) {
user.sendEmailVerification();
}
});
Конечно, этот код упрощен. Мы не хотим отправлять подтверждающее электронное письмо при каждой попытке входа в систему.
Что, если вы перезагрузите возвращенный FirebaseUser? Это сработало для меня.
const User currentUser = await auth.currentUser;
if (currentUser != null) {
await currentUser.reload();
}
Ясно упрощенный код. Примечание: auth.currentUser () теперь auth.currentUser.
Это именно то, что я написал в своем вопросе. Он действительно возвращает FirebaseUser, но как только вы вызываете для него sendEmailVerification (), вызов завершается ошибкой.