由于各种原因,有时我的小部件的build
方法会被再次调用。
我知道这是因为父母更新了。但这会导致不期望的效果。导致问题的典型情况是以这种方式使用FutureBuilder
:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: httpCall(),
builder: (context, snapshot) {
// create some layout here
},
);
}
在本例中,如果再次调用 build 方法,它将触发另一个HTTP请求。这是不期望的。
考虑到这一点,如何处理不需要的构建?有没有什么方法可以阻止构建调用?
6条答案
按热度按时间bqujaahr1#
Class.of(context)
模式)更改这意味着
build
方法不应该 * 触发http调用或修改任何状态。你面临的问题是你的构建方法有副作用/不纯,使得无关的构建调用很麻烦。
不应该阻止构建调用,而应该使构建方法纯净,以便可以在任何时候调用它而不会产生影响。
在您的示例中,您将小部件转换为
StatefulWidget
,然后将HTTP调用提取到State
的initState
:我已经知道了。我来这里是因为我真的想优化重建
也可以使一个小部件能够重建,而不必强迫它的孩子也进行构建。
当小部件的示例保持不变时; Flutter故意不会重建孩子。这意味着您可以缓存部件树的一部分,以防止不必要的重建。
最简单的方法是使用dart
const
构造函数:由于
const
关键字,即使构建被调用了数百次,DecoratedBox
的示例也将保持不变。但您可以手动实现相同的结果:
在本例中,当StreamBuilder收到新值通知时,即使StreamBuilder/Column重新构建,
subtree
也不会重新构建。这是因为,由于闭包,MyWidget
的示例没有改变。这种模式在动画中被大量使用。典型的使用是
AnimatedBuilder
和所有转换,如AlignTransition
。您也可以将
subtree
存储到类的字段中,但不太推荐,因为它破坏了热重载特性。f5emj3cl2#
您可以通过以下方式阻止不需要的构建调用
1.为UI的单个小部分创建子Statefull类
1.使用Provider库,因此使用它可以停止不需要的构建方法调用
下面这些情况构建方法调用
plicqrtu3#
Flutter也有
ValueListenableBuilder<T> class
。它允许您只重建一些必要的部件,而跳过昂贵的部件。你可以在这里看到文档ValueListenableBuilder flutter docs
或者只是下面的示例代码:
tyu7yeag4#
避免不必要的重新构建的最简单的方法之一是,通常是调用
setState()
来更新特定的Widget而不是刷新整个页面,将这部分代码剪切并将其 Package 为另一个Stateful
类中的独立Widget
。例如,在下面的代码中,父页面的
Build
方法通过按FAB按钮被反复调用:但是,如果将FloatingActionButton小部件分离到另一个具有自己生命周期的类中,则
setState()
方法不会导致父类Build
方法重新运行:MyWidget类:
gz5pxeao5#
我只是想分享我的经验,不必要的部件建设主要是由于上下文,但我发现了一种方法,是非常有效的
所以需要使用Navigator.pushReplacement(),这样前一页的上下文就与下一页没有关系
1.使用Navigator.pushReplacement()从第一页导航到第二页
1.在第二页中,我们需要再次使用Navigator.pushReplacement()在appBar中添加-
通过这种方式我们可以优化我们的应用
xzv2uavs6#
你可以这样做: