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

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

作者:爱吃大芒果

个人主页 爱吃大芒果

本文所属专栏Flutter

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


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

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

相关资料

承接上文:Dart 语法核心知识点总结(上)

十九、Dart中类的定义

Dart 是纯面向对象语言,一切皆对象,类是对象的模板,包含属性和方法。

dart 复制代码
// 定义类
class Person {
  // 属性(成员变量)
  String name;
  int age;
  
  // 构造函数(初始化属性)
  Person(this.name, this.age);
  
  // 方法
  void sayHello() {
    print("大家好,我是$name,今年$age岁");
  }
}

void main() {
  // 创建对象
  Person p = Person("爱吃大芒果", 19);
  p.sayHello(); // 输出:大家好,我是爱吃大芒果,今年19岁
}

二十、Dart中类的默认构造函数

如果不手动定义构造函数,Dart 会提供一个默认的无参构造函数。手动定义后,默认构造函数失效。

二十一、Dart中类的命名构造函数

一个类可以有多个命名构造函数,用于不同的初始化场景:

dart 复制代码
class Person {
  String name;
  int age;
  
  // 默认构造函数
  Person(this.name, this.age);
  
  // 命名构造函数1:初始化默认值
  Person.defaultPerson() : name = "未知", age = 0;
  
  // 命名构造函数2:从Map初始化
  Person.fromMap(Map<String, dynamic> map) : 
    name = map["name"], 
    age = map["age"];
  
  void sayHello() {
    print("大家好,我是$name,今年$age岁");
  }
}

void main() {
  Person p1 = Person.defaultPerson();
  p1.sayHello(); // 大家好,我是未知,今年0岁
  
  Person p2 = Person.fromMap({"name": "张三", "age": 20});
  p2.sayHello(); // 大家好,我是张三,今年20岁
}

二十二、Dart中类构造函数的语法糖写法

简化属性初始化,无需手动赋值:

dart 复制代码
class Person {
  // 直接在构造函数参数前加 this.,自动赋值
  Person(this.name, this.age);
  
  String name;
  int age;
}

二十三、类的公有属性和私有属性

Dart 没有专门的 public/private 关键字,通过标识符命名规则区分公有 / 私有属性 / 方法:

  • 公有成员:以小写字母 / 大写字母开头(如 name、age、sayHello),可被外部访问。
  • 私有成员:以下划线 _ 开头(如 _id、_secret),仅能在当前文件内访问。

核心规则

  1. 私有成员的作用域是文件级,而非类级(即使是不同类,只要在同一文件内就能访问)。
  2. 私有成员无法被其他文件的子类继承 / 访问。
  3. 通常通过公有方法(getter/setter)封装私有成员,控制访问权限。
dart 复制代码
// person.dart 文件
class Person {
  // 公有属性
  String name;
  
  // 私有属性(下划线开头)
  int _age;
  String _idCard; // 身份证号,隐私数据
  
  // 构造函数
  Person(this.name, this._age, this._idCard);
  
  // 公有方法:访问私有属性(getter)
  int get age => _age;
  
  // 公有方法:修改私有属性(setter,带校验逻辑)
  set age(int newAge) {
    if (newAge >= 0 && newAge <= 120) {
      _age = newAge;
    } else {
      print("年龄不合法");
    }
  }
  
  // 私有方法
  void _checkIdCard() {
    print("校验身份证格式:$_idCard");
  }
  
  // 公有方法调用私有方法
  void showInfo() {
    _checkIdCard(); // 同一类内可访问私有方法
    print("姓名:$name,年龄:$_age");
  }
}

void main() {
  Person p = Person("爱吃大芒果", 19, "110101XXXX");
  
  // 访问公有属性
  print(p.name); // 正常输出:爱吃大芒果
  
  // 直接访问私有属性(编译报错)
  // print(p._age); // Error: The getter '_age' isn't defined for the class 'Person'
  
  // 通过 getter/setter 访问私有属性
  print(p.age); // 输出:19
  p.age = 20; // 合法修改
  print(p.age); // 输出:20
  p.age = -5; // 输出:年龄不合法
  
  // 调用公有方法(间接执行私有逻辑)
  p.showInfo();
}

跨文件访问示例(错误演示)

dart 复制代码
// test.dart 文件(另一个文件)
import 'person.dart';

void main() {
  Person p = Person("张三", 20, "123456");
  // print(p._age); // 编译报错:私有成员无法跨文件访问
}

