我的应用程序的两个部分显示TabBarView
小部件。结构如下:
-RootWidget (with `TabBarView`):
----SubWidget (`TabView`)
----SubWidget (`TabView`)
----SubWidget (`TabView`)
根被包裹在InheritedWidget
中,因此我可以将数据传递到各个选项卡。尽管代码几乎相同,但它可以与一个TabBarView
一起正常工作,但不能与我制作的第二个{1>}一起工作。
例如,默认的选定选项卡获取其数据并可以访问继承的窗口小部件。其他选项卡无法访问继承的窗口小部件。
根
class _TrainerRootState extends State<TrainerRoot>
with SingleTickerProviderStateMixin {
TabController tabController;
List<TrainerTab> trainerTabs = [
TrainerTab(
title: "Clients",
icon: Image.asset(
'assets/client_icon.png',
color: Colors.grey,
height: 23.0,
),
view: MyTabViewOne(),
),
//3 more tabs, same format...
];
TrainerTab selectedTab;
@override
void initState() {
super.initState();
selectedTab = trainerTabs[0];
tabController = TabController(vsync: this, length: 4);
tabController.addListener(() {
setState(() {
selectedTab = trainerTabs[tabController.index];
});
});
beginListeningToData();
}
@override
void dispose() {
disposeOfListeners();
tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
print(context);
return WillPopScope(
onWillPop: () async => false,
child: TrainerState(
clients: clients,
packages: packages,
child: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.orange,
elevation: 0.0,
title: Text(selectedTab.title),
automaticallyImplyLeading: false,
actions: actions(),
),
body: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: tabController,
children: trainerTabs.map((TrainerTab tab) => tab.view).toList(),
),
bottomNavigationBar: TabBar(
indicatorColor: Colors.transparent,
controller: tabController,
tabs: <Widget>[
Tab(
icon: selectedTab == trainerTabs[0]
? trainerTabs[0].highlightedIcon()
: trainerTabs[0].icon,
),
Tab(
icon: selectedTab == trainerTabs[1]
? trainerTabs[1].highlightedIcon()
: trainerTabs[1].icon,
),
Tab(
icon: selectedTab == trainerTabs[2]
? trainerTabs[2].highlightedIcon()
: trainerTabs[2].icon,
),
Tab(
icon: selectedTab == trainerTabs[3]
? trainerTabs[3].highlightedIcon()
: trainerTabs[3].icon,
)
],
),
),
),
);
}
}
InheritedWidget
class TrainerState extends InheritedWidget {
const TrainerState({
Key key,
@required this.clients,
@required this.packages,
Widget child,
}) : super(key: key, child: child);
final List<Client> clients;
final List<Package> packages;
@override
bool updateShouldNotify(TrainerState oldWidget) {
return true;
}
static TrainerState of(BuildContext context) {
return context.inheritFromWidgetOfExactType(TrainerState);
}
}
例如,我的“客户”标签可以通过继承的小部件访问“客户”和“软件包”标签访问软件包。
就像下面一样,我的客户标签(默认的选定标签)可以完美地访问以下状态。但是,另一个选项卡发现状态为空。
如果我应该采用其他方法来更新标签,请告诉我。
标签小工具
@override
Widget build(BuildContext context) {
TrainerState state = TrainerState.of(context);
return Scaffold(
...
);
}