一、前言:为什么选择Flutter?
在移动开发领域,跨平台框架层出不穷。而Flutter凭借其高性能、高一致性、热重载(Hot Reload)等优势,迅速成为 Google 主推的 UI 框架,并被阿里巴巴、腾讯、字节跳动等大厂广泛采用。
Flutter 使用Dart 语言开发,一套代码可同时编译为iOS 和 Android 应用,甚至支持 Web、Windows、macOS 和 Linux!
🎯本文目标:
- 带你快速搭建 Flutter 开发环境
- 实现一个简单的“计数器”App
- 展示 Flutter 的核心组件与布局方式
- 提供完整可运行代码 + 截图演示
二、开发环境准备
1. 安装 Flutter SDK
前往官网下载:https://docs.flutter.dev/get-started/install
支持系统:Windows / macOS / Linux
# 验证安装是否成功 flutter --version2. 安装编辑器(推荐)
- Android Studio+ Flutter 插件
- 或VS Code+ Flutter/Dart 插件
3. 连接设备或启动模拟器
# 启动安卓模拟器或连接真机 flutter devices✅ 环境就绪后,我们开始创建项目!
三、创建你的第一个 Flutter 项目
使用命令行创建项目:
flutter create my_first_flutter_app cd my_first_flutter_app然后使用以下命令运行项目:
flutter run首次运行会较慢(需要下载依赖和编译),稍等片刻即可看到默认的计数器界面👇
https://img-blog.csdnimg.cn/202406/flutter_default_counter.png
💡 图注:这是 Flutter 自动生成的初始项目界面 —— 一个带按钮的计数器。
四、代码解析:main.dart 文件详解
打开lib/main.dart,这是整个应用的入口文件。
import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter 入门教程', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: '我的第一个 Flutter App'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({required this.title, super.key}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text( '你点击了按钮多少次?', style: TextStyle(fontSize: 18), ), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: '增加', child: const Icon(Icons.add), ), ); } }五、核心知识点讲解(配图说明)
1.MaterialApp与Scaffold
Flutter 提供了丰富的 Material Design 组件。
| 组件 | 功能 |
|---|---|
MaterialApp | 整体应用容器,提供主题、路由等 |
Scaffold | 页面骨架,包含 AppBar、Body、FloatingActionButton |
📌 结构示意如下:
https://img-blog.csdnimg.cn/202406/flutter_scaffold_layout.png
图解:
Scaffold构建了一个标准的 Material 页面布局。
2. Widget 树(Widget Tree)
Flutter 中“万物皆 Widget”。UI 是由嵌套的 Widget 构成的树形结构。
Center └── Column ├── Text('你点击了...') └── Text('$_counter')📌 示例图展示 Widget 嵌套关系:
https://img-blog.csdnimg.cn/202406/flutter_widget_tree.png
✅ 所有 UI 元素都是不可变的 Widget,通过
setState()触发重建更新界面。
3. StatefulWidget vs StatelessWidget
| 类型 | 特点 | 使用场景 |
|---|---|---|
StatelessWidget | 无内部状态,构建后不变 | 静态文本、图标 |
StatefulWidget | 有可变状态,可通过setState()更新 | 按钮点击、表单输入 |
👉 在本例中,MyHomePage是 StatefulWidget,因为它需要维护_counter变量。
六、自定义 UI 改进版(实战增强)
下面我们对原界面进行美化,加入颜色、圆角、动画效果。
✅ 改进后的效果预览:
https://img-blog.csdnimg.cn/202406/flutter_enhanced_counter.png
🧩 更新代码(替换MyHomePageState.build方法):
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), centerTitle: true, ), body: Container( decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [Colors.indigo, Colors.purple], ), ), child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "当前计数", style: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 10), AnimatedContainer( duration: const Duration(milliseconds: 300), padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: _counter > 5 ? Colors.orange : Colors.white, borderRadius: BorderRadius.circular(15), boxShadow: [ BoxShadow( blurRadius: 10, color: Colors.black.withOpacity(0.2), ) ], ), child: Text( '$_counter', style: TextStyle( fontSize: 60, fontWeight: FontWeight.bold, color: _counter > 5 ? Colors.white : Colors.purple, ), ), ), const SizedBox(height: 30), ElevatedButton.icon( onPressed: _incrementCounter, icon: const Icon(Icons.plus_one), label: const Text("点我加一"), style: ElevatedButton.styleFrom( backgroundColor: Colors.yellow[700], foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), ), ), ], ), ), ), ); }🔍 功能亮点说明:
| 特性 | 说明 |
|---|---|
LinearGradient背景 | 渐变背景提升视觉美感 |
AnimatedContainer | 数字框颜色随计数变化并带动画 |
ElevatedButton.icon | 带图标的按钮更直观 |
| 条件样式 | 当_counter > 5时背景变橙色 |
七、运行效果演示(GIF 动图)
https://img-blog.csdnimg.cn/202406/flutter_counter_demo.gif
✅ 点击按钮,数字平滑增长,背景色渐变动效流畅自然!
八、常见问题 FAQ
❓ Q1:Flutter 和 React Native 有什么区别?
| 对比项 | Flutter | React Native |
|---|---|---|
| 渲染机制 | 自绘引擎(Skia) | 原生组件桥接 |
| 性能 | 更高(接近原生) | 略低(依赖桥接) |
| 语言 | Dart | JavaScript/TypeScript |
| UI 一致性 | 极高 | 平台差异明显 |
❓ Q2:如何调试 Flutter 应用?
- 使用
print()输出日志 - VS Code / Android Studio 内置调试器
- 使用
debugPaintSizeEnabled = true查看布局边界:
import 'package:flutter/rendering.dart'; void main() { // 开启布局边框调试 debugPaintSizeEnabled = true; runApp(const MyApp()); }效果如下:
https://img-blog.csdnimg.cn/202406/flutter_debug_layout.png
九、总结与学习建议
🎉恭喜你完成了第一个 Flutter 应用!
✅ 本文收获:
- 掌握了 Flutter 项目创建流程
- 理解了
StatefulWidget与StatelessWidget区别 - 学会使用常用组件:
Text,Column,Scaffold,ElevatedButton - 实践了 UI 美化与简单动画
📚 下一步学习路径推荐:
- Flutter 官方文档
- 学习
Navigator实现页面跳转 - 接入网络请求(
http或dio包) - 使用
Provider或Riverpod管理状态 - 发布到应用商店(iOS App Store / 安卓各大市场)
十、源码下载
📁 GitHub 仓库地址:https://github.com/example/flutter-counter-tutorial
欢迎 Star ⭐ 和 Fork!