Flutter for OpenHarmony前置知识:Dart 语法核心知识点总结(上)

Flutter for OpenHarmony前置知识:Dart 语法核心知识点总结(上)

作者:爱吃大芒果

个人主页 爱吃大芒果

本文所属专栏Flutter

更多专栏
Ascend C 算子开发教程(进阶)
鸿蒙集成
OpenAgents
openJiuwen
从0到1自学C++


Dart 基础语法(Flutter 核心开发语言)

Dart 是 Google 开发的面向对象、跨平台的编程语言,也是 Flutter 框架的核心开发语言。它兼具静态类型语言的安全性和动态类型语言的灵活性,掌握 Dart 基础语法是学习 Flutter 的第一步。

相关资料

前期准备

  1. 在环境准备完成之后,在终端执行:

    bash 复制代码
    dart --version

    输出版本号即安装成功,示例输出:

    复制代码
    Dart SDK version: 3.6.2 (stable) (Fri Jun 6 10:43:50 2025 +0800) on "windows_x64"
  2. 安装Trae

  3. 打开 Trae并在Trae中安装指定插件



  4. 输出"Hello world"

    dart 复制代码
    void main(List<String> args) {
      print("Hello world");
    }

一、Dart中的变量声明

1. 核心关键字:var

Dart 是强类型语言,变量的类型在第一次赋值后会被自动推断,且后续不能更改类型。

dart 复制代码
var name = "爱吃大芒果"; // 自动推断为 String 类型 
name = 20; // 错误,类型不匹配

2. 显式类型声明

可以直接指定变量类型,可读性更强。

dart 复制代码
String name = "爱吃大芒果"; 
int age = 19;

易错点

  • 仅声明不赋值的 var 变量会报错:var a;(编译错误:The variable 'a' must be initialized)
  • 显式声明的变量也必须初始化(空安全机制要求):String address;(编译错误:Non-nullable variable 'address' must be initialized)

二、Dart中的常量声明const

const 是编译时常量,值必须在编译阶段确定(只能是固定字面量),一旦声明不可修改,且不能为 null。

1. 核心特点

  • 编译时确定值,运行时不可变
  • 不可赋值为 null
  • 相同值的 const 常量会复用内存(性能优化)

2. 适用场景

  • 固定不变的字面量(如数字、字符串常量)
  • 编译时就能确定值的场景

三、Dart中常量final

final 是运行时常量,值在运行阶段确定,一旦赋值不可修改,支持通过计算、函数返回值等方式赋值。

1. 核心特点

  • 运行时确定值,赋值后不可变
  • 可以为 null(但需显式声明可空)
  • 每个 final 变量都是唯一的(即使值相同也会占用不同内存)

2. 适用场景

运行时才能确定值的场景(如获取当前时间、读取配置)

四、Dart中的字符串类型-String

String 是 Dart 中表示文本的类型,支持多种操作方式,使用灵活。

1. 字符串类型(String)

  • 用双引号 " 或 单引号 ' 包裹内容。
  • 支持字符串拼接(+ 号)、插值表达式(${变量/表达式},变量可省略大括号)。
  • 支持多行字符串:用三个单引号 / 双引号包裹。
dart 复制代码
void main() {
  // 单引号(不支持插值)
  String str1 = 'Hello Dart';
  
  // 双引号(支持插值)
  String str2 = "Hello Flutter";
  
  // 多行字符串(三个单/双引号)
  String str3 = '''
  这是多行字符串
  第一行内容
  第二行内容
  ''';
  
  String str4 = """
  多行字符串也可以用双引号
  支持换行和空格
  """;
  
  print(str1);
  print(str2);
  print(str3);
  print(str4);
}

2. 数字类型

包含两种核心类型,不支持自动类型转换,需手动调用方法转换。

  • int:整数类型,如 10、-5。
  • double:浮点类型,如 3.14、-2.5。
