环境搭建与第一个应用

Flutter 的环境问题几乎是新手遇到的第一道坎,而且绝大多数报错都能用一条 flutter doctor 定位。本章按"装 SDK → 装 IDE → 逐项过 doctor → 建项目 → 跑起来"的顺序走一遍,并解释 main.dart 的结构、热重载与热重启的区别,以及 pubspec.yaml 与各平台目录各自负责什么。

第一步:安装 Flutter SDK

下载稳定版(stable)压缩包或使用官方安装包,解压到不含中文与空格的路径,然后把 flutter/bin 加入 PATH。

# Windows 用 PowerShell 验证;macOS/Linux 用 which flutter
flutter --version
flutter doctor

首次执行 flutter doctor 会联网下载 Dart SDK 与引擎产物,耗时较长属于正常现象。

第二步:装 IDE 与插件

IDE必装插件说明
Android StudioFlutter、Dart自带 Android SDK 与模拟器管理,调试体验最完整
VS CodeFlutter、Dart轻量,配合 DevTools 足够日常开发
IntelliJ IDEAFlutter、Dart已习惯 Java 系工具链的团队可用

命令面板里的 Flutter: Select DeviceFlutter: Hot Reload 是日常最高频的两个操作。

第三步:逐项排查 flutter doctor

flutter doctor 的每一项都有明确的修复路径,按下面的表对症处理即可:

报错项常见原因处理方式
Android toolchain 缺失未装 Android SDK 或许可未接受安装 Android Studio 并执行 flutter doctor --android-licenses
Android license status unknown许可协议未接受同上,逐条输入 y 确认
Xcode 未配置未装 Xcode 或未装命令行工具macOS 上执行 xcode-select --install 并同意协议
CocoaPods not installediOS 依赖管理器缺失sudo gem install cocoapods
Chrome 未找到未装 Chrome,无法跑 Web安装 Chrome,或在支持桌面端时用 -d windows
卡在 "Downloading"网络受限配置国内镜像环境变量后重试
# 国内网络常见做法:为 pub 与引擎产物配置镜像
set PUB_HOSTED_URL=https://pub.flutter-io.cn
set FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
flutter doctor -v

第四步:创建并运行第一个项目

flutter create my_app
cd my_app
flutter pub get
flutter run -d chrome       # 运行到浏览器
flutter run -d windows      # 运行到 Windows 桌面
flutter run -d android      # 运行到 Android 设备或模拟器
# 出包:flutter build apk --release / flutter build appbundle / flutter build web --release

flutter create 会生成一套包含全平台目录的工程;如果只做某个端,可以用 --platforms=android,ios 只生成需要的平台目录。

main.dart 的结构

lib/main.dart 是应用入口,结构只有三层:入口函数、根 Widget、页面 Widget。

import 'package:flutter/material.dart';

void main() {
  // 入口:绑定引擎后挂载根 Widget
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // MaterialApp 提供主题、路由与本地化等全局能力
    return MaterialApp(
      title: '第一个应用',
      theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo)),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _count = 0; // 状态放在 State 里,修改后界面自动刷新

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('计数器')),
      body: Center(child: Text('点击了 $_count 次')),
      floatingActionButton: FloatingActionButton(
        onPressed: () => setState(() => _count++),
        child: const Icon(Icons.add),
      ),
    );
  }
}

热重载 vs 热重启

对比项热重载 Hot Reload(r热重启 Hot Restart(R
作用范围重建 Widget 树,保留 State重新执行 main(),State 清空
生效速度通常 1 秒内数秒
何时用改 UI、改样式、改 build 逻辑main()、改全局变量、状态被写坏

在终端按 r 触发热重载、R 触发热重启;VS Code 里保存文件即可自动热重载。

项目目录结构

路径作用
lib/你的 Dart 代码,只有这里的文件参与编译
android/Android 工程,改包名、权限、签名时进来
ios/iOS 工程,改 Info.plist、Podfile 时进来
web/Web 入口与 index.html
test/单元测试与 Widget 测试
pubspec.yaml依赖、资源、字体、SDK 版本约束
build/编译产物,不要提交到版本库

小结:环境问题先用 flutter doctor -v 定位再动手修,建好工程后用 flutter run -d chrome 快速验证;lib/ 放业务代码、pubspec.yaml 管依赖与资源,日常开发用热重载、状态写坏时用热重启。

笔记加载中…