Dart基础语法
Dart是一种面向对象的编程语言,广泛应用于Flutter跨平台开发。
本文将详细介绍Dart的基础语法,包括变量声明、数据类型、函数、类、控制流、空安全、异步编程等核心概念。
变量声明与数据类型
Dart提供了多种变量声明方式:
显式类型声明:明确指定变量类型
String name = 'Alice';int age = 25;
类型推断(var):由编译器推断变量类型
var city = 'London'; // 推断为Stringvar 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); // trueint 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; }}