登出不适用于串流提供者

时间:2020-08-05 19:02:00

标签: firebase flutter firebase-authentication flutter-provider flutter-navigation

我正在用多个提供程序包装我的物料应用程序,其中之一是正在监听此getter的流提供程序。


 Stream<User> get user {
    return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
  }


 //create user object based on firebase user
  User _userFromFirebaseUser(FirebaseUser user) {
    return user != null
        ? User(uid: user.uid, email: user.email)
        : null;
  }

在这里,我基本上是基于Firebase用户创建自己的用户

class User with ChangeNotifier {
  final String uid;
  final String email;

  User({this.uid, this.email});
}

我有一个返回Authentication()或SectionWrapper()的包装器

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    return user == null ? Authentication() : SectionWrapper();
  }
}

在部分包装中,我有2个按钮可导航到应用程序的2个不同部分。

class SectionWrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).primaryColor,
      body: SizedBox.expand(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            CupertinoButton(
                color: Theme.of(context).accentColor,
                child: Text('Go to individual sells'),
                onPressed: () {
                  Navigator.pushReplacementNamed(
                      context, IndividualsTabsScreen.routeName);
                }),
            SizedBox(height: 10.0),
            CupertinoButton(
                color: Theme.of(context).accentColor,
                child: Text('Go to bookstores'),
                onPressed: () {
                  Navigator.pushReplacementNamed(
                      context, BookstoresTabsScreen.routeName);
                }),
          ],
        ),
      ),
    );
  }
}

登录功能与流提供程序配合正常。但是在退出时,UI不会更新,因为我将退出方法放在两个部分的抽屉中。我试图将“退出”按钮放在SectionWrapper()中,它确实起作用并通过更新UI(返回Authentication())退出,但是当我将其放入应用程序抽屉或其中一个部分的任何屏幕时,它退出,但用户界面不会更新。我还试图用一个消费者包装抽屉,但抽屉也不起作用。

在抽屉中,我尝试使用此

 Consumer<User>(
            builder: (ctx, user, _) => ListTile(
              title: Text('Sign Out'),
              leading: Icon(Icons.exit_to_app),
              onTap: () async {
                print(user.uid.toString()); //prints user id
                await _auth.signOut();
                print(user.uid.toString()); //also prints user id but i am expecting null value.
              },
            ),
          ),

当我在刷新应用程序之前使用该应用程序时uid = null,并且在刷新应用程序后,该应用程序显示身份验证屏幕。 您能帮我解决这个问题吗,我已经为这个问题苦苦挣扎了大约2个星期。

编辑:我厌倦了使用流生成器,最后遇到了同样的问题,该问题要求我刷新应用程序以显示身份验证小部件

class Wrapper extends StatelessWidget {
  static const String routeName = '/';
  @override
  Widget build(BuildContext context) {
//    final user = Provider.of<User>(context);

//    return user == null ? Authentication() : SectionWrapper();
//    return Authentication();

    return StreamBuilder<User>(
        stream: AuthService().user,
        builder: (context, snapshot) {
          if (snapshot.hasData)
            return SectionWrapper();
          else
            return Authentication();
        });
  }
}

问题肯定是由于导航器的缘故,因为我试图返回SectionWrapper()并在那里注销,所以发生了相同的问题

1 个答案:

答案 0 :(得分:0)

基本上,在注销用户后,您不会通知听众User的状态已更改。

在此处查看此tutorial。通过notifyListeners()方法,查看对象如何在对象发生更改时将新状态通知给侦听器。