Я создаю флаттер-приложение с аутентификацией firebase, работающее с пользователями. Моя цель - упростить взаимодействие с пользователем, позволяя регистрироваться и проверять электронную почту, не вынуждая пользователя выходить из системы и снова входить в систему, чтобы использовать все функции. Перед тестированием с реальными пользователями это именно то, что я настроил, но подавляющая обратная связь заключается в том, что он прерывает и может даже заставить пользователя вообще отказаться от процесса аутентификации; приложение должно просто обнаружить это изменение в статусе проверки без выхода из системы.
ЧТО Я ПРОБОВАЛ
Я использую следующее в main.dart для предоставить состояние аутентификации во всем приложении:
StreamProvider < FirebaseUser > .value(
value: FirebaseAuth.instance.onAuthStateChanged,
),
Я извлекаю его с помощью user1 = Provider.of<FirebaseUser>(context, listen: true);
на отдельных страницах и получаю доступ к различным свойствам, таким как user1.isEmailVerified в троичных выражениях, чтобы определить, что отображается для Пользователь.
Я знаю, что onAuthStateChanged не вызывается для изменений в проверке электронной почты, только для входа в систему и выхода из нее, как объяснено в принятом ответе на этот вопрос , но мне все еще нужно обновите значение пользователя, определяющее пользовательский интерфейс, который отображается, когда пользователь проверяет свою электронную почту. Я решил использовать кнопку «полная проверка электронной почты», которая будет вручную запускать проверку и перезагрузку профиля пользователя с новым значением после проверки. Вот код этой кнопки:
() async {
// 1
FirebaseUser user =
await _firebaseAuth.currentUser();
print(user.isEmailVerified); // returns false
// 2
await user.getIdToken();
print(user.isEmailVerified);// returns false
// 3
await user.reload();
print(user.isEmailVerified);// returns false
//4
user = await _firebaseAuth.currentUser();
print(user.isEmailVerified);// this finally returns true
}
где final _firebaseAuth = FirebaseAuth.instance;
Я заметил, что вызов .currentUser () дважды (до и после reload ()) - это единственный способ действительно вернуть true для свойства .isEmailVerified без выхода из системы и повторного входа. Это ответ, который я находится в этой ветке GitHub .
Если я снова нажму кнопку, все приведенные выше операторы печати вернут истину.
ПРОБЛЕМА
Это здорово, но проблема заключается в пользователе1 Переменная, в которой хранится поток FirebaseUser, не изменяется и не обновляется даже после этого, поэтому пользовательский интерфейс остается неизменным, несмотря на проверку электронной почты пользователя. Я знаю это, потому что я поместил в код следующие проверки:
print('this one is from the stream:');
print(user1.isEmailVerified);
Он по-прежнему возвращает false, даже когда в теле функции кнопки user.isEmailVerified возвращает true.
Я пытался вызвать состояние установки внутри кнопки следующим образом:
setState(() {user1 = user; });
Но кажется, что значение user1 остается прежним и возвращает false для user1.isEmailVerified, хотя я пытаюсь установить для него новое значение, полученное из функции кнопки!
Это действительно расстраивает, поскольку я чувствую, что я очень близок, но я просто не знаю, как обновить sh значение user1 (пользовательский поток firebase) во всем приложении или даже только на одном экране. Это должно быть более простым.
Я заметил, что нажатие горячей перезагрузки после проверки электронной почты и нажатия кнопки выше автоматически покажет обновленное значение .isEmailVerified во всем приложении во время отладки при флаттере. Есть ли способ программно инициировать тот же вид перестроения, который использует горячая перезагрузка, который также обновит sh данные пользовательского потока firebase БЕЗ выхода из системы и повторного входа? Может быть, именно в этом и заключается ответ, но я не знаю, как поступить с этим.
Буду признателен за любую помощь.