控制器的长度 属性 与 TabBar 的选项卡 属性 中存在的选项卡数量不匹配

Controller's length property does not match the number of tabs present in TabBar's tabs property

我正在实现 TabBar,但出现错误,如上所述。我知道发生这种情况的原因,但不知道如何解决这个问题。

我有一个异步函数,旨在从填充列表的 Firebase 中提取数据。该功能描述如下。该函数拉取的数据用于将长度传递给TabController

从 Firebase 调用数据的函数:

Future functionName async {

await function actions...
  List example = ['item1', 'item2', 'item3', 'item4'];
} 

此函数用于 Future Builder,其中 returns 将在函数执行完成后立即显示的小部件。

Future Builder 的 future 在 class 的 initState() 中初始化。 init() 状态看起来像:

  @override
  void initState() {
    super.initState();

    _future = functionName();

    tabController = TabController(length: example.length, vsync: this, initialIndex: 0);

    tabController.addListener(_setActiveTabIndex);
 }

现在,我得到了如上所述的错误。这很明显,为什么! 由于该函数是一个异步函数并且是在 Future Builder 中构建的,因此列表 'example' 最初是空的。 TabController 的长度为 0。但随着此列表的填充,长度会增加,但 TabController 的长度不会改变。

我试过使用:

    @override
    void initState() {
      super.initState();

    _future = functionName();

    setState(() {
       tabController = TabController(length : example. length, vsync : this, initialIndex : 0)
  } 
) 

但这也不管用。 知道这个问题,但无法解决它,这很烦人。对此的任何帮助将不胜感激。

您已经知道问题的原因了。

洞的想法有点倒退。

您正在尝试构建 TabBar,但您不知道需要多少标签。


你可以

  • 执行您的 FutureBuilder,然后使用收到的数据构建 TabBar

或者你可以

  • 在转到该屏幕之前获取数据,因此已经有了数据。

我希望这能让你走上正轨