Flutter - dart 语言从入门到精通

简介: 本文系统解析 Dart 语言的基础与高级语法,涵盖变量类型、函数、面向对象、泛型、异步编程(Future/Stream)、空安全、mixin、扩展方法等核心特性,助你掌握 Flutter 开发基石,提升代码质量与开发效率。

@TOC

一、Dart 简介

Dart 是由 Google 开发的面向对象、类 C 风格的编程语言,专为构建高性能、跨平台应用而设计。它是 Flutter 框架的官方语言,支持编译为原生代码(AOT)或 JIT(开发时热重载),适用于移动、Web、桌面和服务器端开发。


二、基础语法详解

1. 变量与类型

声明方式:

var name = 'Dart';           // 类型推断
final age = 25;               // 运行时常量(只能赋值一次)
const PI = 3.14;              // 编译时常量
dynamic x = 10;               // 可变类型,运行时可改变
Object y = 'hello';           // 顶级对象类型</code></pre>

⚠️ 推荐使用 finalconst 提升性能和安全性。

内置类型:

  • int, double:数值
  • String:字符串(单/双引号)
  • booltrue / false
  • List:有序集合(数组)
  • Set:无序唯一集合
  • Map:键值对
  • Symbol:反射用
  • Null:空值
List<int> numbers = [1, 2, 3];
Set<String> names = {
   'Alice', 'Bob'};
Map<String, int> scores = {
   'math': 90, 'eng': 85};</code></pre>

2. 字符串与插值

String name = 'Tom';
String greeting = 'Hello, $name!';                    // 简单插值
String info = 'Age: ${age + 1}';                      // 表达式插值
String multiLine = '''
  This is a
  multi-line string.
''';

3. 控制流语句

// if-else
if (score >= 60) {
   
  print('Pass');
} else {
   
  print('Fail');
}

// for 循环
for (int i = 0; i < 3; i++) {
   
  print(i);
}

// for-in(遍历集合)
for (var item in list) {
   
  print(item);
}

// while / do-while
while (condition) {
    ... }

// switch-case(支持 String 和 int)
switch (color) {
   
  case 'red':
    print('Red');
    break;
  default:
    print('Unknown');
}

4. 函数(Function)

// 普通函数
int add(int a, int b) {
   
  return a + b;
}

// 箭头函数(单表达式)
int multiply(int a, int b) => a * b;

// 可选参数:位置可选([])、命名可选({})
void sayHello(String name, [String? title]) {
   
  print('Hello $title $name');
}

void createUser({
   String name = 'Guest', int age = 18}) {
   
  print('Name: $name, Age: $age');
}

// 默认参数
void connect({
   String host = 'localhost', int port = 8080}) {
    ... }

5. 操作符

操作符 说明
?? 如果左边为 null,则返回右边
??= 左边为 null 时才赋值
... Spread 操作符(展开列表)
.. 级联操作符(链式调用)
?. 条件成员访问
as 类型断言
List<int> more = [0, ...list, 4];         // 展开
obj..name = 'Tom'..age = 20..save();       // 链式设置
String? name = user?.name;                 // 安全访问

三、高级语法详解

1. 空安全(Null Safety)

Dart 2.12+

所有变量默认不可为空,必须显式声明可空类型。

String name = 'Dart';        // 不可为空
String? nullableName = null; // 可为空

// 安全调用
nullableName?.length;

// 非空断言(慎用)
nullableName!.length;

// 条件赋值
String result = nullableName ?? 'default';

// late 关键字:延迟初始化(需确保不会提前访问)
late final String config = loadConfig();

2. 面向对象编程(OOP)

类与构造函数

class Person {
   
  String name;
  int age;

  // 构造函数(语法糖)
  Person(this.name, this.age);

  // 命名构造函数
  Person.adult(String name) : this(name, 18);

  // 工厂构造函数(可返回子类或缓存实例)
  factory Person.fromMap(Map<String, dynamic> map) {
   
    return Person(map['name'], map['age']);
  }

  // 方法
  void introduce() {
   
    print('Hi, I am $name, $age years old.');
  }
}

继承与多态

class Student extends Person {
   
  String major;

  Student(String name, int age, this.major) : super(name, age);

  
  void introduce() {
   
    print('I study $major.');
  }
}

抽象类与接口

abstract class Flyable {
   
  void fly(); // 抽象方法
}

class Bird extends Person implements Flyable {
   
  
  void fly() {
   
    print('Flying...');
  }
}

Mixin(混入)——代码复用利器

mixin Singable {
   
  void sing() {
   
    print('Singing...');
  }
}

class Musician extends Person with Singable {
   
  // 同时拥有 Person 和 Singable 的能力
}

3. 泛型(Generics)

提高类型安全性和复用性。

// 泛型类
class Box<T> {
   
  T content;
  Box(this.content);
}

// 泛型方法
T firstElement<T>(List<T> list) => list[0];

// 使用
Box<String> stringBox = Box('Hello');
String first = firstElement(['a', 'b', 'c']);</code></pre>

> 泛型还能用于限制类型:

<pre style="background: none"><code class="language-dart" data-language="dart" identifier="d47820124a6d47a8a7b19452a64a0c60-12" index="12" total="19">class Cache<T extends num> {
    ... } // T 必须是 num 或其子类

4. 异步编程(Asynchronous)

Dart 使用 FutureStream 处理异步操作。

Future(单次异步结果)


