#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. Это не работает, но все равно спасибо!. Я обнаружил, что моя проблема в том, что я не должен использовать маршруты, одновременно используя поставщиков, в этом случае поставщик «ограничен».