首页 > 解决方案 > 注册或登录时 Flutter onAuthStateChanged 流未更新子项

问题描述

我将我的应用程序包装在 StreamProvider.value 中,其中值是 onAuthStateChanged 流,子项是主 MaterialApp。我的主要包装器使用 Provider.of 监听这个值。这适用于退出;一旦我退出,StreamProvider 就会通知我的主包装器,并且应用程序被重定向到欢迎屏幕。

但是,当我尝试创建帐户或登录时,似乎 StreamProvider 没有收到 onAuthStateChanged 流的通知。这就是为什么它如此奇怪,如果流不起作用,那么退出也不应该起作用。此外,当我热重启时,我会被重定向到主屏幕。我分散了互联网:没有运气。这是适当的代码:

在 main.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<FirebaseUser>.value(
      value: AuthService().userStream, 
      child: MaterialApp(
        home: Wrapper(),
        theme: ThemeData.light().copyWith(
          appBarTheme: AppBarTheme(color: Colors.lightBlue),
          scaffoldBackgroundColor: Colors.white,
        ),
      ),
    );
  }
}

在 wrapper.dart

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('Rebuilding');
    final user = Provider.of<FirebaseUser>(context);
    if (user == null) {
      return Welcome();
    } else {
      return Home();
    }
  }
}

在 auth_service.dart

class AuthService {
  FirebaseAuth _auth = FirebaseAuth.instance;

  Stream<FirebaseUser> get userStream {
    return _auth.onAuthStateChanged;
  }

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

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

  void signOut() {
    try {
      _auth.signOut();
    } catch (e) {
      print(e);
    }
  }
}

此外,在我的welcome.dart 中,我将其设置为测试:

onPressed: () {
  FirebaseAuth.instance.onAuthStateChanged
      .listen((event) {
    print('$event from .listen');
  });
}

这确实会在我每次登录、注销或注册时通知我,这告诉我 onAuthStateChanged 或我的设置方式没有任何问题。

如果您需要更多信息,请告诉我。我不想再提这个问题了。谢谢您的帮助!

标签: flutterdartfirebase-authenticationflutter-provider

解决方案


推荐阅读