【发布时间】:2021-01-10 12:02:14
【问题描述】:
我已经为bottomNavigationBar实现了多个OffstageNavigators,更多细节可以看here。问题是在使用这个方法的时候,我们每选择一个底部导航项,FutureBuilder就会运行future方法并重建整个widget,每个Offstagewidget及其所有子widget也会重建。
对于每个 Offstage 小部件,我通过 html 请求加载数据,这意味着每次切换选项卡时,将发出 5 个请求。
这是我的主要Scaffold,其中包含bottomNavigationBar。
@override
Widget build(BuildContext context) {
TabProvider tabProvider = Provider.of<TabProvider>(context);
return FutureBuilder(
future: initProvider(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return WillPopScope(
onWillPop: _onWillPop,
child: Scaffold(
appBar: AppBar(
title: Text(tabName[tabProvider.currentTab],
),
body: Stack(children: <Widget>[
_buildOffstageNavigator(TabItem.feed, tabProvider.currentTab),
_buildOffstageNavigator(TabItem.explore, tabProvider.currentTab),
_buildOffstageNavigator(TabItem.guide, tabProvider.currentTab),
_buildOffstageNavigator(TabItem.map, tabProvider.currentTab),
_buildOffstageNavigator(TabItem.profile, tabProvider.currentTab),
]),
bottomNavigationBar: BottomNavigation(
currentTab: tabProvider.currentTab,
onSelectTab: tabProvider.selectTab,
),
),
);
} else {
return Text('Loading');
}
},
);
}
FutureBuilder 将初始化我的提供程序中的值,以便每个选项卡都可以访问缓存的数据。
_buildOffstageNavigator 将返回以下内容
return Offstage(
offstage: currentTab != tabItem,
child: TabNavigator(
navigatorKey: navigatorKeys[tabItem],
tabItem: tabItem,
),
);
下面是构建在Scaffold 主体内的小部件,因此在上面的Offstage Navigator 内。
@override
Widget build(BuildContext context) {
TabProvider tabProvider = Provider.of<TabProvider>(context);
States stateData = tabProvider.exploreStateCache;
return Container(
child: ListView(
children: <Widget>[
Text(stateData.stateName),
Text(stateData.stateDescription),
],
),
);
}
我已按照articles 的建议在提供商处使用期货,但缺少其他内容
【问题讨论】:
标签: flutter dart asynchronous provider