
在前面的学习中,我们已经掌握了:
但你在写 Flutter 时,一定见过一个东西反复出现:
Widget build(BuildContext context)
👉 BuildContext 到底是什么?👉 为什么很多 API 都要传 context? 👉 Widget 嵌套这么深,Flutter 是怎么知道“谁是谁的孩子”?
这一篇,我们一次性讲清楚。
先回忆一句话:
Everything is a Widget
既然所有 UI 都是 Widget,那 Flutter 页面本质上就是:
👉 一棵 Widget 树
MaterialApp(
home: Scaffold(
body: Center(
child: Text('Hello'),
),
),
);
对应的树结构是:
MaterialApp
└─ Scaffold
└─ Center
└─ Text
📌 Flutter 渲染 UI,本质就是遍历这棵树。
在 Flutter 中:
child 表示单个子节点children 表示多个子节点例如:
Center(
child: Text('Hello'),
)
Column(
children: [
Text('A'),
Text('B'),
],
)
📌 父 Widget 决定:
简单理解即可:
你现在只需要记住一句话:
BuildContext 本质上来自 Element
官方解释比较抽象,我们用一句人话:
BuildContext 表示“当前 Widget 在 Widget 树中的位置”
它不是 UI, 不是 Widget, 而是:
👉 你站在 Widget 树中的“坐标”
Widget build(BuildContext context)
因为:
比如:
最常见的几个用途:
Theme.of(context)
MediaQuery.of(context).size
Navigator.of(context).push(...)
📌 这些操作的本质都是:
从当前位置,向父节点查找
你可能见过这种错误:
No Scaffold ancestor found
原因是:
👉 当前 context 所在的位置,树的上方还没有 Scaffold
MaterialApp(
home: Text('Hello'),
);
在 Text 的 context 中:
Scaffold.of(context); // ❌ 报错
因为:
MaterialApp(
home: Scaffold(
body: Text('Hello'),
),
);
context 查找父节点遵循:
从当前节点,向上查找最近的匹配项
如果找不到: 👉 报错
Flutter 中最基本、最重要的方式是:
👉 父传子(通过构造函数)
class Parent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Child(title: 'Hello');
}
}
class Child extends StatelessWidget {
final String title;
Child({required this.title});
@override
Widget build(BuildContext context) {
return Text(title);
}
}
📌 这是 Flutter 中最基础、最推荐的通信方式。
原因只有一个:
可预测、可维护
这也是 Flutter 状态管理思想的根基。
非常重要的一点:
❌ 不要保存 context ❌ 不要跨 Widget 使用 context ❌ 不要在异步回调乱用 context
📌 context 只在:
你现在已经明白:
这是理解 Flutter 布局、导航、主题的地基。
本篇你掌握了:
《Flutter 零基础入门(二十):常用布局 Widget(Row / Column / Expanded)》
下一篇我们将学习:
从下一篇开始:
你将真正开始“写得出像样的页面”