Flutter TabBarView 不断调用构建器

Posted

技术标签:

【中文标题】Flutter TabBarView 不断调用构建器【英文标题】:Flutter TabBarView keeps calling builders 【发布时间】:2018-08-16 16:08:23 【问题描述】:

我的 tabBar 有一个 StatelessWidget 小部件,其中包含 2 个 statefulWidget。问题是当点击管理器查看我的所有标签时(默认登陆我的第一个标签),tab1 小部件构建器不断被调用。

我已经尝试了这 2 种方法,但它们都不起作用:

Multi tab / page view in flutter

Flutter Switching to Tab Reloads Widgets and runs FutureBuilder

这真的很烦人,因为在某些小部件中我需要发出一些 http 请求,而且它们也不断被调用。

 body:  TabBarView(
        children: <Widget>[
          Tab1Page(),
          Tab2Page(),

这是我的 tab1 页面,它是一个 stateFulWidget

Widget build(BuildContext context) 
// TODO: implement build
print("tab1: Builder");
return ScopedModelDescendant<MainModel>(
  builder: (BuildContext context, Widget child, MainModel model) 
    List<SolicitudDto> listadoSolicitudesAprobadas =
        model.obtenerSolicitudesPendientes();

    return Scaffold(
      body: ListView(
        children: <Widget>[
          _buildCards(context, listadoSolicitudesAprobadas)
        ],
      ),
    );
  ,
);

这是我的调试器的打印捕获:

【问题讨论】:

可以分享Tab1Page的内容吗? 我已经更新了我的描述 Dinesh :) 【参考方案1】:

如果您想在 TabBarView 中保留屏幕状态,可以在 State 类中使用名为 AutomaticKeepAliveClientMixin 的 mixin 类。

之后,您必须重写 wantKeepAlive 方法并返回 true

我在这里写了一篇关于这个的帖子:https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc

更新

您可以尝试这种方式来避免每次切换标签时请求数据。

  //global variable at your state class

  List<SolicitudDto> listadoSolicitudesAprobadas; 


  Widget build(BuildContext context) 
  // TODO: implement build
  print("tab1: Builder");
  return ScopedModelDescendant<MainModel>(
    builder: (BuildContext context, Widget child, MainModel model) 
         if (listadoSolicitudesAprobadas == null)
          listadoSolicitudesAprobadas =   model.obtenerSolicitudesPendientes();
        

      return Scaffold(
        body: ListView(
          children: <Widget>[
            _buildCards(context, listadoSolicitudesAprobadas)
          ],
        ),
      );
    ,
  );

【讨论】:

已经试过了,它也在其中一个链接中。问题是当处于 tab1 页面时,构建器会不断被递归调用。 你必须把它放在你的 Tab1Page 和 Tab2Page 里面 我已经删除了我的第二个标签并将其放入我的 tab1Page。继续做同样的事情。我不明白为什么要这样做,我也从 page1 中删除了所有代码以丢弃任何错误。另请阅读您的博客并按照描述的步骤操作。 哦,是的,我看到了你的代码,那是因为总是调用build方法,我以为你是在initState方法中获取数据 很好,成功了!不过,我面临另一个问题,我将在另一个问题中发布,因为它有点相关但不是一回事。

以上是关于Flutter TabBarView 不断调用构建器的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:SingleChildScrollView 内的 TabBarView

Flutter - 如何在 TabBarView 的主体内导航?

Flutter 中如何同时使用 SliverPersistentHeader 和 TabBarView?

TabBarView 或 IndexedStack 用于 BottomNavigationBar - Flutter

何时在 Flutter 中使用新的 Screens 而不是 TabBarView

iOS 设备中 Flutter TabBarView 覆盖底部区域(Slider)