Dart基础语法
Dart是一种面向对象的编程语言,广泛应用于Flutter跨平台开发。
本文将详细介绍Dart的基础语法,包括变量声明、数据类型、函数、类、控制流、空安全、异步编程等核心概念。
变量声明与数据类型
Dart提供了多种变量声明方式:
显式类型声明:明确指定变量类型
String name = 'Alice'; int age = 25;
类型推断(var):由编译器推断变量类型
var city = 'London'; // 推断为String var price = 9.99; // 推断为double
动态类型(dynamic):可赋值为任意类型
dynamic value = 'Hello'; value = 100; // 合法
常量声明:
final PI = 3.14; // 运行时常量 const gravity = 9.8; // 编译时常量
Dart的基本数据类型包括:
int
:整数double
:浮点数bool
:布尔值(true/false)String
:字符串List
:列表/数组Map
:键值对集合
类型检查与转换:
var value = '123'; print(value is String); // true int numValue = int.parse(value); String strValue = numValue.toString();
函数定义与使用
Dart中的函数定义方式:
基本函数:
int add(int a, int b) { return a + b; }
箭头函数(单表达式函数):
bool isAdult(int age) => age >= 18;
可选参数:
void printInfo(String name, [int? age]) { print('Name: $name, Age: ${age ?? 'unknown'}'); }
命名参数:
void greet({String name = 'Guest', int times = 1}) { for (int i = 0; i < times; i++) { print('Hello, $name!'); } }
匿名函数:
var list = [1, 2, 3]; list.forEach((item) => print(item));
类与对象
Dart是面向对象语言,所有类都继承自Object:
class Person { // 实例变量 String name; int age; // 构造函数 Person(this.name, this.age); // 命名构造函数 Person.guest() : this('Guest', 18); // 方法 void introduce() { print('I am $name, $age years old.'); } } void main() { var p1 = Person('Alice', 25); var p2 = Person.guest(); p1.introduce(); }
Dart支持继承和混入(Mixin):
mixin Logger { void log(String message) => print(message); } class User with Logger { String name; User(this.name); } void main() { var user = User('Bob'); user.log('User created'); // 来自Logger mixin }
控制流和循环结构
Dart支持标准的控制流语句:
条件语句:
if (age >= 18) { print('Adult'); } else if (age >= 13) { print('Teenager'); } else { print('Child'); }
switch语句:
switch (grade) { case 'A': print('Excellent'); break; case 'B': print('Good'); break; default: print('Fail'); }
循环结构:
// for循环 for (int i = 0; i < 5; i++) { print(i); } // while循环 while (condition) { // ... } // do-while循环 do { // ... } while (condition); // for-in循环 var list = [1, 2, 3]; for (var item in list) { print(item); }
空安全机制
Dart 2.12引入的空安全特性:
可空与不可空类型:
String name = 'Dart'; // 不可为空 String? nickname = null; // 可为空
空断言操作符(!):
String? nullableName = getName(); String name = nullableName!; // 断言不为null
late关键字:
late String description; void main() { description = 'Initialized later'; print(description); }
空安全机制将运行时的空指针异常提前到开发阶段检测,提高了代码安全性
异步编程(async/await)
Dart使用Future
和async/await
处理异步操作:
Future基本用法:
Future<String> fetchData() { return Future.delayed(Duration(seconds: 2), () => 'Data loaded'); } void main() { fetchData().then((data) { print(data); }).catchError((error) { print('Error: $error'); }); }
async/await语法:
Future<void> main() async { try { String data = await fetchData(); print(data); } catch (e) { print('Error: $e'); } }
Stream处理连续事件:
Stream<int> countStream(int max) async* { for (int i = 1; i <= max; i++) { await Future.delayed(Duration(seconds: 1)); yield i; } } void main() async { await for (var num in countStream(5)) { print(num); } }
集合类型操作
Dart主要集合类型:
List(列表):
var numbers = [1, 2, 3]; numbers.add(4); numbers.insert(0, 0); numbers.remove(3); print(numbers[1]); // 访问元素
Set(集合):
var ingredients = {'gold', 'titanium', 'xenon'}; ingredients.add('silver'); ingredients.remove('gold'); print(ingredients.contains('titanium'));
Map(映射):
var scores = {'Math': 90, 'English': 85}; scores['Science'] = 95; print(scores['Math']); scores.remove('English');
集合操作支持展开运算符:
var list1 = [1, 2]; var list2 = [0, ...list1, 3]; // [0, 1, 2, 3]
扩展方法与Mixin
扩展方法:
extension StringExtension on String { String reverse() { return split('').reversed.join(''); } } void main() { print('hello'.reverse()); // olleh }
Mixin:
mixin Musical { void playMusic() { print('Playing music'); } } class Performer with Musical { // ... }
Dart 3.0新特性
记录类型(Records):
var record = ('first', a: 2, b: true, 'last'); print(record.$1); // 'first' print(record.a); // 2
模式匹配(Patterns):
var point = (x: 10, y: 20); if (point case (x: var x, y: var y)) { print('Point: ($x, $y)'); }
switch表达式增强:
var number = 1; var result = switch (number) { 0 => 'zero', 1 => 'one', _ => 'other' };
运算符重载
Dart允许重载运算符:
class Vector { final int x, y; Vector(this.x, this.y); Vector operator +(Vector other) { return Vector(x + other.x, y + other.y); } } void main() { var v1 = Vector(2, 3); var v2 = Vector(4, 5); var result = v1 + v2; // Vector(6, 8) }
可重载的运算符包括算术运算符、比较运算符等
异常处理
Dart使用try-catch处理异常:
try { // 可能抛出异常的代码 var result = 100 ~/ 0; } on IntegerDivisionByZeroException { // 特定异常处理 print('Cannot divide by zero'); } catch (e) { // 其他所有异常 print('Error: $e'); } finally { // 无论是否发生异常都会执行 print('Done'); }
生成器函数
Dart支持同步和异步生成器:
*同步生成器(sync)**:
Iterable<int> countTo(int n) sync* { for (int i = 1; i <= n; i++) { yield i; } }
*异步生成器(async)**:
Stream<int> countStream(int n) async* { for (int i = 1; i <= n; i++) { await Future.delayed(Duration(seconds: 1)); yield i; } }