【问题标题】:flutter firebase auth provider not notified颤动的firebase身份验证提供者未通知
【发布时间】:2021-05-25 13:29:42
【问题描述】:

我正在使用颤振进行登录并使用电子邮件注册。我的登录方法工作正常,我的注册(注册)方法基本相同,所以它们应该有相同的结果,但是注册函数中用户状态的变化不会通知包装器中的提供者,所以它无法切换到主屏幕。

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

我相信这可能意味着用户状态已更改,但登录时会打印“包装器”+用户;在注册功能中它不会,这意味着包装器中的提供者没有收到更改,并且无法显示主屏幕。谁能告诉我哪里做错了?

【问题讨论】:

  • 热重载后也可以显示主屏幕,这意味着用户状态确实发生了变化,只是没有及时显示在包装器中

标签: flutter firebase-authentication flutter-provider


【解决方案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

【讨论】:

  • 这不起作用,但还是谢谢你!我发现我的问题是我不应该在使用提供程序的同时使用路由,在这种情况下,提供程序是“范围的”。
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2014-04-07
  • 2018-10-31
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多