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('跳轉(zhuǎn)')),
),
),
);
}
}
異常解析:Navigator operation requested with a context that does not include a Navigator.
源碼分析
最終會發(fā)現(xiàn)了Element中Element _parent; _parent為null導(dǎo)致的式塌。
abstract class Element extends DiagnosticableTree implements BuildContext {
Element 實現(xiàn)了BuildContext
BuildContext來源
什么是Element?
Element 是實例化的 Widget 對象蕊梧,通過 Widget 的 createElement() 方法,在特定位置使用 Widget 配置數(shù)據(jù)生成但惶。
Element 用于管理應(yīng)用 UI 的更新和更改配名,管理部件的生命周期,每個 Element 都包含對 Widget 和 RenderObject 的引用。
當(dāng) Widget 變化時赤套,如果兩個 Widget 的 runtimeType 和 key 屬性相同的,那么新的 Element 會通過 Element.update() 更新舊的 Element珊膜,否則舊的 Element 會被刪除容握,新生成的 Element 插入到樹中。
RenderObject:
void layout(Constraints constraints, { bool parentUsesSize = false }) {
/// 進(jìn)行布局的擺放位置
}
/// ...
void paint(PaintingContext context, Offset offset) {
/// 繪制各個布局
}
三棵樹詳解
https://juejin.cn/post/6844903761027022862