二十四、Dart中类的继承

Dart 支持单继承,使用 extends 关键字,子类可以继承父类的属性和方法:

dart 复制代码
// 父类
class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
  
  void sayHello() {
    print("大家好,我是$name,今年$age岁");
  }
}

// 子类
class Student extends Person {
  // 子类属性
  String school;
  
  // 子类构造函数(必须调用父类构造函数)
  Student(String name, int age, this.school) : super(name, age);
  
  // 重写父类方法
  @override
  void sayHello() {
    super.sayHello(); // 调用父类方法
    print("我在$school上学");
  }
}

void main() {
  Student s = Student("爱吃大芒果", 19, "皮城大学");
  s.sayHello();
  // 输出:
  // 大家好,我是爱吃大芒果,今年19岁
  // 我在皮城大学上学
}

二十五、Dart中类的多态

子类对象可以赋值给父类变量,调用方法时执行子类的实现:

dart 复制代码
void main() {
  // 多态:父类引用指向子类对象
  Person p = Student("爱吃大芒果", 19, "皮城大学");
  p.sayHello(); // 执行子类重写的方法
}

二十六、Dart中类的多态-抽象和接口实现

Dart 的多态核心是父类引用指向子类对象,而抽象类和接口是实现多态的核心载体。

抽象类(abstract class)

  • abstract 关键字声明,不能被实例化,只能被继承。
  • 可以包含抽象方法(无实现体)和普通方法(有实现体)。
  • 子类必须实现所有抽象方法,否则子类也需声明为抽象类。
适用场景

定义通用规范(如 "动物都能叫"),由子类实现具体逻辑。

dart 复制代码
// 抽象类:定义规范
abstract class Animal {
  // 抽象方法(无实现体)
  void makeSound();
  
  // 普通方法(有实现体)
  void eat() {
    print("动物吃东西");
  }
}

// 子类1:实现抽象方法
class Dog extends Animal {
  @override
  void makeSound() {
    print("汪汪汪");
  }
}

// 子类2:实现抽象方法
class Cat extends Animal {
  @override
  void makeSound() {
    print("喵喵喵");
  }
  
  // 重写父类普通方法
  @override
  void eat() {
    print("猫吃小鱼干");
  }
}

void main() {
  // 多态:父类引用指向子类对象
  Animal animal1 = Dog();
  Animal animal2 = Cat();
  
  // 调用子类实现的方法
  animal1.makeSound(); // 输出:汪汪汪
  animal2.makeSound(); // 输出:喵喵喵
  
  // 调用方法(子类重写则执行子类逻辑)
  animal1.eat(); // 输出:动物吃东西
  animal2.eat(); // 输出:猫吃小鱼干
}

接口实现(implements)

Dart 没有专门的 interface 关键字,所有类都可以作为接口被实现:

  • implements 关键字实现接口,而非 extends
  • 必须实现接口类的所有属性和方法(无论是否抽象)。
  • 一个类可以实现多个接口(类似多继承)。
适用场景

定义 "能力规范"(如 "可飞行"、"可游泳"),让不同类具备相同能力。

dart 复制代码
// 接口1:可飞行
class Flyable {
  void fly() {
    print("默认飞行逻辑");
  }
}

// 接口2:可游泳
class Swimmable {
  void swim() {} // 空实现
}

// 实现多个接口
class Duck implements Flyable, Swimmable {
  // 必须实现 Flyable 的 fly 方法
  @override
  void fly() {
    print("鸭子扑腾翅膀飞");
  }

  // 必须实现 Swimmable 的 swim 方法
  @override
  void swim() {
    print("鸭子划水游泳");
  }
  
  // 自定义方法
  void quack() {
    print("嘎嘎嘎");
  }
}

void main() {
  Duck duck = Duck();
  duck.fly(); // 输出:鸭子扑腾翅膀飞
  duck.swim(); // 输出:鸭子划水游泳
  duck.quack(); // 输出:嘎嘎嘎
  
  // 多态:接口引用指向实现类对象
  Flyable flyable = Duck();
  flyable.fly(); // 仅能调用接口定义的方法
}

抽象类 vs 接口

二十七、Dart中类的混入

Dart 不支持多继承,但可以通过混入(Mixin)实现类似多继承的效果,使用 with 关键字:

dart 复制代码
// 定义混入类(不能被实例化)
mixin Run {
  void run() {
    print("跑步");
  }
}

