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