Flutter 颤振:SizedBox Vs Container,为什么要使用一个而不是另一个?

Flutter 颤振:SizedBox Vs Container,为什么要使用一个而不是另一个?,flutter,Flutter,当我开始思考这两个组成部分时,我发现自己在争论为什么我应该选择其中一个而不是另一个。我想到的一些问题: 容器和SizedBox之间有什么区别 我知道容器可以有其他参数,如填充或装饰,但如果我不使用这些参数,为什么我要使用SizedBox而不是容器 它们之间有性能差异吗 多亏了开源的魔力,你不必猜太多 Container基本上只是一个方便的小部件,它有时可以节省您嵌套其他4个小部件的时间。如果将宽度/高度传递到容器中: constraints = (width !=

当我开始思考这两个组成部分时,我发现自己在争论为什么我应该选择其中一个而不是另一个。我想到的一些问题:

  • 容器和SizedBox之间有什么区别

  • 我知道容器可以有其他参数,如填充或装饰,但如果我不使用这些参数,为什么我要使用SizedBox而不是容器

  • 它们之间有性能差异吗


  • 多亏了开源的魔力,你不必猜太多

    Container
    基本上只是一个方便的小部件,它有时可以节省您嵌套其他4个小部件的时间。如果将宽度/高度传递到
    容器中

           constraints =
            (width != null || height != null)
              ? constraints?.tighten(width: width, height: height)
                ?? BoxConstraints.tightFor(width: width, height: height)
              : constraints,
    
    这将导致:

        if (constraints != null)
          current = ConstrainedBox(constraints: constraints, child: current);
    
    实际上,ConstrainedBox与SizedBox差不多,只是更灵活而已

    SizedBox
    可以:

      @override
      RenderConstrainedBox createRenderObject(BuildContext context) {
        return RenderConstrainedBox(
          additionalConstraints: _additionalConstraints,
        );
      }
    
      BoxConstraints get _additionalConstraints {
        return BoxConstraints.tightFor(width: width, height: height);
      }
    

    实际上是一样的。如果只使用
    容器
    表示宽度/高度,那么性能开销可能非常小。但你肯定无法测量它。。但我还是建议使用
    SizedBox
    ,因为它更清晰。imho.

    我想补充一点,
    SizedBox
    不仅更简单,而且还可以将其设置为
    const
    ,而
    容器
    则不能。这可能是你需要的,也可能不是


    如果需要带颜色的框,则不能使用
    SizedBox
    。但是有
    小部件,它介于
    大小框
    容器
    之间:你可以有颜色,它可以被设置为
    常量
    。请注意,我是这个软件包的作者。

    关于这个问题(链接),我想知道哪一个更适合作为两个文件之间的空白占位符,它们不需要任何参数?嗯,别担心,在这种情况下,用任何合适的方法。实际上,空容器不可能成为性能问题。所以,使用更自然的东西。我个人使用Container()时,我只是想隐藏一些东西,例如用于加载(这基本上只在我懒于加载指示器等的情况下进行原型设计时发生)。如果我想要一个特定的尺寸,我使用
    SizedBox
    。最近我甚至用
    SizedBox
    代替填充物来分隔
    中的项目。。YMMV您能解释一下
    const
    在构建函数中的好处吗?或者指向任何解释其好处的资源?谢谢。当然:Const对象是最终的/不可变的,并且是在编译时创建的。这样你就不会浪费时间去创建它们了。此外,具有相同参数的相同类型的所有常量对象都是相同的实例。因此,您不会浪费内存创建多个。换句话说,const对象使您的程序更快、内存效率更高。哇,感谢您花时间解释这一点!现在,我将更经常地在我的小部件树中使用
    const
    。另外,我昨天才读到,flatter知道元素是否为const,因此可以在重建中跳过它。