【发布时间】:2021-02-17 17:17:40
【问题描述】:
我一直在四处寻找,并没有找到一个合适的答案来回答这个问题:在后续的构建调用中重用小部件是否可以?我的意思是我创建了一个StatefulWidget,并在构建函数中保留了对返回的小部件的内部引用。在以后的构建中(如果我确定自上次构建以来没有任何变化),然后我返回最后一个小部件而不是构建一个新小部件。
我知道应该避免这种情况,创建简单的构建并优化失效过程,这样复杂的小部件就不会经常重建。但在某些情况下,我发现这可能是一个很好的解决方案。
特别是阅读this official doc page,它指出:
当重新遇到与前一帧相同的子小部件实例时,重建所有后代的遍历将停止。这种技术在框架内大量使用,用于优化不影响子子树的动画。请参阅 TransitionBuilder 模式和 SlideTransition 的源代码,它使用此原理来避免在制作动画时重建其后代。
所以这样做应该是可以接受的:
abstract class SmartState<T extends StatefulWidget> extends State<T> {
Widget _lastBuild;
T _previousWidget;
bool shouldRebuild(T previousWidget);
Widget doBuild(BuildContext context);
@override
@mustCallSuper
Widget build(BuildContext context) {
final T previousWidget = _previousWidget;
_previousWidget = widget;
if (previousWidget != null && _lastBuild != null && !shouldRebuild(previousWidget)) {
return _lastBuild;
}
_lastBuild = doBuild(context);
return _lastBuild;
}
}
作为一点背景知识,我打算在一个列表项中扩展这个类。列表本身有时会更改并使用新项目重新构建,尽管大多数项目保持不变,我只是重新排列它们,删除或添加一些。另请注意,由于设计要求,我不得不将它们放在 Wrap 小部件中。
那么有没有人有任何反指示或比这更好的解决方案。最重要的是,我想知道进行这样的重用是否被认为是好的或好的做法。谢谢!
【问题讨论】:
标签: performance flutter build statefulwidget