跨Flutter TabView更新当前的FirebaseUser

时间:2019-01-25 17:05:09

标签: firebase flutter firebase-authentication

假设我的主页有4个标签。选项卡之一是使用Firebase登录的登录页面,另外三个选项卡需要知道用户是登录用户还是访客。

下面是有状态首页的代码。

Widget build(BuildContext context) {
    FirebaseAuth.instance.onAuthStateChanged.listen((FirebaseUser user) {
      currentUser = user;
    });

    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          isScrollable: true,
          tabs: allTabs,
          controller: _tabController,
        ),
        title: Text(
          "app title",
        ),
      ),
      body: TabBarView(
        children: <Widget>[
          ItemsList(currentUser),
          CategoriesList(),
          currentUser == null ? LoginPage() : ProfileWidget(),
          NewsfeedWidget(currentUser ),
          ItemsList(currentUser , showOnlyFav),
          AboutUs(),
        ],
        controller: _tabController,
      ),
    );
  }

问题:

即使从登录页面成功登录,其他选项卡也无法反映当前用户。 currentUser值始终为null。

当登录/注销时,我应该如何使登录详细信息立即更新到所有页面?

更新:我尝试将TabBarView包装在StreamBuilder中。但还是一样,页面也经常刷新。

1 个答案:

答案 0 :(得分:1)

您可以基于FirebaseAuth的流将当前代码包装在StreamBuilder中。这样,只要登录状态更改,您的布局就可以访问用户:

Widget build(BuildContext context) {    
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          isScrollable: true,
          tabs: allTabs,
          controller: _tabController,
        ),
        title: Text(
          "app title",
        ),
      ),
      body: 
      StreamBuilder<FirebaseUser>(
        stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (ctx, snapshot) {
          return TabBarView(
            children: <Widget>[
              ItemsList(snapshot.data),
              CategoriesList(),
              snapshot.data == null ? LoginPage() : ProfileWidget(),
              NewsfeedWidget(snapshot.data),
              ItemsList(snapshot.data , showOnlyFav),
              AboutUs(),
            ],
          controller: _tabController,
      ),}
    );
  }