Dart语法基础 #

一、Dart语言简介 #

1.1 什么是Dart #

Dart是Google开发的客户端优化编程语言,用于快速构建任何平台上的应用。Dart是Flutter的开发语言,具有以下特点:

特点 说明
面向对象 一切皆对象,支持类、混入、接口
类型安全 支持静态类型检查和类型推断
现代语法 支持空安全、扩展、异步等特性
跨平台 可编译为移动端、Web、桌面端

1.2 Dart代码结构 #

dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('Hello, Dart!'),
        ),
      ),
    );
  }
}

二、变量与常量 #

2.1 变量声明 #

dart
var name = 'Flutter';
String language = 'Dart';
dynamic value = 100;
Object obj = 'Hello';

2.2 变量类型 #

关键字 说明 示例
var 类型推断 var name = 'Dart';
String 字符串 String name = 'Dart';
int 整数 int count = 10;
double 浮点数 double price = 9.99;
bool 布尔值 bool isValid = true;
List 列表 List<int> nums = [1, 2, 3];
Map 映射 Map<String, int> scores = {'a': 1};
dynamic 动态类型 dynamic value = 'any';
Object 任意对象 Object obj = 'hello';

2.3 常量声明 #

final:运行时常量

dart
final name = 'Flutter';
final String language = 'Dart';
final time = DateTime.now();

const:编译时常量

dart
const pi = 3.14159;
const int maxCount = 100;
const colors = ['red', 'green', 'blue'];

2.4 final vs const #

特性 final const
赋值时机 运行时 编译时
可否使用运行时值 可以 不可以
内存优化 一般 更好
使用场景 运行时确定的值 固定不变的值
dart
final now = DateTime.now();
const timeout = Duration(seconds: 30);

const list1 = [1, 2, 3];
final list2 = [1, 2, 3];

list1[0] = 10;
list2[0] = 10;

const list3 = [...list1];

三、空安全 #

3.1 可空类型 #

dart
String? nullableName;
String nonNullableName = 'Dart';

nullableName = null;

3.2 空安全操作符 #

操作符 说明 示例
? 可空类型声明 String? name;
! 非空断言 name!.length
?? 空值合并 name ?? 'default'
?. 空安全访问 name?.length
??= 空值赋值 name ??= 'default';

3.3 使用示例 #

dart
String? name;

int length = name?.length ?? 0;
int length2 = name!.length;
name ??= 'Flutter';

String displayName = name ?? 'Guest';

3.4 late关键字 #

dart
late String description;

void init() {
  description = 'Initialized later';
}

class User {
  late final String name;
  
  User(this.name);
}

四、数据类型 #

4.1 数字类型 #

dart
int count = 10;
double price = 9.99;
num value = 10;
num value2 = 10.5;

int hexValue = 0xFF;
double scientific = 1.42e5;

int parsed = int.parse('10');
double parsed2 = double.parse('3.14');
String str = 10.toString();
String str2 = 3.14159.toStringAsFixed(2);

4.2 字符串类型 #

dart
String name = 'Flutter';
String message = "Hello, $name!";
String multiLine = '''
第一行
第二行
第三行
''';

String raw = r'原始字符串\n不转义';

String concat = 'Hello' + ' ' + 'World';
String interpolation = 'Count: ${count + 1}';

int length = name.length;
bool empty = name.isEmpty;
bool contains = name.contains('Flut');
bool starts = name.startsWith('Flu');
String upper = name.toUpperCase();
String sub = name.substring(0, 3);
List<String> parts = 'a,b,c'.split(',');
String trimmed = '  hello  '.trim();

4.3 布尔类型 #

dart
bool isValid = true;
bool isEmpty = false;

bool result = 1 > 0;
bool result2 = name.isNotEmpty && count > 0;
bool result3 = name.isEmpty || count < 0;

4.4 列表类型 #

dart
List<int> numbers = [1, 2, 3, 4, 5];
var fruits = <String>['apple', 'banana'];
var mixed = [1, 'two', true];

var emptyList = <int>[];
var filled = List<int>.filled(5, 0);

int first = numbers.first;
int last = numbers.last;
int len = numbers.length;

numbers.add(6);
numbers.addAll([7, 8]);
numbers.insert(0, 0);
numbers.remove(3);
numbers.removeAt(0);
numbers.clear();

bool hasOne = numbers.contains(1);
int index = numbers.indexOf(3);

var doubled = numbers.map((n) => n * 2).toList();
var filtered = numbers.where((n) => n > 2).toList();
var sum = numbers.reduce((a, b) => a + b);

for (var num in numbers) {
  print(num);
}

4.5 集合类型 #

dart
Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
var names = <String>{'Alice', 'Bob'};

var emptySet = <int>{};

uniqueNumbers.add(6);
uniqueNumbers.addAll({7, 8});
uniqueNumbers.remove(1);

bool contains = uniqueNumbers.contains(2);