dart 复制代码
void main() {
  // 1. 字符串转数字
  String numStr = "123";
  int num1 = int.parse(numStr); // 字符串转 int
  double num2 = double.parse(numStr); // 字符串转 double
  
  // 容错转换(避免转换失败报错)
  int? num3 = int.tryParse("123a"); // 转换失败返回 null
  print(num3); // null
  
  // 2. 数字转字符串
  int age = 19;
  String ageStr = age.toString(); // int 转 String
  double pi = 3.1415;
  String piStr = pi.toStringAsFixed(2); // 保留2位小数:3.14
  
  // 3. int 转 double / double 转 int
  int i = 5;
  double d1 = i.toDouble(); // int 转 double:5.0
  double d2 = 3.99;
  int i2 = d2.toInt(); // double 转 int(直接截断小数):3
  int i3 = d2.round(); // 四舍五入:4
}


五、Dart中的数字类型

包含两种核心类型,不支持自动类型转换,需手动调用方法转换。

  • int:整数类型,如 10、-5
  • double:浮点类型,如 3.14、-2.5
  • num:包括整数类型和浮点类型
dart 复制代码
void main() {
  int a = 10;
  int b = 3;
  
  print(a + b); // 加法:13
  print(a - b); // 减法:7
  print(a * b); // 乘法:30
  print(a / b); // 除法(返回 double):3.3333333333333335
  print(a ~/ b); // 整数除法(取整):3
  print(a % b); // 取余:1
}

六、Dart中的布尔类型

只有两个取值:true 和 false,不可用 0 / 非 0 替代布尔值。

常用于条件判断(if、while 等语句)。

dart 复制代码
bool isStudent = true;
if (isStudent) {
  print("是学生");
}

七、Dart中列表类型

对应其他语言的数组,是有序的元素集合,分为不可变列表和可变列表。

  • 不可变列表:用 const 声明,元素不能增删改。

    dart 复制代码
    List<int> list1 = const [1, 2, 3];
  • 可变列表:用 [] 声明,支持 add()、remove()、insert() 等操作。

    dart 复制代码
    List<String> list2 = ["Java", "Dart"]; 
    list2.add("Flutter"); // 添加元素
    list2.removeAt(0); // 删除指定索引元素
  • 支持泛型指定元素类型,也可通过 var 自动推断。

八、Dart中字典类型-Map

是键值对的无序集合,键和值都可以是任意类型,同样分为不可变和可变两种。

1. 不可变 Map

用 const 声明。

dart 复制代码
void main() {
  Map<String, int> scoreMap = const {
    "语文": 90,
    "数学": 85,
    "英语": 95
  };
  
  // scoreMap["语文"] = 95; // 运行报错:Unsupported operation: set
}

2. 可变 Map

用 {} 声明,支持 putIfAbsent()、remove() 等操作。

dart 复制代码
void main() {
  // 声明方式1:指定泛型
  Map<String, dynamic> userInfo = {
    "name": "爱吃大芒果",
    "age": 19,
    "isStudent": true
  };
  
  // 声明方式2:空 Map 初始化
  Map<int, String> idMap = {};
  
  // 新增/修改键值对
  userInfo["height"] = 175.5; // 新增键值对
  userInfo["age"] = 20; // 修改已有键的值
  
  // 安全添加(键不存在时才添加)
  userInfo.putIfAbsent("gender", () => "男"); // 键不存在,添加
  userInfo.putIfAbsent("age", () => 21); // 键已存在,不修改
  
  // 删除键值对
  userInfo.remove("isStudent");
  
  // 查询值
  print(userInfo["name"]); // 取值:爱吃大芒果
  print(userInfo["phone"]); // 键不存在,返回 null
  
  // 遍历 Map
  // 方式1:遍历键
  for (String key in userInfo.keys) {
    print("键:$key,值:${userInfo[key]}");
  }
  
  // 方式2:遍历值
  for (dynamic value in userInfo.values) {
    print("值:$value");
  }
  
  // 方式3:遍历键值对
  userInfo.forEach((key, value) {
    print("$key:$value");
  });
}

3. 访问值

通过 map[key] 的方式,若键不存在则返回 null。

九、Dart中动态类型-dynamic

使用 dynamic 声明的变量,类型不受限制,可在运行时动态改变类型。
慎用:会失去 Dart 的类型检查优势,容易引发运行时错误。

