假设我的主页有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中。但还是一样,页面也经常刷新。
答案 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,
),}
);
}