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 实战项目,进一步巩固语言特性。

目录
相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
480 201
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
602 157
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
582 47