BuildContext

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: FlatButton(
              onPressed: () {
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => SecondPage()));
              },
              child: Text('跳转')),
        ),
      ),
    );
  }
}

异常解析:Navigator operation requested with a context that does not include a Navigator.

源码分析

NavigatorState
寻找Element的Parent

最终会发现了Element中Element _parent; _parent为null导致的。

abstract class Element extends DiagnosticableTree implements BuildContext {
Element 实现了BuildContext

BuildContext来源

什么是Element?
Element 是实例化的 Widget 对象,通过 Widget 的 createElement() 方法,在特定位置使用 Widget 配置数据生成。
Element 用于管理应用 UI 的更新和更改,管理部件的生命周期,每个 Element 都包含对 Widget 和 RenderObject 的引用。


Element.png

当 Widget 变化时,如果两个 Widget 的 runtimeType 和 key 属性相同的,那么新的 Element 会通过 Element.update() 更新旧的 Element,否则旧的 Element 会被删除,新生成的 Element 插入到树中。


CanUpdate.png

RenderObject:
void layout(Constraints constraints, { bool parentUsesSize = false }) {
/// 进行布局的摆放位置
}

/// ...

void paint(PaintingContext context, Offset offset) {
/// 绘制各个布局
}

三棵树详解

创建Element.png

https://juejin.cn/post/6844903761027022862

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

推荐阅读更多精彩内容