dart 复制代码
dynamic value = "Hello";
value = 100; // 允许修改类型
value = true;

十、Dart中的空安全机制

Dart 的空安全是语法层面的特性,核心目标是避免空指针异常(NullPointerException),主要包含以下关键点:

  • 可空类型:在类型后加 ?,表示该变量可以存储 null 值。

    dart 复制代码
    String? name = null; // 允许为 null
    name = "爱吃大芒果"; // 也可以赋值为字符串
  • 非空断言:在变量后加 !,表示强制断言该变量不为 null,若实际为 null 则会抛出运行时错误。

    dart 复制代码
    String? str = "Hello";
    String newStr = str!; // 断言 str 不为 null
  • 空值合并运算符:??,若左侧变量为 null,则使用右侧的默认值。

    dart 复制代码
    String? name = null;
    String realName = name ?? "未知姓名"; // realName 最终为 "未知姓名"
  • 空值赋值运算符:??=,若变量为 null,则将右侧值赋值给变量;若不为 null,则保持原值。

    dart 复制代码
    String? name = null;
    name ??= "爱吃大芒果"; // name 被赋值为 "爱吃大芒果"

十一、Dart中算术运算符和赋值运算符

1. 算术运算符

用于数值计算,包含基础运算和自增 / 自减,用法与主流语言一致。

2. 赋值运算符

核心是 =,扩展运算符可简化运算 + 赋值操作。

  • 基础:=
  • 复合:+=-=*=/=~/=%=
dart 复制代码
void main() {
  int a = 5;
  a += 3; // a = 8
  a -= 2; // a = 6
  a *= 2; // a = 12
  a ~/= 5; // a = 2
  a %= 2; // a = 0
  print(a); // 0
}

3. 比较运算符

用于判断两个值的关系,返回 bool 类型(true/false)。

4. 逻辑运算符

用于布尔值的逻辑运算,常用于条件组合判断。

dart 复制代码
void main() {
  int score = 85;
  bool isStudent = true;
  
  // 逻辑与:两个条件都为真才为真
  if (score >= 80 && isStudent) {
    print("优秀学生");
  }
  
  // 逻辑或:任意一个条件为真即为真
  if (score < 60 || !isStudent) {
    print("不满足优秀条件");
  }
}

十二、Dart中if分支和三元运算符

1. if 分支

基础条件判断,支持 if、if-else、if-else if-else 结构。

dart 复制代码
void main() {
  int score = 85;
  
  if (score >= 90) {
    print("优秀");
  } else if (score >= 80) {
    print("良好");
  } else if (score >= 60) {
    print("及格");
  } else {
    print("不及格");
  }
}

2. 三元运算符

条件 ? 表达式1 : 表达式2,简化二选一的 if-else 逻辑。

dart 复制代码
void main() {
  int score = 85;
  
  // 基础用法
  String result = score >= 60 ? "及格" : "不及格";
  print(result); // 及格
  
  // 嵌套用法(不推荐多层嵌套,可读性差)
  String level = score >= 90 ? "优秀" : (score >= 80 ? "良好" : "普通");
  print(level); // 良好
}

十三、Dart中switch_case

用于多分支等值判断,相比多层 if-else 更简洁,Dart 中需注意:

  • 每个 case 末尾必须加 break(终止执行),或用 continue 跳转到其他 case。
  • 支持 default 分支(匹配不到时执行)。
  • 支持匹配 int、String、枚举等类型。
dart 复制代码
String level = "B";
switch (level) {
  case "A":
    print("优秀");
    break;
  case "B":
    print("良好");
    break;
  default:
    print("普通");
}

注意事项

  • 每个 case 末尾必须加 break(终止执行)或 continue(跳转到其他 case)
  • 支持匹配 int、String、枚举等类型
  • default 分支可选,建议添加以处理异常情况

十四、Dart中while循环

先判断条件,再执行循环体,支持 while 和 do-while(先执行一次,再判断)

dart 复制代码
int i = 0;
while (i < 5) {
  print(i);
  i++;
}

int j = 0;
do {
  print(j); // 至少执行一次
  j++;
} while (j < 0);

十五、Dart中for循环

