在我的例子中,我需要在列中设置一个小部件,条件如下:
isSomeBool ? MyWidget() : thatLeastExpensiveWidget()
我可以简单地使用SizedBox或Container,但它们是我们可以使用的flutter中最便宜的小部件吗?或者是否有专门为此目的而设计的小部件我也很想知道flutter可以构建的最昂贵的小部件是什么谢谢
SizedBox
Container
atmip9wb1#
我不知道哪一个最便宜,因为它让你深入到Flutter的源代码,谁可以回答你是一个使/贡献这个Flutter框架。但SizedBox和Container是最简单的小部件,所以可能是最简单的,因为我知道。StatelessWidget也比StatefulWidget便宜。顺便说一句,如果你想建立自己的小部件,使用class StatelessWidget而不是Widget _buidYourOwnWidget()之类的方法,因为每次重建应用程序屏幕时都会重新加载方法。在这种情况下,class StatelessWidget比_buidYourOwnWidget()更便宜。关于什么最贵,贵的有2种:关于时间或关于空间。关于时间,显然是Future,因为它可以延迟任何你想要的时间。关于空间,它是你的自定义部件-因为一个部件可能包含许多子部件。例如,Scaffold是整个屏幕,所以它是最昂贵的空间。
StatelessWidget
StatefulWidget
class StatelessWidget
Widget _buidYourOwnWidget()
_buidYourOwnWidget()
Future
Scaffold
iyzzxitl2#
您可以只使用if语句呈现所需的部分,而避免呈现else部分,如下所示。
child: Column(children: [ ListTile( ... ), if (bool) Container( ... ), ])
b91juud33#
我建议使用SizedBox而不是Container来向布局中添加空白。容器是一个比SizedBox更重的小部件,而且SizedBox有一个常量构造函数。reff实际上是一样的。如果您只使用Container作为宽度/高度,可能会有一个非常小的微不足道的性能开销。但您肯定无法测量它。reff这是我通常使用list的另一种方式。
Column( children:[ // other widget here // three dots is to add item to the list ...isSomeBool ? [ my widget ] : [] // if false => this will add empty list to the children, so nothing rendered. // but idk about calculation behind the list. ] )
zlhcx6iw4#
dart支持在列表中有条件地包含元素,因此您不需要一个虚拟的Widget,就像下面的例子:
Column(children: [ Container(), Container(), Container(), Container(), if (isSomeBool) MyWidget(), Container(), Container(), Container(), Container() ]);
14ifxucb5#
使用Container()和SizedBox(),即使它们是空的,它们仍然是需要渲染和绘制的完整Flutter小部件,因此实际上,它不是在某些情况下仅用于关闭分析器的最小小小部件,我发现Nil包提供了一个小部件,它只定义了一个类,而Flutter框架认为这个类是一个小部件,但没有执行任何渲染或绘制。它的实现实际上只是几行代码,可以像这样使用:
Container()
SizedBox()
return Builder( builder: (_) { if (condition) { return const MyWidget(); } else { return nil; } }, );
以防有人对这个主题感兴趣。
mrphzbgm6#
你必须避免使用IntrinsicHeight和Opacity,因为它有昂贵的操作。在动画中使用Opacity会导致丢帧。
IntrinsicHeight
Opacity
6条答案
按热度按时间atmip9wb1#
我不知道哪一个最便宜,因为它让你深入到Flutter的源代码,谁可以回答你是一个使/贡献这个Flutter框架。但
SizedBox
和Container
是最简单的小部件,所以可能是最简单的,因为我知道。StatelessWidget
也比StatefulWidget
便宜。顺便说一句,如果你想建立自己的小部件,使用class StatelessWidget
而不是Widget _buidYourOwnWidget()
之类的方法,因为每次重建应用程序屏幕时都会重新加载方法。在这种情况下,class StatelessWidget
比_buidYourOwnWidget()
更便宜。关于什么最贵,贵的有2种:关于时间或关于空间。关于时间,显然是
Future
,因为它可以延迟任何你想要的时间。关于空间,它是你的自定义部件-因为一个部件可能包含许多子部件。例如,Scaffold
是整个屏幕,所以它是最昂贵的空间。iyzzxitl2#
您可以只使用if语句呈现所需的部分,而避免呈现else部分,如下所示。
b91juud33#
我建议使用
SizedBox
而不是Container
来向布局中添加空白。容器是一个比SizedBox更重的小部件,而且SizedBox有一个常量构造函数。reff
实际上是一样的。如果您只使用Container作为宽度/高度,可能会有一个非常小的微不足道的性能开销。但您肯定无法测量它。reff
这是我通常使用list的另一种方式。
zlhcx6iw4#
dart支持在列表中有条件地包含元素,因此您不需要一个虚拟的Widget,就像下面的例子:
14ifxucb5#
使用
Container()
和SizedBox()
,即使它们是空的,它们仍然是需要渲染和绘制的完整Flutter小部件,因此实际上,它不是在某些情况下仅用于关闭分析器的最小小小部件,我发现Nil包提供了一个小部件,它只定义了一个类,而Flutter框架认为这个类是一个小部件,但没有执行任何渲染或绘制。
它的实现实际上只是几行代码,可以像这样使用:
以防有人对这个主题感兴趣。
mrphzbgm6#
你必须避免使用
IntrinsicHeight
和Opacity
,因为它有昂贵的操作。在动画中使用Opacity
会导致丢帧。