mixin Swim {
  void swim() {
    print("游泳");
  }
}

// 使用混入
class Person with Run, Swim {
  String name;
  Person(this.name);
}

void main() {
  Person p = Person("爱吃大芒果");
  p.run(); // 跑步
  p.swim(); // 游泳
}

二十八、Dart中的泛型

泛型(Generic)是指在定义类、函数、接口时不指定具体类型,使用时再确定类型,核心作用:

  1. 类型安全:编译时检查类型,避免运行时类型错误。
  2. 代码复用:一套逻辑适配多种类型,无需重复编写。
  3. 可读性提升:明确代码支持的类型范围。
dart 复制代码
// 泛型函数:T 是类型参数(可自定义名称,如 E、K、V)
T swap<T>(List<T> list, int index1, int index2) {
  if (index1 < 0 || index2 < 0 || index1 >= list.length || index2 >= list.length) {
    throw ArgumentError("索引越界");
  }
  // 交换元素
  T temp = list[index1];
  list[index1] = list[index2];
  list[index2] = temp;
  return temp;
}

void main() {
  // 适配 int 类型
  List<int> numList = [1, 2, 3];
  swap(numList, 0, 2);
  print(numList); // 输出:[3, 2, 1]
  
  // 适配 String 类型
  List<String> strList = ["a", "b", "c"];
  swap(strList, 1, 2);
  print(strList); // 输出:[a, c, b]
}

二十九、Dart中的异步编程

Dart 是单线程模型,异步编程核心解决耗时操作(网络请求、文件读写)阻塞主线程的问题,核心概念包括:Futureasync/awaitStreamIsolate

(1)Future 状态

  • 未完成(pending):异步操作还在执行。
  • 已完成(completed):
    • 成功(value):返回结果。
    • 失败(error):抛出异常。

(2)Future 常用方法

三十、Dart中Future的基本使用

Dart 是单线程语言,异步操作主要通过 Future 实现,用于处理耗时操作(如网络请求、文件读写)。

dart 复制代码
void main() {
  print("开始执行");
  
  // 延迟1秒执行
  Future.delayed(Duration(seconds: 1), () {
    print("异步操作执行");
    return "操作结果";
  });
  
  print("结束执行");
  // 输出顺序:
  // 开始执行
  // 结束执行
  // 异步操作执行
}

异常处理

三十一、Dart中Future的链式调用

使用 then 处理异步操作的结果,支持链式调用:

dart 复制代码
Future.delayed(Duration(seconds: 1), () => 1)
  .then((num) => num + 1) // 1+1=2
  .then((num) => num * 2) // 2*2=4
  .then((num) => print("结果:$num")); // 输出:结果:4

三十二、Dart中Future的async和await

async/awaitFuture 的语法糖,让异步代码看起来像同步代码,更易读:

dart 复制代码
void main() async {
  print("开始执行");
  
  // 等待异步操作完成
  String result = await fetchData();
  print("异步结果:$result");
  
  print("结束执行");
  // 输出顺序:
  // 开始执行
  // 异步操作完成
  // 异步结果:成功获取数据
  // 结束执行
}

// 异步函数(返回 Future)
Future<String> fetchData() {
  return Future.delayed(Duration(seconds: 1), () {
    print("异步操作完成");
    return "成功获取数据";
  });
}

异常处理

dart 复制代码
void main() async {
  try {
    String result = await fetchData();
    print("结果:$result");
  } catch (e) {
    print("异常:$e"); // 输出:异常:请求失败
  }
}

Future<String> fetchData() {
  return Future.delayed(Duration(seconds: 1), () {
    throw "请求失败"; // 抛出异常
    return "成功";
  });
}

总结

  1. 面向对象核心:Dart 纯面向对象,支持类定义、构造函数(默认/命名/语法糖)、访问控制(下划线私有)、单继承、多态,通过抽象类定义规范、接口实现能力、混入(Mixin)模拟多继承。
  2. 泛型:通过类型参数实现代码复用和类型安全,一套逻辑适配多种类型,编译时检查类型错误。
  3. 异步编程 :基于单线程模型,核心是 Future 处理异步操作,async/await 简化异步代码写法,支持链式调用和 try/catch 异常处理,解决耗时操作阻塞问题。

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

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

相关推荐
Scott9999HH6 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区10 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜11 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa11 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio