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

#flutter #firebase-authentication #flutter-provider

#flutter #firebase-аутентификация #поставщик flutter

Вопрос:

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

В 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 ).
 

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

Комментарии:

1. Также после горячей перезагрузки может отображаться начальный экран, что означает, что статус пользователя действительно изменен, но просто не отображается своевременно в оболочке

Ответ №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
 

Комментарии:

1. Это не работает, но все равно спасибо!. Я обнаружил, что моя проблема в том, что я не должен использовать маршруты, одновременно используя поставщиков, в этом случае поставщик «ограничен».