想学好Flutter,Dart语言是绕不开的基石——Flutter的框架代码、业务逻辑全靠Dart实现。很多新手觉得“先学语言再学框架”麻烦,实则不然:Dart专为Flutter优化,语法简洁且与Java、JavaScript有共通之处,花1-2天掌握核心语法,后续Flutter开发会顺畅十倍。本文拒绝晦涩概念,用“语法讲解+代码演示+Flutter关联”的模式,带你快速入门Dart。

Flutter入门先学Dart:零基础也能懂的核心语法与实战技术文章大纲

Dart语言基础概述
  • Dart的设计理念与特性(面向对象、强类型、JIT/AOT编译)
  • Dart在Flutter生态中的核心作用
  • 开发环境配置(安装Dart SDK、IDE插件推荐)
变量与数据类型
  • 变量的声明与类型推断(varfinalconst的区别)
  • 基本数据类型:intdoubleStringbool
  • 集合类型:ListMapSet的用法与常见操作
函数与面向对象编程
  • 函数的定义与参数传递(命名参数、可选参数、默认值)
  • 箭头函数与匿名函数(=>语法)
  • 类的定义与实例化:属性、方法、构造函数(命名构造函数、factory关键字)
  • 继承与接口:extendsimplementsmixin的使用场景
异步编程与高级特性
  • Futureasync/await处理异步任务
  • Stream的概念与实际应用(监听数据流)
  • 空安全(Null Safety)机制与?!操作符
  • 扩展方法(Extension Methods)与操作符重载
实战案例:Dart与Flutter结合
  • 使用Dart编写简单的Flutter组件(如按钮、文本输入)
  • 通过Dart实现数据解析(JSON转模型类)
  • 状态管理初步:用Dart实现计数器逻辑
学习资源与进阶建议
  • 官方文档与社区推荐工具(Dart Pad、Flutter SDK)
  • 常见错误排查与调试技巧
  • 进阶学习路线(如Isolate、泛型、设计模式)

一、前置准备:10分钟搞定Dart开发环境

Dart环境可单独配置,也可借助Flutter环境自动集成(推荐后者,避免重复操作),两种方式任选其一:

1.1 方式1:随Flutter自动安装(推荐)

安装Flutter SDK后,Dart会作为依赖自动配置完成,步骤如下:

  1. 下载Flutter SDK:从Flutter官网选择对应系统版本,解压到本地目录(如D:\flutter)

  2. 配置环境变量: Windows:右键“此电脑”→属性→高级系统设置→环境变量,在“用户变量”的Path中添加“D:\flutter\bin”

  3. Mac:打开终端,执行echo 'export PATH="$PATH:/Users/你的用户名/flutter/bin"' >> ~/.bash_profile,再执行source ~/.bash_profile

  4. 验证:打开终端,执行dart --version,出现“Dart SDK version: 3.x.x”即为成功

1.2 方式2:单独安装Dart SDK

若仅学习Dart,可单独安装:

  • Windows:从Dart官网下载安装包,勾选“Add Dart to PATH”完成安装

  • Mac:终端执行brew install dart(需先安装Homebrew)

1.3 推荐开发工具

