Flutter 是 Google 推出的用于原生跨平台应用程序的 UI 框架。根据 Flutter Docs (2025),超过 50 万个 Google Play 应用使用 Flutter。理解 Widget、StatefulWidget、BuildContext 和渲染树是 Flutter 开发的基础。
要点
Widget — UI 部分的声明式描述。Flutter 中一切都是 Widget:从按钮到应用本身。Widget 是配置(不是 UI 本身)。StatelessWidget — 不可变 Widget。build() 只调用一次。没有状态。用于静态内容。StatefulWidget — 可变 Widget。具有可以更改的 State 对象。setState() — 触发重建。State — 绑定到 StatefulWidget 的可变对象。包含可以更改的数据。
StatelessWidget — build() 只调用一次。适用于标题、图标、静态文本。StatefulWidget — build() 在每次调用 setState() 时被调用。适用于表单、带有更改的列表、计时器。InheritedWidget — 无需通过构造函数显式传递即可向下传递数据。Theme、MediaQuery、Navigator — InheritedWidget。BuildContext — Widget 在树中的位置。context.of<T>、context.watch<T>、context.select<T,R> — 访问 InheritedWidget。
// Flutter Widget示例:使用setState的StatefulWidget
class CounterWidget extends StatefulWidget {
const CounterWidget({Key? key}) : super(key: key);
@override
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Flutter Counter')),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('You have pushed the button:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: const Icon(Icons.add),
),
);
}
}Widget — 配置。StatelessWidget — 不可变。StatefulWidget — 可变,使用 setState()。IT Sectr 建议从 StatelessWidget 开始,仅在需要状态时切换到 StatefulWidget。
Flutter 使用三棵树进行高效渲染。Widget Tree — 配置树。Widget 频繁创建(每次 build),轻量级。Element Tree — 元素树。每个 Widget 一个元素(如果类型不变)。Element — Widget 和 RenderObject 之间的桥梁。RenderObject Tree — 渲染树。处理大小、位置、绘制。RenderObject — 重量级,很少创建。Flutter 比较 Widget Tree 并更新 Element Tree,从而触发 RenderObject Tree 的更新。
Key — Widget 在 Element Tree 中的标识符。ValueKey、ObjectKey、UniqueKey、PageStorageKey。Keys 允许 Flutter 在重建时匹配旧的和新的 Widget。没有 Keys,Flutter 根据 Widget 类型和位置进行匹配。GlobalKey — 从另一个 Widget 访问 State。用于:复杂表单、动画、测试中的 State 访问。IT Sectr 建议对列表(List.generate)使用 Keys,除非必要,否则避免使用 GlobalKey。
Expanded — 填充 Row/Column/Flex 中可用空间的 Widget。Flexible — 不强制填充(可以更小)。MediaQuery — 包含设备信息的 InheritedWidget:屏幕大小、方向、平台、文本缩放因子。Theme/ThemeData — 集中主题。Theme.of(context) — 访问。MaterialApp — 用于配置路由、主题、本地化的根 Widget。Scaffold — 带有 AppBar、Drawer、BottomNavigationBar 的基本布局。AppBar — 顶部面板。
Navigator — 路由栈(Routes)。Navigator.push — 打开屏幕(返回 Future)。Navigator.pop — 关闭(带结果)。MaterialPageRoute — 动画过渡(从右侧滑入)。Named Routes — 字符串标识符。onGenerateRoute — 集中处理程序。Navigator 2.0(Router + RouteInformationParser + RouterDelegate)— 用于 Web、深度链接和复杂场景的声明式导航。
Navigator 2.0 — 声明式导航。Router — 中央 Widget。RouteInformationParser — URL 解析。RouterDelegate — 堆栈管理。GoRouter(包)— Navigator 2.0 的简化包装。支持:命名路由、参数、重定向、深度链接。IT Sectr 建议大多数项目使用 GoRouter,仅复杂场景(Web、桌面)使用 Navigator 2.0。
FutureBuilder — 基于 Future 构建 UI 的 Widget。connectionState:none、waiting、active、done。用于:HTTP 请求、数据库读取、计时器。StreamBuilder — 用于 Stream(无限数据流)的 Widget。snapshot.data、snapshot.hasError、snapshot.hasData。用于:WebSocket、Firebase、位置更新。两个 Widget 在收到新数据时都会重建。
Provider — 简单 DI + 状态管理。ChangeNotifierProvider、MultiProvider。Riverpod — Provider 的现代替代品:编译安全、独立于 BuildContext。Bloc — 事件驱动架构:Cubit(简单事件)vs Bloc(复杂)。GetX — 轻量级状态管理 + DI + 路由。setState — 最简单,用于本地状态。IT Sectr 建议新项目使用 Riverpod,现有项目使用 Provider。
MediaQuery — 屏幕大小、方向、平台、textScaleFactor。MediaQuery.of(context).size.width。ThemeData — 应用主题:颜色、字体、形状。Theme.of(context).textTheme.bodyLarge。Hot Reload — 向正在运行的应用注入代码。保持状态。不支持:更改 main()、全局变量、静态字段。Hot Restart — 完全重启应用(状态丢失)。Hot Reload — Flutter 对开发者的主要优势。
| Widget 类型 | 描述 | 示例 |
|---|---|---|
| StatelessWidget | 不可变,build 一次 | Text, Icon, Padding, Center |
| StatefulWidget | 可变,setState 重建 | TextField, Checkbox, AnimationController |
| InheritedWidget | 向下传递数据 | Theme, MediaQuery, Navigator |
| ProxyWidget | 其他 Widget 的包装 | ParentDataWidget (Positioned, Expanded) |
| RenderObjectWidget | 创建 RenderObject | Column, Row, Stack(自定义) |
StatelessWidget — 用于静态内容。StatefulWidget — 用于动态内容。InheritedWidget — 用于 DI。IT Sectr 默认建议使用 StatelessWidget,仅在需要时使用 StatefulWidget。
LayoutBuilder — 适应父级尺寸。OrientationBuilder — 适应方向。Expanded vs Flexible — Row/Column 中的空间分配。MediaQuery — 平板和桌面的断点。SafeArea — 系统元素(刘海、状态栏)的边距。AspectRatio — 保持比例。IT Sectr 建议自适应布局使用 LayoutBuilder,横向使用 OrientationBuilder。
单元测试 — 测试业务逻辑、仓库、模型。dart test — 运行。Widget 测试 — 隔离测试 Widget。WidgetTester — pumpWidget、tap、enterText。集成测试 — 在真实设备/模拟器上的完整场景。Mockito — 模拟依赖项。Golden 测试 — 截图比较(golden 文件)。IT Sectr 建议每个屏幕进行 Widget 测试,业务逻辑进行单元测试。
void main() {
testWidgets('Counter increments on tap', (tester) async {
await tester.pumpWidget(const MaterialApp(home: CounterWidget()));
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byType(FloatingActionButton));
await tester.pump();
expect(find.text('1'), findsOneWidget);
});
}隐式动画 — AnimatedContainer、AnimatedOpacity、AnimatedPadding、TweenAnimationBuilder。属性更改自动动画化。显式动画 — 带 Tween 的 AnimationController。forward() / reverse()。Hero 动画 — 带标签的 Hero Widget — 屏幕间的过渡动画。交错动画 — 使用 Interval 的动画链。Lottie — After Effects 动画集成。Rive — 交互式动画(状态机)。IT Sectr 建议 80% 的情况使用 AnimatedContainer,复杂场景使用 AnimationController。
class AnimatedBox extends StatefulWidget {
@override
State<AnimatedBox> createState() => _AnimatedBoxState();
}
class _AnimatedBoxState extends State<AnimatedBox> {
bool _expanded = false;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => setState(() => _expanded = !_expanded),
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
width: _expanded ? 200 : 100,
height: _expanded ? 200 : 100,
color: _expanded ? Colors.blue : Colors.red,
child: const Center(child: Text('Tap me')),
),
);
}
}http — 简单 HTTP 客户端(get、post、put、delete)。dio — 高级客户端,支持拦截器、超时、重试、日志记录。graphql_flutter — Flutter 的 GraphQL 客户端。json_serializable — 通过注解生成 fromJson/toJson。Retrofit Dart — 类似 Retrofit 的类型安全 HTTP 客户端。WebSocket — 通过 web_socket_channel。Firebase — Cloud Firestore、Realtime Database、Cloud Functions。IT Sectr 建议 REST API 使用 dio,GraphQL 使用 graphql_flutter。
Flutter DevTools — 工具集:Inspector(Widget 树)、Timeline(性能)、Memory、Network、Logging。Profile mode — 无调试的分析。Performance overlay — FPS、构建时间。Flame chart — 火焰图跟踪。DevTools — 在生产中优化 Flutter 应用的必备工具。
Flutter Web — 将 Flutter 编译为 WASM(WebAssembly)。CanvasKit(Skia)vs HTML renderer。CanvasKit — 像素完美,但更重。HTML renderer — 轻量,但有局限性。WASM(Flutter 3.22+)— 原生性能。通过 LayoutBuilder 和 MediaQuery 进行响应式适配。IT Sectr 建议桌面 Web 应用使用 CanvasKit,内容网站使用 HTML renderer。
常见问题
StatelessWidget — 不可变,build 一次。StatefulWidget — 带可变 State 和 setState()。
Widget Tree — 配置。Element Tree — 桥梁。RenderObject Tree — 渲染(大小、绘制)。
BuildContext — Widget 在树中的位置。InheritedWidget — 向下传递数据(Theme, MediaQuery)。
Navigator — 屏幕栈。push() → pop()。Named Routes — 字符串名称。Navigator 2.0 — 声明式。
Hot Reload — 1-2 秒内注入代码,保持状态。Hot Restart — 完全重启。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。