Flutter入门先学Dart:零基础也能懂的核心语法与实战
本文是Flutter开发者快速掌握Dart语言的实用指南。文章首先强调Dart作为Flutter开发基础的重要性,指出其语法简洁且与Java/JavaScript相似,建议1-2天即可掌握核心语法。主要内容包括:开发环境配置(推荐随Flutter安装)、核心语法讲解(变量、集合、函数、面向对象等)、异步编程(Future和async/await)等Flutter开发必备知识点,并通过"F
想学好Flutter,Dart语言是绕不开的基石——Flutter的框架代码、业务逻辑全靠Dart实现。很多新手觉得“先学语言再学框架”麻烦,实则不然:Dart专为Flutter优化,语法简洁且与Java、JavaScript有共通之处,花1-2天掌握核心语法,后续Flutter开发会顺畅十倍。本文拒绝晦涩概念,用“语法讲解+代码演示+Flutter关联”的模式,带你快速入门Dart。
Flutter入门先学Dart:零基础也能懂的核心语法与实战技术文章大纲
Dart语言基础概述
- Dart的设计理念与特性(面向对象、强类型、JIT/AOT编译)
- Dart在Flutter生态中的核心作用
- 开发环境配置(安装Dart SDK、IDE插件推荐)
变量与数据类型
- 变量的声明与类型推断(
var、final、const的区别) - 基本数据类型:
int、double、String、bool - 集合类型:
List、Map、Set的用法与常见操作
函数与面向对象编程
- 函数的定义与参数传递(命名参数、可选参数、默认值)
- 箭头函数与匿名函数(
=>语法) - 类的定义与实例化:属性、方法、构造函数(命名构造函数、
factory关键字) - 继承与接口:
extends、implements、mixin的使用场景
异步编程与高级特性
Future与async/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会作为依赖自动配置完成,步骤如下:
-
下载Flutter SDK:从Flutter官网选择对应系统版本,解压到本地目录(如D:\flutter)
-
配置环境变量: Windows:右键“此电脑”→属性→高级系统设置→环境变量,在“用户变量”的Path中添加“D:\flutter\bin”
-
Mac:打开终端,执行
echo 'export PATH="$PATH:/Users/你的用户名/flutter/bin"' >> ~/.bash_profile,再执行source ~/.bash_profile -
验证:打开终端,执行
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.builder的itemBuilder参数就是一个匿名函数,用于构建列表项。
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关联:StatelessWidget和StatefulWidget是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 推荐学习资源
4.2 衔接Flutter的建议
-
不用追求Dart精通再学Flutter,掌握本文核心语法即可开始
-
学习Flutter时,遇到陌生的Dart语法(如扩展方法、泛型),再回头针对性补充
-
多阅读Flutter源码(如Widget的实现),反向巩固Dart语法
Dart作为Flutter的“灵魂语言”,入门门槛不高,但需要在实际开发中不断巩固。建议先用本文的实战代码练习,再尝试将其改造成Flutter应用(比如用ListView展示学习计划,用按钮标记完成状态),实现从Dart到Flutter的无缝衔接。
更多推荐

所有评论(0)