<返回目录     Powered by claud/xia兄

第2课:Dart语言基础

变量、数据类型、函数、面向对象编程

📋 学习前提

🎯 课程目标

通过本课程,你将能够:

🚀 什么是Dart语言?

Dart是Google开发的面向对象的编程语言,专门为构建Web、服务器和移动应用而设计。它是Flutter框架的官方语言。

Dart语言特点

💡 重要概念: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:创建学生管理系统

创建一个简单的学生类和管理系统:

  1. 定义Student类,包含姓名、年龄、成绩等属性
  2. 实现添加学生、删除学生、查询学生的方法
  3. 计算班级平均分
  4. 按成绩排序学生列表

练习2:异步数据获取

模拟异步数据获取和处理:

  1. 创建模拟网络请求的函数
  2. 使用async/await处理多个异步请求
  3. 实现错误处理机制
  4. 使用Stream实现实时数据更新
💡 提示

可以使用DartPad在线编辑器进行练习:https://dartpad.dev

🔍 常见问题解答

Q: var和具体类型声明有什么区别?

A: var使用类型推断,编译器会自动推断变量类型。显式声明类型可以提高代码可读性,特别是在团队协作中。

Q: final和const有什么区别?

A: final是运行时常量,值在运行时确定;const是编译时常量,值在编译时就必须确定。

Q: async/await和Future.then()哪个更好?

A: async/await语法更清晰易读,特别是在处理多个异步操作时。Future.then()在简单场景下也可以使用。

📖 总结

在本课程中,我们学习了Dart语言的核心概念:

Dart语言是Flutter开发的基础,熟练掌握这些概念将为后续的Flutter学习打下坚实基础。