适合已知循环次数的场景,Dart 中支持经典 for 循环和 for-in 遍历集合。

dart 复制代码
// 经典 for 循环
for (int k = 0; k < 5; k++) {
  print(k);
}

// for-in 遍历列表/Map
List<String> list = ["a", "b", "c"];
for (String item in list) {
  print(item);
}

Map<String, int> map = {"a": 1, "b": 2};
for (String key in map.keys) {
  print("$key: ${map[key]}");
}

十六、Dart中的函数定义

Dart 是面向函数的语言,函数是一等对象,基础定义格式:

dart 复制代码
// 格式:返回值类型 函数名(参数列表) { 函数体; return 返回值; }
int add(int a, int b) {
  return a + b;
}

// 无返回值可写 void,也可省略 return
void printInfo(String info) {
  print(info);
}

void main() {
  int sum = add(3, 5);
  print(sum); // 8
  
  printInfo("爱吃大芒果"); // 输出:爱吃大芒果
}

// 有返回值函数
int add(int a, int b) {
  return a + b;
}

// 无返回值函数(void)
void printInfo(String info) {
  print("信息:$info");
}

十七、Dart中函数的必传参数、可选位置参数和可选命名参数

(1)必传参数

默认参数为必传,调用时必须传入,数量和类型需匹配。

dart 复制代码
void sayHello(String name) { // name 是必传参数
  print("Hello $name");
}
sayHello("Dart"); // 必须传参,否则报错

(2)可选位置参数

用 [] 包裹,调用时可传可不传,需放在必传参数后,可指定默认值。

dart 复制代码
// [age] 是可选位置参数,默认值 18
void introduce(String name, [int age = 18]) {
  print("姓名:$name,年龄:$age");
}
introduce("张三"); // 使用默认值:姓名:张三,年龄:18
introduce("李四", 20); // 传入参数:姓名:李四,年龄:20

(3)可选命名参数

用 {} 包裹,调用时需指定参数名(参数名: 值),可读性更高,也可指定默认值。

dart 复制代码
// {age, gender} 是可选命名参数
void introduce2(String name, {int age = 18, String gender = "男"}) {
  print("姓名:$name,年龄:$age,性别:$gender");
}
// 调用:指定参数名,顺序可任意
introduce2("王五", gender: "女", age: 22);

十八、Dart中的匿名函数和箭头函数

1. 匿名函数

无函数名的函数,常用于临时回调

dart 复制代码
Function test = () {
  print("测试");
};
void onTest(Function callBack) {
  callBack();
}
void main(List<String> args) {
  onTest(test); // 调用函数,传递匿名函数
}
// 输出:测试

2. 箭头函数

=> 简化单行函数体的匿名函数,=> 后只能跟一个表达式

dart 复制代码
int multiply(int a, int b) => a * b;

Dart 作为 Flutter 的核心开发语言,其语法兼具安全性和灵活性。本次学习内容围绕Dart语法入门为主题展开,重点梳理了关键概念、实用方法和操作步骤。掌握这些基础语法是深入学习 Flutter 开发的重要前提。

欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区

相关推荐
2501_944424122 小时前
Flutter for OpenHarmony游戏集合App实战之记忆翻牌表情图案
开发语言·javascript·flutter·游戏·harmonyos
2501_944424122 小时前
Flutter for OpenHarmony游戏集合App实战之数字拼图打乱排列
android·开发语言·flutter·游戏·harmonyos
运维行者_2 小时前
OpManager 对接 ERP 避坑指南,网络自动化提升数据同步效率
运维·服务器·开发语言·网络·microsoft·网络安全·php
爱编程的小庄2 小时前
Rust初识
开发语言·rust
23124_802 小时前
热身签到-ctfshow
开发语言·python
小白学大数据2 小时前
移动端Temu App数据抓包与商品爬取方案
开发语言·爬虫·python
吃吃喝喝小朋友2 小时前
JavaScript文件的操作方法
开发语言·javascript·ecmascript
2301_797312262 小时前
学习Java42天
java·开发语言·学习
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 知识问答游戏实现
android·开发语言·javascript·python·flutter·游戏·harmonyos