在flutter中构建的最贵和最便宜的小部件是什么

4ktjp1zp  于 2023-02-16  发布在  Flutter
关注(0)|答案(6)|浏览(104)

在我的例子中,我需要在列中设置一个小部件,条件如下:

isSomeBool ? MyWidget() : thatLeastExpensiveWidget()

我可以简单地使用SizedBoxContainer,但它们是我们可以使用的flutter中最便宜的小部件吗?或者是否有专门为此目的而设计的小部件
我也很想知道flutter可以构建的最昂贵的小部件是什么
谢谢

atmip9wb

atmip9wb1#

我不知道哪一个最便宜,因为它让你深入到Flutter的源代码,谁可以回答你是一个使/贡献这个Flutter框架。但SizedBoxContainer是最简单的小部件,所以可能是最简单的,因为我知道。StatelessWidget也比StatefulWidget便宜。顺便说一句,如果你想建立自己的小部件,使用class StatelessWidget而不是Widget _buidYourOwnWidget()之类的方法,因为每次重建应用程序屏幕时都会重新加载方法。在这种情况下,class StatelessWidget_buidYourOwnWidget()更便宜。
关于什么最贵,贵的有2种:关于时间或关于空间。关于时间,显然是Future,因为它可以延迟任何你想要的时间。关于空间,它是你的自定义部件-因为一个部件可能包含许多子部件。例如,Scaffold是整个屏幕,所以它是最昂贵的空间。

iyzzxitl

iyzzxitl2#

您可以只使用if语句呈现所需的部分,而避免呈现else部分,如下所示。

child: Column(children: [
    ListTile(
      ...
    ),
    if (bool)
      Container(
        ...
      ),
  ])
b91juud3

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. 
 ]
)
zlhcx6iw

zlhcx6iw4#

dart支持在列表中有条件地包含元素,因此您不需要一个虚拟的Widget,就像下面的例子:

Column(children: [
  Container(),
  Container(),
  Container(),
  Container(),
  if (isSomeBool) MyWidget(),
  Container(),
  Container(),
  Container(),
  Container()
]);
14ifxucb

14ifxucb5#

使用Container()SizedBox(),即使它们是空的,它们仍然是需要渲染和绘制的完整Flutter小部件,因此实际上,它不是在某些情况下仅用于关闭分析器的最小小小部件,
我发现Nil包提供了一个小部件,它只定义了一个类,而Flutter框架认为这个类是一个小部件,但没有执行任何渲染或绘制。
它的实现实际上只是几行代码,可以像这样使用:

return Builder(
  builder: (_) {
    if (condition) {
      return const MyWidget();
    } else {
      return nil;
    }
  },
);

以防有人对这个主题感兴趣。

mrphzbgm

mrphzbgm6#

你必须避免使用IntrinsicHeightOpacity,因为它有昂贵的操作。在动画中使用Opacity会导致丢帧。

相关问题