与Flutter开发工具统一,减少切换成本:

  • 主力工具:Android Studio(装Dart、Flutter插件)或VS Code(装Dart、Flutter扩展)

  • 快速测试:终端直接执行Dart脚本(dart 文件名.dart

二、Dart核心语法:从变量到函数,掌握这些就够了

Dart是强类型语言,但支持类型推断,语法灵活。以下是Flutter开发中最常用的核心语法,优先掌握这些知识点。

2.1 变量与常量:类型明确是好习惯

Dart变量声明有两种方式,推荐指定类型(增强代码可读性,Flutter项目中强制规范):

// 1. 明确类型声明(推荐)
String name = "Flutter学习者"; // 字符串
int age = 25; // 整数
double height = 1.75; // 浮点数
bool isStudy = true; // 布尔值

// 2. 类型推断(var关键字,Dart自动判断类型)
var address = "北京市"; // 自动推断为String
var score = 98.5; // 自动推断为double

// 常量:值不可修改,两种声明方式
final String school = "XX大学"; // 运行时确定值
const int maxScore = 100; // 编译时确定值(性能更优,优先用)

Flutter关联:在Widget中定义状态变量时,常用final修饰不可变Widget,用var简化临时变量声明。

2.2 常用数据类型:重点记List和Map

Dart的基础数据类型与其他语言类似,重点掌握集合类型(List、Map),Flutter中频繁用到:

2.2.1 字符串(String)
// 字符串定义
String str1 = "双引号";
String str2 = '单引号';
String str3 = '''多行字符串
可以换行
不用加转义符''';

// 字符串拼接
String fullName = "张" + "三"; // 加号拼接
String info = "姓名:$name,年龄:$age"; // 插值表达式(推荐,简洁)
String detail = "分数:${score + 1.5}"; // 复杂表达式用${}
2.2.2 列表(List):对应其他语言的数组
// 1. 固定类型的List(推荐)
List<String> fruits = ["苹果", "香蕉", "橙子"]; // 只能存字符串
List<int> numbers = [1, 2, 3, 4];

// 2. 动态类型的List(可存任意类型,不推荐)
List dynamicList = [1, "hello", true];

// 常用操作
fruits.add("葡萄"); // 添加元素
fruits.removeAt(0); // 删除索引0的元素
print(fruits.length); // 获取长度:3
print(fruits[1]); // 访问索引1的元素:香蕉

Flutter关联:ListView组件的children参数就是一个List<Widget>,用于存放子组件。

2.2.3 映射(Map):键值对集合
// 1. 固定键值类型的Map(推荐)
Map<String, dynamic> user = {
  "name": "李四",
  "age": 28,
  "isStudent": false
};

// 2. 构造函数创建
Map<int, String> scoreMap = Map();
scoreMap[1] = "优秀";
scoreMap[2] = "良好";

// 常用操作
print(user["name"]); // 获取值:李四
user["age"] = 29; // 修改值
user.remove("isStudent"); // 删除键值对
print(user.keys); // 获取所有键:(name, age)

Flutter关联:网络请求返回的JSON数据,通常会转为Map类型处理;Widget的属性配置也常用Map传递参数。

2.3 流程控制:和Java基本一致

if-else、for、while等流程控制语句,语法与Java、JavaScript高度相似,重点掌握for循环遍历集合:

// 1. if-else
if (age > 18) {
  print("成年");
} else if (age == 18) {
  print("刚成年");
} else {
  print("未成年");
}

// 2. for循环遍历List
for (int i = 0; i < fruits.length; i++) {
  print(fruits[i]);
}

// 简化for循环(推荐)
for (String fruit in fruits) {
  print(fruit);
}

// 3. 循环遍历Map
user.forEach((key, value) {
  print("$key: $value");
});

// 4. switch-case
switch (score >= 60) {
  case true:
    print("及格");
    break;
  case false:
    print("不及格");
    break;
}

2.4 函数:Dart的核心,支持高阶函数

函数是代码复用的核心,Dart函数支持默认参数、可选参数,这在Flutter中配置Widget时非常实用:

2.4.1 基本函数定义
// 函数格式:返回值类型 函数名(参数类型 参数名) { 函数体 }
int add(int a, int b) {
  return a + b;
}

// 简化写法(单表达式函数)
int subtract(int a, int b) => a - b; // 等价于return a - b;

// 无返回值函数(返回值为void,可省略)
void printInfo(String info) {
  print("信息:$info");
}
2.4.2 可选参数与默认参数

Flutter中Widget的构造函数大量使用可选参数,必须掌握:

// 1. 可选位置参数:用[]包裹,必须放在参数列表最后
String getPersonInfo(String name, [int? age, String? address]) {
  // ?表示该参数可为null
  String info = "姓名:$name";
  if (age != null) info += ",年龄:$age";
  if (address != null) info += ",地址:$address";
  return info;
}
// 调用:可传1个、2个或3个参数
print(getPersonInfo("张三")); // 姓名:张三
print(getPersonInfo("张三", 25)); // 姓名:张三,年龄:25

// 2. 可选命名参数:用{}包裹,调用时需指定参数名(推荐,可读性高)
String getStudentInfo({String? name, int age = 18, String address = "未知"}) {
  // 可设置默认值,不传参时使用默认值
  return "姓名:$name,年龄:$age,地址:$address";
}
// 调用:参数顺序可任意
print(getStudentInfo(name: "李四", address: "上海市")); 
// 姓名:李四,年龄:18,地址:上海市

Flutter关联:Text组件的构造函数就是可选命名参数,如Text("Hello", style: TextStyle(fontSize: 18))

2.4.3 匿名函数与高阶函数

Dart支持将函数作为参数传递,这是Flutter状态管理、异步操作的基础:

// 1. 匿名函数(无函数名,常用于临时调用)
var sum = (int a, int b) => a + b;
print(sum(3, 5)); // 8

// 2. 高阶函数:函数作为参数
void calculate(int a, int b, Function(int, int) operation) {
  print(operation(a, b));
}
// 调用:传递匿名函数
calculate(10, 5, (x, y) => x * y); // 50
calculate(10, 5, (x, y) => x / y); // 2.0

Flutter关联:ListView.builderitemBuilder参数就是一个匿名函数,用于构建列表项。

2.5 面向对象:Dart的核心特性

Dart是纯面向对象语言,一切皆对象。Flutter的Widget本质就是类,必须掌握类与对象的基本用法:

2.5.1 类的定义与实例化
// 定义类
class Person {
  // 成员变量(属性)
  String? name;
  int? age;

  // 构造函数(简化写法,等价于给属性赋值)
  Person(this.name, this.age);

  // 成员方法
  void introduce() {
    print("我叫$name,今年$age岁");
  }
}

// 实例化对象
Person person = Person("王五", 30);
person.introduce(); // 我叫王五,今年30岁
person.age = 31; // 修改属性值
person.introduce(); // 我叫王五,今年31岁
2.5.2 继承与多态

Flutter中Widget的继承体系非常复杂,掌握基础继承语法很有必要:

// 父类
class Animal {
  String? name;

  Animal(this.name);

  // 父类方法
  void eat() {
    print("$name在吃东西");
  }
}

// 子类继承父类(用extends关键字)
class Dog extends Animal {
  // 子类构造函数:先调用父类构造函数
  Dog(String name) : super(name);

  // 重写父类方法(用@override注解)
  @override
  void eat() {
    print("$name在吃骨头");
  }

  // 子类特有方法
  void bark() {
    print("$name在汪汪叫");
  }
}

// 实例化子类
Dog dog = Dog("旺财");
dog.eat(); // 旺财在吃骨头(重写后的方法)
dog.bark(); // 旺财在汪汪叫(子类特有方法)

// 多态:父类引用指向子类对象
Animal animal = Dog("小白");
animal.eat(); // 小白在吃骨头(调用子类重写的方法)

Flutter关联:StatelessWidgetStatefulWidget是Flutter的核心父类,我们自定义的Widget都要继承它们。

2.6 异步操作:Future与async/await

Flutter中网络请求、文件读写等耗时操作都用异步实现,Dart的异步语法是重点也是难点:

2.6.1 Future:表示异步操作的结果
// 模拟耗时操作(如网络请求)
Future<String> fetchData() {
  // 延迟2秒返回结果
  return Future.delayed(Duration(seconds: 2), () {
    return "获取到的数据:{name: '赵六'}";
  });
}

// 调用异步函数(方式1:用then接收结果)
fetchData().then((data) {
  print(data); // 2秒后打印结果
}).catchError((error) {
  print("错误:$error"); // 捕获异常
});
2.6.2 async/await:简化异步代码(推荐)

then链式调用易造成“回调地狱”,用async/await可将异步代码写得像同步代码:

// 异步函数:用async修饰,内部可使用await
void getData() async {
  try {
    // 等待异步操作完成,获取结果
    String data = await fetchData();
    print(data); // 2秒后打印结果
  } catch (error) {
    print("错误:$error"); // 捕获异常
  }
}

// 调用异步函数
getData();

Flutter关联:FutureBuilder组件就是基于Future实现的,用于异步数据加载时的UI状态管理。

三、实战:用Dart写一个“Flutter学习计划”程序

结合以上知识点,写一个完整的Dart程序,模拟Flutter学习计划的管理,巩固核心语法:

// 定义学习计划类
class StudyPlan {
  String? content; // 学习内容
  int? day; // 第几天
  bool isCompleted; // 是否完成

  // 构造函数,默认未完成
  StudyPlan(this.day, this.content, {this.isCompleted = false});

  // 标记为已完成
  void complete() {
    isCompleted = true;
  }

  // 格式化输出
  String getPlanInfo() {
    String status = isCompleted ? "✅ 已完成" : "❌ 未完成";
    return "第$day天:$content - $status";
  }
}

// 主函数:程序入口
void main() {
  print("=== Flutter学习计划 ===");

  // 1. 创建学习计划列表
  List<StudyPlan> plans = [
    StudyPlan(1, "学习Dart基础语法"),
    StudyPlan(2, "搭建Flutter环境"),
    StudyPlan(3, "开发第一个Flutter App"),
    StudyPlan(4, "学习StatefulWidget状态管理")
  ];

  // 2. 标记第1天计划为已完成
  plans[0].complete();

  // 3. 遍历输出所有计划
  for (StudyPlan plan in plans) {
    print(plan.getPlanInfo());
  }

  // 4. 统计已完成和未完成的计划数量
  int completedCount = plans.where((plan) => plan.isCompleted).length;
  int unCompletedCount = plans.length - completedCount;

  print("\n=== 学习进度 ===");
  print("已完成:$completedCount 天");
  print("未完成:$unCompletedCount 天");
  print("完成率:${(completedCount / plans.length * 100).toStringAsFixed(1)}%");
}

// 运行结果:
// === Flutter学习计划 ===
// 第1天:学习Dart基础语法 - ✅ 已完成
// 第2天:搭建Flutter环境 - ❌ 未完成
// 第3天:开发第一个Flutter App - ❌ 未完成
// 第4天:学习StatefulWidget状态管理 - ❌ 未完成
// 
// === 学习进度 ===
// 已完成:1 天
// 未完成:3 天
// 完成率:25.0%

四、Dart学习资源与Flutter衔接建议

4.1 推荐学习资源

  • 官方文档:Dart官方指南(权威,有中文版)

  • 在线练习:DartPad(无需安装环境,直接在浏览器写Dart代码)

  • 配套书籍:《Flutter实战》(前两章专门讲Dart,与Flutter结合紧密)

4.2 衔接Flutter的建议

  1. 不用追求Dart精通再学Flutter,掌握本文核心语法即可开始

  2. 学习Flutter时,遇到陌生的Dart语法(如扩展方法、泛型),再回头针对性补充

  3. 多阅读Flutter源码(如Widget的实现),反向巩固Dart语法

Dart作为Flutter的“灵魂语言”,入门门槛不高,但需要在实际开发中不断巩固。建议先用本文的实战代码练习,再尝试将其改造成Flutter应用(比如用ListView展示学习计划,用按钮标记完成状态),实现从Dart到Flutter的无缝衔接。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