📋 学习前提
- 已完成第1课:Flutter环境搭建
- 了解基本的编程概念
- 准备好DartPad或本地开发环境
🎯 课程目标
通过本课程,你将能够:
- 理解Dart语言的基本语法和特性
- 掌握变量声明和数据类型的使用
- 熟练使用函数和控制流语句
- 理解面向对象编程的核心概念
- 掌握Dart的异步编程模型
🚀 什么是Dart语言?
Dart是Google开发的面向对象的编程语言,专门为构建Web、服务器和移动应用而设计。它是Flutter框架的官方语言。
Dart语言特点
- 强类型语言:支持类型推断,但类型安全
- 面向对象:支持类、继承、接口等OOP特性
- 异步支持:内置async/await语法,处理异步操作
- 跨平台:可编译为JavaScript或原生代码
- 现代化语法:简洁、易读、易学
💡 重要概念:Dart与JavaScript的对比
Dart在很多方面与JavaScript相似,但提供了更好的类型安全性和性能。Dart是编译型语言,而JavaScript是解释型语言。
🔤 变量和数据类型
变量声明
Dart支持多种变量声明方式:
// 使用var声明变量(类型推断)
var name = '张三';
var age = 25;
// 显式指定类型
String name = '张三';
int age = 25;
// 动态类型(不推荐常规使用)
dynamic dynamicValue = '可以是任意类型';
// 常量声明
final String finalName = '李四'; // 运行时常量
const int maxCount = 100; // 编译时常量
基本数据类型
| 类型 |
描述 |
示例 |
| int |
整数类型 |
int age = 25; |
| double |
浮点数类型 |
double price = 19.99; |
| String |
字符串类型 |
String name = "张三"; |
| bool |
布尔类型 |
bool isActive = true; |
| List |
列表/数组 |
List<String> names = ['张三', '李四']; |
| Map |
键值对集合 |
Map<String, dynamic> person = {'name': '张三', 'age': 25}; |
📝 示例:数据类型操作
// 字符串操作
String name = '张三';
print('Hello, $name'); // 字符串插值
print('Hello, ${name.toUpperCase()}'); // 表达式插值
// 列表操作
List numbers = [1, 2, 3, 4, 5];
numbers.add(6);
numbers.remove(1);
print(numbers.length);
// Map操作
Map person = {
'name': '张三',
'age': 25,
'isStudent': true
};
print(person['name']);
person['city'] = '北京';
⚙️ 函数
函数定义
Dart支持多种函数定义方式:
// 基本函数定义
void sayHello(String name) {
print('Hello, $name!');
}
// 有返回值的函数
int add(int a, int b) {
return a + b;
}
// 箭头函数(单行表达式)
int multiply(int a, int b) => a * b;
// 可选参数
void printInfo(String name, [int? age, String? city]) {
print('Name: $name');
if (age != null) print('Age: $age');
if (city != null) print('City: $city');
}
// 命名参数
void createUser({required String name, int age = 0, String? email}) {
print('Creating user: $name, age: $age');
}
// 调用函数
sayHello('张三');
printInfo('李四');
printInfo('王五', 30, '上海');
createUser(name: '赵六', age: 25, email: 'zhao@example.com');
高阶函数
Dart支持函数作为一等公民:
// 函数作为参数
void executeFunction(Function fn) {
fn();
}
// 函数作为返回值
Function createMultiplier(int multiplier) {
return (int value) => value * multiplier;
}
// 使用示例
var doubleIt = createMultiplier(2);
print(doubleIt(5)); // 输出: 10
🔄 控制流语句
条件语句
// if-else语句
int score = 85;
if (score >= 90) {
print('优秀');
} else if (score >= 60) {
print('及格');
} else {
print('不及格');
}
// switch语句
String grade = 'B';
switch (grade) {
case 'A':
print('优秀');
break;
case 'B':
print('良好');
break;
case 'C':
print('及格');
break;
default:
print('未知等级');
}
循环语句
// for循环
for (int i = 0; i < 5; i++) {
print('循环次数: $i');
}
// for-in循环(遍历集合)
List names = ['张三', '李四', '王五'];
for (String name in names) {
print('姓名: $name');
}
// while循环
int count = 0;
while (count < 3) {
print('计数: $count');
count++;
}
// do-while循环
int number = 0;
do {
print('数字: $number');
number++;
} while (number < 3);
🏗️ 面向对象编程
类和对象
// 定义类
class Person {
// 属性
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.anonymous() {
name = '匿名';
age = 0;
}
// 方法
void introduce() {
print('我叫$name,今年$age岁');
}
// Getter
String get info => '$name ($age岁)';
// Setter
set updateAge(int newAge) {
if (newAge > 0) age = newAge;
}
}
// 使用类
var person1 = Person('张三', 25);
person1.introduce();
print(person1.info);
var anonymous = Person.anonymous();
anonymous.introduce();
继承和多态
// 基类
class Animal {
String name;
Animal(this.name);
void speak() {
print('动物叫声');
}
}
// 派生类
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name 汪汪叫');
}
void run() {
print('$name 在奔跑');
}
}
// 使用继承
Animal animal = Animal('动物');
Dog dog = Dog('小黑');
animal.speak(); // 输出: 动物叫声
dog.speak(); // 输出: 小黑 汪汪叫
dog.run(); // 输出: 小黑 在奔跑
接口和抽象类
// 抽象类
abstract class Shape {
double area(); // 抽象方法
void printArea() {
print('面积: ${area()}');
}
}
// 实现抽象类
class Circle implements Shape {
double radius;
Circle(this.radius);
@override
double area() {
return 3.14 * radius * radius;
}
}
// 使用
var circle = Circle(5.0);
circle.printArea(); // 输出: 面积: 78.5
⚡ 异步编程
Future和async/await
// 模拟异步操作
Future fetchUserData() async {
await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
return '用户数据';
}
// 使用async/await
void getUserData() async {
print('开始获取用户数据...');
String data = await fetchUserData();
print('获取到的数据: $data');
}
// 错误处理
try {
String data = await fetchUserData();
print(data);
} catch (e) {
print('发生错误: $e');
}
// 多个异步操作
Future fetchMultipleData() async {
var userData = await fetchUserData();
var settings = await fetchSettings();
print('用户数据: $userData, 设置: $settings');
}
Stream
// 创建Stream
Stream countStream(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i; // 产生数据
}
}
// 使用Stream
void listenToStream() {
countStream(5).listen((data) {
print('接收到数据: $data');
});
}
// 使用async/await处理Stream
void processStream() async {
await for (var data in countStream(3)) {
print('处理数据: $data');
}
}
📚 实践练习
练习1:创建学生管理系统
创建一个简单的学生类和管理系统:
- 定义Student类,包含姓名、年龄、成绩等属性
- 实现添加学生、删除学生、查询学生的方法
- 计算班级平均分
- 按成绩排序学生列表
练习2:异步数据获取
模拟异步数据获取和处理:
- 创建模拟网络请求的函数
- 使用async/await处理多个异步请求
- 实现错误处理机制
- 使用Stream实现实时数据更新
🔍 常见问题解答
Q: var和具体类型声明有什么区别?
A: var使用类型推断,编译器会自动推断变量类型。显式声明类型可以提高代码可读性,特别是在团队协作中。
Q: final和const有什么区别?
A: final是运行时常量,值在运行时确定;const是编译时常量,值在编译时就必须确定。
Q: async/await和Future.then()哪个更好?
A: async/await语法更清晰易读,特别是在处理多个异步操作时。Future.then()在简单场景下也可以使用。
📖 总结
在本课程中,我们学习了Dart语言的核心概念:
- 变量声明和数据类型的使用
- 函数的定义和高级用法
- 控制流语句的编写
- 面向对象编程的核心特性
- 异步编程模型和最佳实践
Dart语言是Flutter开发的基础,熟练掌握这些概念将为后续的Flutter学习打下坚实基础。