【问题标题】:Controller's length property does not match the number of tabs present in TabBar's tabs property控制器的长度属性与 TabBar 的选项卡属性中的选项卡数量不匹配
【发布时间】:2020-07-29 20:57:54
【问题描述】:

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

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

从 Firebase 调用数据的函数:

Future functionName async {

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

此函数用于 Future Builder,一旦函数执行完成,它就会返回一个要显示的小部件。

Future Builder 的未来在类的 initState() 中初始化。 init() 状态如下所示:

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

    _future = functionName();

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

    tabController.addListener(_setActiveTabIndex);
 }

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

我尝试过使用:

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

    _future = functionName();

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

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

【问题讨论】:

    标签: flutter tabs init tabview


    【解决方案1】:

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

    这个洞的想法有点倒退。

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


    你可以

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

    或者你可以

    • 在您进入该屏幕之前获取数据,因此已经拥有数据。

    我希望这能让你走上正轨

    【讨论】:

    • 好的,我刚刚尝试了第二种方法,它有效。我从没想过……太棒了。所以,我会将此答案标记为正确且已解决。对此,我真的非常感激。 :) 话虽如此,我正在使用未来的构建器,在函数调用成功完成后,我使用构建并返回 TabBar 的调用。但我必须在 initState() 中指定 TabController。如果我愿意,你建议我如何解决这个问题?有没有办法做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多