Flutter入门:从零开始构建跨平台应用,小白也能上手

MySQL修理工
2026-01-15 11:54
阅读 4313

大家好,我是一名从培训班走出来的前端开发者,现在也兼职做移动开发讲师。这几年带过不少零基础的学员,深知刚接触新框架时那种“看文档像天书”的焦虑感。今天写这篇《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

  1. 访问 https://flutter.dev 官网
  2. 下载对应系统的安装包(Windows / macOS / Linux)
  3. 解压到一个路径,比如 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 更轻量,插件也够用。

  1. 安装 VS Code
  2. 安装官方插件: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/color
  • Center:居中

来看个例子:

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% 都能搜到答案

推荐学习路径:

  1. 基础:Widget、布局、状态管理(setState)
  2. 进阶:Navigator 路由、网络请求、本地存储(SharedPreferences)
  3. 工程化:Provider 状态管理、单元测试、发布 App
  4. 拓展:集成 Firebase、调用原生功能(Platform Channel)

求职方向建议:

  • 如果你是前端转 Flutter:强调“跨端能力”和“UI 实现效率”
  • 如果你是后端想全栈:用 SpringBoot 写 API + Flutter 做客户端,打造完整作品集
  • 实习岗最爱:能跑起来的 Demo > 空洞的理论

结语:你的第一个 App,已经完成了!

看到这里,你已经掌握了 Flutter 的核心逻辑。那个待办 App 虽然简单,但它包含了真实项目 80% 的要素:用户输入、状态更新、列表渲染。

记住:编程不是背语法,而是解决问题。 我当初培训班毕业时,也是靠一个粗糙但能跑的 App 拿到了第一份工作。

下一步,试着给 Todo App 加个“完成/未完成”状态,或者连上你自己的 SpringBoot 后端。每完成一个小功能,你就离“开发者”更近一步。

加油!有问题欢迎留言,我会尽力解答。

评论 0

最热最新
暂无评论
MySQL修理工Lv.1
0
影响力
0
文章
0
粉丝