Flutter InheritedWidget上下文为空

时间:2018-07-21 12:02:47

标签: tabs dart widget flutter inherited

我的应用程序的两个部分显示TabBarView小部件。结构如下:

-RootWidget (with `TabBarView`):
----SubWidget (`TabView`)
----SubWidget (`TabView`)
----SubWidget (`TabView`)

根被包裹在InheritedWidget中,因此我可以将数据传递到各个选项卡。尽管代码几乎相同,但它可以与一个TabBarView一起正常工作,但不能与我制作的第二个{}一起工作。

例如,默认的选定选项卡获取其数据并可以访问继承的窗口小部件。其他选项卡无法访问继承的窗口小部件。

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(
      ...
    );
  }

0 个答案:

没有答案