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;
}
网友评论