Future<String> fetchData() async {
   
  await Future.delayed(Duration(seconds: 2));
  return 'Data loaded';
}

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 listenStream() async {
   
  await for (var num in countStream(5)) {
   
    print(num);
  }
}

5. Isolates(隔离区)——Dart 的并发模型

Dart 是单线程事件循环模型,通过 Isolates 实现并发(非共享内存)。


import 'dart:isolate';

void spawnFunction(SendPort sendPort) {
   
  int result = 10 * 2;
  sendPort.send(result);
}

void main() async {
   
  ReceivePort receivePort = ReceivePort();
  await Isolate.spawn(spawnFunction, receivePort.sendPort);

  int result = await receivePort.first;
  print('Result: $result');
}

6. 扩展方法(Extension Methods)

为现有类添加新方法,无需继承或修改源码。


extension StringExtensions on String {
   
  bool get isEmail => this.contains('@');
  String capitalize() => '${this[0].toUpperCase()}${this.substring(1)}';
}

// 使用
print('hello'.capitalize());     // Hello
print('a@b.com'.isEmail);        // true

7. 元数据(Metadata)

用于注解类、方法、变量。



void oldMethod() {
    ... }


void build(BuildContext context) {
    ... }

// 自定义注解
class Todo {
   
  final String who;
  const Todo(this.who);
}

('Alice')
void featureA() {
    }

8. 库与可见性

  • 使用 import 引入库
  • 使用 part / part of 拆分文件
  • _ 开头标识私有成员

import 'package:http/http.dart' as http;
import 'my_utils.dart' hide privateHelper; // 隐藏某些符号
import 'config.dart' as config show API_URL; // 只导入部分

// 私有成员
String _privateField = 'internal';

四、最佳实践建议

项目 推荐做法
变量 多用 final,少用 vardynamic
空值 合理使用 ?, ??, ?.,避免 !
构造函数 使用命名构造和工厂构造提升可读性
异步 async/await 替代 .then() 更清晰
代码组织 使用 mixin 复用逻辑,避免多重继承
性能 多用 const 对象,减少运行时开销
格式化 使用 dart format 统一风格

五、总结:Dart 语法核心亮点

特性 说明
空安全 编译期预防空指针异常
级联操作符 .. 链式调用,代码简洁
Mixin 强大的代码复用机制
扩展方法 安全增强已有类功能
Future/Stream 异步编程简洁高效
Isolates 安全并发,避免竞态
AOT/JIT 双编译 开发快,运行快

学习资源


通过掌握以上 基础 + 高级语法,你已经具备了使用 Dart 构建复杂应用的能力。下一步建议结合 Flutter 实战项目,进一步巩固语言特性。

相关文章
|
3月前
|
JavaScript 前端开发 安全
TypeScript 与 ArkTS 全面对比:鸿蒙生态下的语言演进
本文深入对比TypeScript与华为鸿蒙原生语言ArkTS,从类型系统、UI开发、性能优化到生态定位,全面解析二者差异。ArkTS基于TS演进,面向操作系统层级重构,具备强类型安全、声明式UI、AOT编译与分布式能力,助力“一次开发,多端部署”。结合10亿鸿蒙设备爆发趋势,为开发者提供技术选型指南与平滑迁移路径,是进军全场景智慧生态的关键钥匙。(238字)
378 1
|
JavaScript Android开发
AutoJs4.1.0实战教程---js文件打包发布成APK文件
AutoJs4.1.0实战教程---js文件打包发布成APK文件
2099 0
AutoJs4.1.0实战教程---js文件打包发布成APK文件
|
3月前
|
前端开发 JavaScript API
Promise深度解析:前端异步编程的核心
Promise是JavaScript异步编程的核心,解决回调地狱问题。本文深入解析其状态机制、微任务原理、核心API及链式调用,并涵盖超时控制、并发管理等高级应用,助你掌握异步精髓,夯实前端进阶基础。(238字)
150 10
|
11月前
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
|
开发框架 Dart Java
Flutter的核心:Dart语言基础——语法与特性深度解析
【4月更文挑战第26天】Flutter框架背后的Dart语言,以其简洁的语法和独特特性深受开发者喜爱。本文深入解析Dart的语法与特性,如类型推导、动态静态类型系统、统一的类接口、访问权限控制以及并发编程支持。了解并掌握Dart,能助开发者更高效地利用Flutter构建高性能移动应用。
|
存储 容器
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
439 0
|
存储 JavaScript 中间件
Nuxt3 实战 (一):初始化项目
这篇文章介绍了Nuxt框架的基本信息,包括什么是Nuxt以及Nuxt3的优点。文章还介绍了Nuxt3的一些特点,如服务端渲染和静态站点生成、模块化、文件系统路由等。此外,文章还提供了项目安装的步骤和目录结构。最后,文章提到了下一步计划,即配置 Eslint、Prettier、Husky、lint-staged、commitlit项目提交规范的过程。
518 3
Nuxt3 实战 (一):初始化项目
|
开发者 Windows
Flutter笔记:Widgets Easier组件库(9)使用弹窗
Flutter笔记:Widgets Easier组件库(9)使用弹窗
412 3
|
API 容器
Flutter UI组件库(JUI)
Flutter UI组件库(JUI)
2949 17
|
机器学习/深度学习 算法 数据挖掘
技术视界|多模态说话人开源项目3D-Speaker
技术视界|多模态说话人开源项目3D-Speaker