Flutter入门:从零开始构建跨平台应用,小白也能上手
大家好,我是一名从培训班走出来的前端开发者,现在也兼职做移动开发讲师。这几年带过不少零基础的学员,深知刚接触新框架时那种“看文档像天书”的焦虑感。今天写这篇《Flutter入门》教程,就是想用最接地气的方式,带你从零搭建第一个跨平台App——不用懂Dart,不用会原生开发,只要会点HTML/CSS,你就能跟上。
顺便说一句,虽然标题里有“Flutter”,但文末我会聊聊为什么学Flutter对求职有帮助,甚至和后端主流的 SpringBoot 项目如何配合——这可是很多新手忽略的实战视角。
一、Flutter 是什么?能干啥?
简单说:Flutter 是 Google 推出的 UI 工具包,让你用一套代码同时开发 iOS 和 Android 应用,甚至还能跑在 Web、Windows、Mac 上。
我当初学的时候以为它和 React Native 一样,都是“桥接”原生组件。其实完全不是!Flutter 是自己画 UI 的,不依赖系统原生控件,所以性能更高、界面更统一。
为什么选择 Flutter?
- ✅ 热重载(Hot Reload):改代码秒看效果,不用反复编译
- ✅ 高性能:直接编译成机器码,接近原生体验
- ✅ UI 一致性:iOS 和 Android 看起来一模一样(也可以差异化)
- ✅ 就业加分项:越来越多公司用 Flutter 做 MVP 或内部工具
⚠️ 注意:Flutter 不是后端框架!它只负责“前端”界面。如果你要做完整 App,通常要搭配后端 API,比如用 SpringBoot 写的服务。
二、环境搭建:5 步搞定开发环境
别怕!虽然看起来步骤多,但按顺序操作,10 分钟就能跑起来。
第 1 步:安装 Flutter SDK
- 访问 https://flutter.dev 官网
- 下载对应系统的安装包(Windows / macOS / Linux)
- 解压到一个路径,比如
C:\flutter或~/development/flutter
第 2 步:配置环境变量
- Windows:把
C:\flutter\bin加到 PATH - macOS/Linux:在
~/.bashrc或~ ~/.zshrc中加一行:export PATH="$PATH:`pwd`/flutter/bin"
第 3 步:运行 flutter doctor
打开终端,输入:
flutter doctor
它会检查你的环境缺什么。常见问题:
- 缺 Android Studio → 下载安装
- 缺 Android SDK → 在 Android Studio 里装
- 缺 Xcode(macOS)→ App Store 安装
💡 我当初卡在
Android license status unknown,解决方法是运行:flutter doctor --android-licenses然后一路按 y 回车。
第 4 步:安装 IDE(推荐 VS Code)
虽然 Android Studio 也能用,但 VS Code 更轻量,插件也够用。
- 安装 VS Code
- 安装官方插件:Flutter 和 Dart
第 5 步:创建第一个项目
在终端执行:
flutter create my_first_app
cd my_first_app
flutter run
如果一切顺利,模拟器会启动,显示一个计数器页面!
✅ 小技巧:用
flutter run --no-sound-null-safety可以跳过空安全检查(新手友好)
三、核心概念:用“搭积木”理解 Flutter
Flutter 的核心思想是:一切皆 Widget(组件)。
1. Widget 是什么?
你可以把它理解为“UI 元素”。比如:
- 一个按钮 →
ElevatedButton - 一段文字 →
Text - 一张图片 →
Image - 一个页面 →
Scaffold
2. 两种 Widget
| 类型 | 特点 | 常见例子 |
|---|---|---|
| StatelessWidget | 静态,数据不变 | Icon, Text, Image |
| StatefulWidget | 动态,可交互 | Checkbox, Slider, 计数器 |
我当初死记硬背“有状态/无状态”,后来才明白:只要 UI 会变(比如点击后数字+1),就用 StatefulWidget。
3. 布局:用“盒子套盒子”排版
Flutter 没有 CSS,布局靠嵌套 Widget。常用布局组件:
Column:垂直排列Row:水平排列Container:类似 div,可加 padding/margin/colorCenter:居中
来看个例子:
Column(
children: [
Text('你好,Flutter!'),
ElevatedButton(
onPressed: () {},
child: Text('点我'),
),
],
)
这段代码会垂直显示一行文字 + 一个按钮。
四、实战:做一个“待办事项”App
我们来做一个超简单的 Todo List,涵盖:
- 显示列表
- 添加任务
- 删除任务
第 1 步:修改 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: '我的待办',
theme: ThemeData(primarySwatch: Colors.blue),
home: const TodoPage(),
);
}
}
第 2 步:创建 TodoPage(有状态组件)
class TodoPage extends StatefulWidget {
const TodoPage({super.key});
@override
State<TodoPage> createState() => _TodoPageState();
}
class _TodoPageState extends State<TodoPage> {
final List<String> todos = [];
final TextEditingController _controller = TextEditingController();
void _addTodo() {
if (_controller.text.isNotEmpty) {
setState(() {
todos.add(_controller.text);
_controller.clear();
});
}
}
void _removeTodo(int index) {
setState(() {
todos.removeAt(index);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('待办事项')),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: const InputDecoration(hintText: '输入新任务'),
),
),
IconButton(
icon: const Icon(Icons.add),
onPressed: _addTodo,
),
],
),
),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(todos[index]),
trailing: IconButton(
icon: const Icon(Icons.delete, color: Colors.red),
onPressed: () => _removeTodo(index),
),
);
},
),
),
],
),
);
}
}
代码解析:
StatefulWidget:因为任务列表会变TextEditingController:控制输入框内容setState():关键! 告诉 Flutter “UI 要更新了”ListView.builder:高效渲染长列表
💡 新手常犯错误:忘记写
setState(),导致点了按钮没反应!
第 3 步:运行看看
flutter run
你应该能看到一个可以添加/删除任务的 App!
五、新手常见问题 & 解决方案
Q1:为什么改了代码没生效?
- 原因:没触发
setState(),或者热重载失效 - 解决:按
r键手动热重载,或重启(按R)
Q2:Widget 嵌套太深,代码乱成一团?
- 建议:把大组件拆成小函数或小类
Widget _buildAddBar() { ... }
Q3:怎么调样式?margin/padding 怎么加?
- Flutter 用
EdgeInsets控制间距:Container( margin: const EdgeInsets.all(16), // 外边距 padding: const EdgeInsets.symmetric(horizontal: 8), // 内边距 child: Text('内容'), )
Q4:能和 SpringBoot 后端通信吗?
当然可以! Flutter 用 http 包发请求:
// 先在 pubspec.yaml 加依赖
dependencies:
http: ^0.13.0
// 然后在代码中
final response = await http.get(Uri.parse('http://your-springboot-api/tasks'));
📌 求职提示:如果你简历写“用 Flutter + SpringBoot 做过全栈项目”,面试官会眼前一亮!
六、学习建议 & 下一步路线
避坑指南(血泪经验):
- ❌ 别一上来就学 Riverpod/Bloc —— 先掌握
setState - ❌ 别纠结“最佳实践”——先做出东西再说
- ✅ 多用
print()调试,比断点简单 - ✅ 遇到报错,先看红色错误信息,90% 都能搜到答案
推荐学习路径:
- 基础:Widget、布局、状态管理(setState)
- 进阶:Navigator 路由、网络请求、本地存储(SharedPreferences)
- 工程化:Provider 状态管理、单元测试、发布 App
- 拓展:集成 Firebase、调用原生功能(Platform Channel)
求职方向建议:
- 如果你是前端转 Flutter:强调“跨端能力”和“UI 实现效率”
- 如果你是后端想全栈:用 SpringBoot 写 API + Flutter 做客户端,打造完整作品集
- 实习岗最爱:能跑起来的 Demo > 空洞的理论
结语:你的第一个 App,已经完成了!
看到这里,你已经掌握了 Flutter 的核心逻辑。那个待办 App 虽然简单,但它包含了真实项目 80% 的要素:用户输入、状态更新、列表渲染。
记住:编程不是背语法,而是解决问题。 我当初培训班毕业时,也是靠一个粗糙但能跑的 App 拿到了第一份工作。
下一步,试着给 Todo App 加个“完成/未完成”状态,或者连上你自己的 SpringBoot 后端。每完成一个小功能,你就离“开发者”更近一步。
加油!有问题欢迎留言,我会尽力解答。

评论 0