Flutter | 深入理解BuildContext

https://juejin.im/post/5c665cb651882562914ec153

  1. abstract class BuildContext {
  2. /// The current configuration of the [Element] that is this [BuildContext].
  3. Widget get widget;
  4. /// The [BuildOwner] for this context. The [BuildOwner] is in charge of
  5. /// managing the rendering pipeline for this context.
  6. BuildOwner get owner;
  7. ...

Flutter如何构建视图

在Flutter中,Everything is Widget,我们通过构造函数嵌套Widget来编写UI界面。实际上,Widget并不是真正要显示在屏幕上的东西,只是一个配置信息,它永远是immutable的,并且可以在多处重复使用。那真正显示在屏幕上的视图树是什么呢?Element Tree!
那我们来看一下,在构建视图的时候究竟发生了什么。这里以Stateless Widget为例。

  1. abstract class StatelessWidget extends Widget {
  2. const StatelessWidget({ Key key }) : super(key: key);
  3. @override
  4. StatelessElement createElement() => StatelessElement(this);
  5. ...

视图树装载过程

StatelessWidget

  • 首先它会调用StatelessWidget的 createElement 方法,并根据这个widget生成StatelesseElement对象。
  • 将这个StatelesseElement对象挂载到element树上。
  • StatelesseElement对象调用widget的build方法,并将element自身作为BuildContext传入。

    StatefulWidget

  • 首先同样也是调用StatefulWidget的 createElement方法,并根据这个widget生成StatefulElement对象,并保留widget引用。

  • 将这个StatefulElement挂载到Element树上。
  • 根据widget的 createState 方法创建State。
  • StatefulElement对象调用state的build方法,并将element自身作为BuildContext传入。

所以我们在build函数中所使用的context,正是当前widget所创建的Element对象。

Flutter | 深入浅出Key

https://juejin.im/post/5ca2152f6fb9a05e1a7a9a26