美文网首页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