【发布时间】:2019-09-07 00:54:10
【问题描述】:
当我开始考虑这两个组成部分时,我发现自己在争论为什么我应该使用一个而不是另一个。我想到的一些问题:
Container 和 SizedBox 有什么区别?
我知道 Container 可以有其他参数,例如 padding 或 decoration,但如果我不使用这些参数,为什么要使用 SizedBox 而不是 Container?
它们之间有性能差异吗?
【问题讨论】:
标签: flutter
当我开始考虑这两个组成部分时,我发现自己在争论为什么我应该使用一个而不是另一个。我想到的一些问题:
Container 和 SizedBox 有什么区别?
我知道 Container 可以有其他参数,例如 padding 或 decoration,但如果我不使用这些参数,为什么要使用 SizedBox 而不是 Container?
它们之间有性能差异吗?
【问题讨论】:
标签: flutter
小更新:When used for whitespace, there is now even a linter warning to prefer SizedBox instead of Container。主要优势似乎是 SizedBox 可以是 const 并且在运行时甚至不会创建新实例。
得益于开源的魔力,您不必猜测太多。
Container 基本上只是一个方便的小部件,它有时可以让您省去嵌套 4 个其他小部件。如果您将宽度/高度传递给Container:
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);
}
即。它实际上是相同的。如果您只使用Container 作为宽度/高度,则可能会产生非常小的性能开销,可以忽略不计。但你肯定无法测量它。但我仍然推荐SizedBox,因为它更清晰。恕我直言。
【讨论】:
SizedBox。最近我什至一直在使用SizedBox 代替填充来分隔Column 或Row 中的项目.. ymmv
我想补充一点,SizedBox 不仅更简单,而且const 也可以,而Container 不能。这可能是您需要的,也可能不是。
如果你需要一个有颜色的盒子,你不能使用SizedBox。但是https://pub.dev/packages/assorted_layout_widgets 有Box 小部件,介于SizedBox 和Container 之间:你可以有颜色,也可以做成const。 注意我是这个包的作者。
【讨论】:
const 在您的构建函数中的好处吗?或者指出任何解释它的好处的资源?谢谢。
const。