关于android:Flutter TabBarView不断调用构建器

Flutter TabBarView keeps calling builders

我的tabBar有一个StatelessWidget小部件,其中包含2个statefulWidgets。事实是,当单击管理器以查看我的所有选项卡时(默认情况下在我的第一个选项卡上登陆),tab1小部件生成器一直被调用。

我已经尝试了这两种方法,但是它们没有用:

扑朔迷离的多标签页/页面视图

将Flutter切换到选项卡将重新加载小部件并运行FutureBuilder

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

1
2
3
4
 body:  TabBarView(
        children: <Widget>[
          Tab1Page(),
          Tab2Page(),

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)
        ],
      ),
    );
  },
);

} ??

这是我的调试器的打印记录:

enter


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

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

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

更新

您可以尝试通过这种方式来避免每次切换选项卡时都请求数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  //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)
          ],
        ),
      );
    },
  );