【问题标题】:Updating Current FirebaseUser across Flutter TabView跨 Flutter TabView 更新当前 FirebaseUser
【发布时间】:2019-06-19 13:20:03
【问题描述】:

假设我的主页有 4 个标签。其中一个标签是带有 Firebase 登录的登录页面,另外 3 个标签需要知道用户是登录还是访客。

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

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 中。但还是一样,而且页面也经常刷新。

【问题讨论】:

  • currentUser 值始终为 null。 - 在其他选项卡中,它将为 null,因为您将初始 null currentUser 传递给这些选项卡,但是当登录状态更改时,您不会'不要重新创建它们(并给它们新更新的 currentUser 值)。 我应该如何使登录详细信息即时更新... - 一种方法是将 TabBarView 包装在 StreamBuilder 小部件中并使用 FirebaseAuth.instance.onAuthStateChanged 作为其流。
  • 我试过了,它使所有 hte 页面刷新多次,这看起来不太好。也无助于解决。
  • 谢谢。让我试试这个。
  • @Luksprog :效果很好。谢谢。但是我是否将更新后的新值放在同一个 StatefulWidget 类的主体之外?让我们看看根据用户或访客更新浮动栏。

标签: firebase flutter firebase-authentication


【解决方案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,
      ),}
    );
  }

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2020-05-08
    • 2019-07-16
    • 1970-01-01
    • 2021-10-21
    • 2020-06-16
    • 2017-04-05
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多