провайдер аутентификации flutter firebase не уведомлен

Я использую flutter для входа и регистрации по электронной почте. Мой метод входа в систему работает нормально, и мой метод регистрации (регистрации) в основном такой же, поэтому они должны иметь тот же результат, но изменения статуса пользователя в функции регистрации не уведомляют поставщика в оболочке, поэтому он не может перейти на главный экран.

В AuthService код такой:

final FirebaseAuth _auth = FirebaseAuth.instance;

  Stream<User> get user {
print(_auth.authStateChanges());
return _auth.authStateChanges();
}

Future signInWithEP (String email, String password) async {
try{
  UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
  User user = result.user;
  return user;
} catch (e) {
  print(e.toString());
  return null;
}
}

Future signUpWithEP(String email, String password) async {
try{
  UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
  User user = result.user;
  return user;
} catch (e) {
  print(e.toString());
  return null;
}
}

В main.dart

return MultiProvider(
  providers: [
    StreamProvider<User>.value(
      value: AuthService().user,
    ),
    ],
  child: MaterialApp(
      home: Wrapper(),
      routes: {
        '/signin': (context) => SignIn(),
        '/register': (context) => Register(),
      },
    ),

В wrapper.dart,

Widget build(BuildContext context) {

final user = Provider.of<User>(context);
print("wrappper $user");

if(user == null) {
  return SignIn();
} else {
  return Home();
}
}

В обоих случаях (вход и регистрация) при нажатии на кнопку будет отображаться

D/FirebaseAuth( 4977): Notifying id token listeners about user ( some UID ).
D/FirebaseAuth( 4977): Notifying auth state listeners about user ( some UID ).

что, я полагаю, вероятно, означает изменение статуса пользователя, но при входе в систему он напечатает оболочку + пользователь; в функции регистрации этого не произойдет, что означает, что провайдер в оболочке не получит изменения, и главный экран не может быть отображен. Может ли кто-нибудь сказать мне, где я сделал не так?


person Winnieeee    schedule 23.02.2021    source источник
comment
Также после горячей перезагрузки может отображаться домашний экран, что означает, что статус пользователя действительно изменяется, но просто не отображается вовремя в оболочке.   -  person Winnieeee    schedule 23.02.2021


Ответы (1)


Я думаю, что вы забыли notifyListeners () в своих методах

Future signInWithEP (String email, String password) async {
try{
  UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
  User user = result.user; 
notifyListeners(); // add here notify 
  return user;
} catch (e) {
  print(e.toString());
  return null;
}

и тут

final user = Provider.of<User>(context) 

измените это на

final user =  context.watch<AuthUser>().user
person Fatima ayaa    schedule 23.02.2021
comment
Это не работает, но все равно спасибо !. Я обнаружил, что моя проблема в том, что я не должен использовать маршруты при одновременном использовании провайдеров, в этом случае провайдер ограничен. - person Winnieeee; 28.02.2021