Flutter 基础 build()函数之外的context

2020‎-04‎-‎20‎ ‏‎15:06:34
build() 函数之外的 context

发现问题

好像有一天我在 build() 函数之外用到了 context 竟然没问题。
那么这个 context 来自哪里?


答案

context 就是 _element

abstract class State<T extends StatefulWidget> extends Diagnosticable {
  BuildContext get context => _element;
  StatefulElement _element;
}

那么 _element 是什么?

每个 Widget 都有个 createElement() 方法,
Widget 的生命从调用 createElement() 开始。
对于 StatefulWidget ,会创建 StatefulElement 并返回给调用者(调用者是谁?)。

abstract class StatefulWidget extends Widget {
   @override
  StatefulElement createElement() => StatefulElement(this);
}

StatefulElement 创建的时候,
会在构造函数的初始化列表中调用我们自己写的 createState() 创建 State
并赋值给实例变量 _state

在构造函数体中,
State 实例的 _element 赋值为当前 StatefulElement 实例。
这和调用 build() 时传递的 context 是一样的。

class StatefulElement extends ComponentElement {
  StatefulElement(StatefulWidget widget)
      : _state = widget.createState(),
        super(widget) {
    assert(_state._element == null);
    _state._element = this; // 就是这里了
  }

  @override
  Widget build() => state.build(this); // 和调用 build() 传递的 context 一样

  State<StatefulWidget> get state => _state;
  State<StatefulWidget> _state;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。