Flutter 有很多嵌套的小部件是不是很糟糕?

Is it bad to have a lot of nested widgets with Flutter?

我在 Android 开发方面有很强的背景,现在我正在尝试使用 Flutter 开发我的第一个应用程序。

Android 社区中的常识是嵌套视图过多是不好的。这对性能不利。 (这也是 ConstraintLayout 存在的原因之一)

然而,在很多 Flutter 教程中,我看到人们嵌套了很多小部件。

有人可以确认用 Flutter 嵌套小部件没有问题吗?如果我这样做,我的应用程序会不会性能不佳?

提前致谢

嵌套小部件不是问题,实际上是推荐的。 事实上,默认的计数器应用程序包含不少于 150 个小部件。

小部件是经过专门优化的轻型对象,可以在每一帧创建和销毁大量的小部件。 Flutter FAQ:

进一步证明了这一点

Rather than having each widget provide a large number of parameters, Flutter embraces composition. Widgets are built out of smaller widgets that you can reuse and combine in novel ways to make custom widgets. For example, rather than subclassing a generic button widget, RaisedButton combines a Material widget with a GestureDetector widget. The Material widget provides the visual design and the GestureDetector widget provides the interaction design.

这句话说你应该有目的地嵌套小部件。

TL;DR: 建议在 Flutter 中深度嵌套单一用途的小部件。


Android 和 Flutter 呈现视图元素(也称为小部件或视图)的方式存在根本差异。

在Android中,相互继承的复杂视图相对较少。 每个视图都提供了一个巨大的 API 表面,包括填充、边距、颜色等内容。

另一方面,Flutter 更倾向于组合而不是继承。 大多数小部件仅出于单一目的而存在,并且非常轻巧。 这意味着您需要更深入地嵌套小部件才能实现相同的效果,但由于它们的布局和渲染逻辑更简单,因此渲染速度通常更快。

例如,有一个 Padding 小部件在其子项周围形成一些 space。 Padding 小部件的规则非常简单,渲染速度非常快。 此外,所有其他小部件的规则也变得更简单,因为它们不再需要担心填充。

基本上,Flutter 推荐深度嵌套 widgets。 这与 Android 的模型完全相反: 如果嵌套不多,您可能做错了什么,因为您有一个巨大的小部件,通常可以拆分成更简单、更快、更小的小部件。

这是一个 interesting Google Tech Talk about Flutter's rendering pipeline,我推荐给对此主题感兴趣的任何人。