当前位置: 首页 > news >正文

Flutter - dart 语言从入门到精通 - 教程

Flutter - dart 语言从入门到精通 - 教程

文章目录

    • 一、Dart 简介
    • 二、基础语法详解
      • 1. 变量与类型
        • 声明方式:
        • 内置类型:
      • 2. 字符串与插值
      • 3. 控制流语句
      • 4. 函数(Function)
      • 5. 操作符
    • 三、高级语法详解
      • 1. 空安全(Null Safety)
      • 2. 面向对象编程(OOP)
        • 类与构造函数
        • 继承与多态
        • 抽象类与接口
        • Mixin(混入)——代码复用利器
      • 3. 泛型(Generics)
      • 4. 异步编程(Asynchronous)
        • Future(单次异步结果)
        • Stream(持续数据流)
      • 5. Isolates(隔离区)——Dart 的并发模型
      • 6. 扩展方法(Extension Methods)
      • 7. 元数据(Metadata)
      • 8. 库与可见性
    • 四、最佳实践建议
    • 五、总结:Dart 语法核心亮点
    • 学习资源

当然可以。以下是 Dart 语言的基础语法与高级语法的详细解析,适合从入门到深入理解 Dart 的核心特性。


一、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&lt;int&gt; numbers = [1, 2, 3];
Set&lt;String&gt; names = {'Alice', 'Bob'};
Map&lt;String, int&gt; 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 &gt;= 60) {
print('Pass');
} else {
print('Fail');
}
// for 循环
for (int i = 0; i &lt; 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) =&gt; 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&lt;int&gt; 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&lt;String, dynamic&gt; 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&lt;T&gt; {
T content;
Box(this.content);
}
// 泛型方法
T firstElement&lt;T&gt;(List&lt;T&gt; list) =&gt; list[0];
// 使用
Box&lt;String&gt; 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&lt;T extends num&gt; { ... } // T 必须是 num 或其子类

4. 异步编程(Asynchronous)

Dart 使用 FutureStream 处理异步操作。

Future(单次异步结果)
Future&lt;String&gt; 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&lt;int&gt; countStream(int max) async* {
for (int i = 1; i &lt;= 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 =&gt; this.contains('@');
String capitalize() =&gt; '${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 实战项目,进一步巩固语言特性。

http://www.hskmm.com/?act=detail&tid=19819

相关文章:

  • 哈夫曼编码例题
  • Deepoc具身智能模型:为传统电厂巡检机器人注入“灵魂”与“智慧” - 实践
  • Win11共享打印0x0000bc4,三步解决共享难题
  • kafka-日志收集高效的平台部署任务
  • python第三天
  • iOS Xcode16 中删除描述文件 Provisioning Profiles
  • git仓库管理memo
  • 全国主要城市温度舒适度榜:谁在天堂,谁在蒸笼
  • 电桥采集模块 24位ADC+128倍可调增益 高精度测量支持多接口输出
  • ubuntu 系统启动服务及服务依赖
  • Jira停售Data Center尘埃落定!中国企业迁移需落实的6大关键项目管理工具清单
  • 【Cursor/Vscode】SSH免密登录 - 教程
  • python 超长代码行如何换行,符合PEP 8规范?
  • Gitee崛起:中国开发者迎来本土化研发平台新纪元
  • 关键领域软件研发知识管理的范式革命:从静态文档到智能图谱的跃迁
  • 【IEEE出版、曾获中国科协认证】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)
  • 时间同步NTP服务
  • 【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式
  • 【2025-09-26】奋斗逻辑
  • 【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全 - 教程
  • 关于修改 linux 系统中优先使用中文结构
  • Discord桌面应用远程代码执行漏洞分析
  • DRL模型训练:原始奖励函数记录以及绘制
  • 中国DevOps平台竞品分析:安全合规与技术生态的双重较量
  • experiment 1
  • 图领域的METIS算法介绍 - zhang
  • CANOpen safety SRDO相关问题总结
  • Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:head_wal.go 的 WAL 写入策略与缓存管理源码解读
  • 电子通信词汇中英文对照
  • 平衡树