【问题标题】:Flutter TabBarView keeps calling buildersFlutter TabBarView 不断调用构建器
【发布时间】: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 :)

标签: android flutter dart


【解决方案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方法中获取数据
  • 很好,成功了!不过,我面临另一个问题,我将在另一个问题中发布,因为它有点相关但不是一回事。
猜你喜欢
  • 2021-05-19
  • 2020-08-08
  • 2020-01-07
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多