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;
}