美文网首页Flutter学习分享-齐绪东
Flutter 基础 build()函数之外的context

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

作者: 外星间谍 | 来源:发表于2020-05-17 15:07 被阅读0次

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

相关文章

网友评论

    本文标题:Flutter 基础 build()函数之外的context

    本文链接:https://www.haomeiwen.com/subject/jxksohtx.html