var intersection = {1, 2, 3}.intersection({2, 3, 4});
var union = {1, 2}.union({3, 4});
var difference = {1, 2, 3}.difference({2, 3});

4.6 映射类型 #

dart
Map<String, int> scores = {
  'Alice': 90,
  'Bob': 85,
  'Charlie': 95,
};

var emptyMap = <String, int>{};
var emptyMap2 = Map<String, int>();

scores['David'] = 88;
scores.update('Alice', (value) => value + 5);
scores.remove('Bob');

int? score = scores['Alice'];
bool hasKey = scores.containsKey('Alice');
bool hasValue = scores.containsValue(90);

var keys = scores.keys;
var values = scores.values;
var entries = scores.entries;

scores.forEach((key, value) {
  print('$key: $value');
});

for (var entry in scores.entries) {
  print('${entry.key}: ${entry.value}');
}

五、运算符 #

5.1 算术运算符 #

dart
int a = 10;
int b = 3;

int sum = a + b;
int diff = a - b;
int product = a * b;
double quotient = a / b;
int intQuotient = a ~/ b;
int remainder = a % b;

a++;
a--;
++a;
--a;

5.2 关系运算符 #

dart
bool equal = a == b;
bool notEqual = a != b;
bool greater = a > b;
bool less = a < b;
bool greaterOrEqual = a >= b;
bool lessOrEqual = a <= b;

5.3 逻辑运算符 #

dart
bool and = true && false;
bool or = true || false;
bool not = !true;

5.4 赋值运算符 #

dart
int x = 10;
x += 5;
x -= 3;
x *= 2;
x ~/= 4;
x ??= 100;

5.5 条件运算符 #

dart
String result = a > b ? 'a大' : 'b大';
String name = nullableName ?? 'default';

5.6 级联运算符 #

dart
class Person {
  String? name;
  int? age;
  
  void sayHello() {
    print('Hello, I am $name');
  }
}

var person = Person()
  ..name = 'Alice'
  ..age = 25
  ..sayHello();

5.7 类型运算符 #

dart
var value = 'Hello';

if (value is String) {
  print(value.length);
}

if (value is! int) {
  print('Not an integer');
}

六、控制流 #

6.1 if-else #

dart
int score = 85;

if (score >= 90) {
  print('优秀');
} else if (score >= 60) {
  print('及格');
} else {
  print('不及格');
}

6.2 switch-case #

dart
String grade = 'A';

switch (grade) {
  case 'A':
    print('优秀');
    break;
  case 'B':
    print('良好');
    break;
  case 'C':
    print('及格');
    break;
  default:
    print('不及格');
}

switch (score) {
  case >= 90:
    print('优秀');
  case >= 60:
    print('及格');
  default:
    print('不及格');
}

6.3 for循环 #

dart
for (int i = 0; i < 5; i++) {
  print(i);
}

var list = [1, 2, 3, 4, 5];
for (var item in list) {
  print(item);
}

for (var i = 0; i < list.length; i++) {
  print('Index $i: ${list[i]}');
}

6.4 while循环 #

dart
int i = 0;
while (i < 5) {
  print(i);
  i++;
}

int j = 0;
do {
  print(j);
  j++;
} while (j < 5);

6.5 break和continue #

dart
for (int i = 0; i < 10; i++) {
  if (i == 5) break;
  print(i);
}

for (int i = 0; i < 10; i++) {
  if (i % 2 == 0) continue;
  print(i);
}

outer:
for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    if (i == 1 && j == 1) break outer;
    print('($i, $j)');
  }
}

七、异常处理 #

7.1 抛出异常 #

dart
throw Exception('发生错误');
throw FormatException('格式错误');
throw '自定义错误信息';

7.2 捕获异常 #

dart
try {
  var result = 10 ~/ 0;
} on IntegerDivisionByZeroException {
  print('除零错误');
} on FormatException catch (e) {
  print('格式错误: $e');
} catch (e, stackTrace) {
  print('错误: $e');
  print('堆栈: $stackTrace');
} finally {
  print('总是执行');
}

7.3 自定义异常 #

dart
class CustomException implements Exception {
  final String message;
  
  CustomException(this.message);
  
  @override
  String toString() => 'CustomException: $message';
}

throw CustomException('自定义错误');

八、注释 #

8.1 单行注释 #

dart
int count = 10;

8.2 多行注释 #

dart
int count = 10;

8.3 文档注释 #

dart
/// 计算两个数的和
/// 
/// [a] 第一个数
/// [b] 第二个数
/// 返回两数之和
int add(int a, int b) {
  return a + b;
}

九、总结 #

9.1 核心要点 #

要点 说明
变量 var、类型声明、dynamic
常量 final(运行时)、const(编译时)
空安全 ?、!、??、?.、??=、late
数据类型 int、double、String、bool、List、Map、Set
控制流 if-else、switch、for、while
异常 try-catch-finally

9.2 下一步 #

掌握了Dart基础语法后,让我们继续学习 变量与类型

最后更新:2026-03-28