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.
源码分析
最终会发现了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 的引用。
当 Widget 变化时,如果两个 Widget 的 runtimeType 和 key 属性相同的,那么新的 Element 会通过 Element.update() 更新旧的 Element,否则旧的 Element 会被删除,新生成的 Element 插入到树中。
RenderObject:
void layout(Constraints constraints, { bool parentUsesSize = false }) {
/// 进行布局的摆放位置
}
/// ...
void paint(PaintingContext context, Offset offset) {
/// 绘制各个布局
}
三棵树详解
https://juejin.cn/post/6844903761027022862