Dart 高级语法

news2024/11/27 16:43:05

Dart 是一种由 Google 开发的开源编程语言,旨在为构建高性能、可移植的应用程序提供支持。它被设计用于多种平台,包括Web、移动设备(通过 Flutter 框架)、服务器端应用以及桌面应用。以下是一些 Dart 中比较高级的语言特性和模式。通过掌握这些概念,你可以更加灵活地利用 Dart 来构建复杂的程序。
在这里插入图片描述

异步编程

异步编程是处理那些可能需要长时间完成的操作(如网络请求、文件读写等)的一种方式,而不会阻塞程序的其他部分。Dart 提供了多种机制来支持异步编程,主要包括 Future 和 async/await 语法。

  • Future:Future 是 Dart 中表示异步操作结果的对象。一个 Future 对象最终会有一个值(当操作成功时)或者一个错误(当操作失败时)。你可以使用 then 方法来指定当 Future 完成时要执行的回调函数。
  • async/await:async 和 await 关键字使得编写异步代码变得更加直观和易于理解。async 标记一个函数为异步函数,该函数可以使用 await 来等待 Future 的完成。
import 'dart:io';

Future<String> fetchUserOrder() async {
  // 模拟网络请求
  await Future.delayed(Duration(seconds: 2));
  return "Large Latte";
}

void main() async {
  try {
    var order = await fetchUserOrder();
    print('Your order is: $order');
  } catch (e) {
    print('Failed to fetch user order: $e');
  }
}

泛型

泛型(Generics)是一种编程语言特性,它允许你编写可以处理多种数据类型的代码。通过使用泛型,你可以创建更加灵活和可重用的组件,同时保持类型安全。在 Dart 中,泛型被广泛用于集合类(如 List, Map 和 Set),以及自定义类和方法中。

List<String> names = ['Alice', 'Bob'];

class Box<T> {
  T value;
  Box(this.value);
}

void main() {
  Box<int> numberBox = Box(5);
  Box<String> stringBox = Box("Hello");
  print(numberBox.value); // 输出 5
  print(stringBox.value); // 输出 Hello
}

级联操作符(…)

级联操作符允许你在一个对象上连续调用多个方法或访问属性,而不需要重复引用该对象。
级联操作的优点是:

  1. 提高可读性:通过将一系列相关的操作放在同一行或几行中,可以清晰地表达这些操作是针对同一个对象的。
  2. 链式调用:可以方便地进行链式调用,适用于构建对象或执行一系列初始化步骤。
class Person {
  String name;
  int age;

  void setName(String newName) => name = newName;
  void setAge(int newAge) => age = newAge;
}

void main() {
  var person = Person()
    ..setName("John")
    ..setAge(30);

  print(person.name); // 输出 John
  print(person.age);  // 输出 30
}

在这个例子中,person 对象被创建后,通过级联操作符 … 连续调用了 setName 和 setAge 方法,并最终调用了 printInfo 方法来输出信息。

Mixins

Mixins 允许你在不使用多重继承的情况下重用代码。一个 mixin 可以包含方法和字段,这些可以在混入它的类中被访问。

mixin Musical {
  void playMusic() => print("Playing music...");
  void stopMusic() => print("Stopping music...");
}

class MusicPlayer with Musical {}

void main() {
  var player = MusicPlayer();
  player.playMusic(); // 输出 Playing music...
  player.stopMusic(); // 输出 Stopping music...
}

Mixins 的出现主要是为了解决继承机制中的一些限制和问题,特别是在处理代码重用和组合行为时。虽然继承是一种强大的工具,但它也带来了一些挑战,尤其是在需要灵活组合多个功能的情况下。
以下是 Mixins 与传统继承相比的一些优势:
避免多重继承的问题 在许多面向对象语言中,多重继承可能会导致复杂的层次结构,并且容易引发“菱形问题”(Diamond Problem),即当一个类从两个或多个基类继承相同的方法或属性时,编译器不知道应该使用哪个版本:

class A {
  void show() => print("A");
}

class B extends A {
  
  void show() => print("B");
}

class C extends A {
  
  void show() => print("C");
}

// 如果 D 同时继承 B 和 C,那么 D.show() 应该调用哪个?
//Dart 不支持多重继承,而是通过 Mixins 提供了一种更安全的方式来组合行为。
class D extends B with C {} // 这在 Dart 中是不允许的

更好的组合优于继承 在某些情况下,组合(Composition)比继承(Inheritance)更为合适。Mixins 使得组合更加直观和易于管理。通过 Mixins,你可以将多个小的功能单元组合成一个更大的功能单元,而不是通过复杂的继承层次来实现。
减少类爆炸 在大型项目中,如果过度依赖继承,可能会导致大量的子类,这些子类可能只为了添加一些微小的变化。Mixins 可以帮助减少这种类爆炸现象,因为你可以在运行时动态地组合不同的 Mixin 来创建所需的行为。

工厂构造函数

工厂构造函数(Factory Constructor)是 Dart 中的一种特殊类型的构造函数,它允许你控制对象的创建过程。与普通的构造函数不同,工厂构造函数不总是创建新的实例;相反,它可以返回已有的实例、子类的实例,或者甚至返回 null。工厂构造函数使用 factory 关键字来定义。

class Logger {
  final String name;
  bool _isInitialized = false;

  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name]!;
    } else {
      final logger = Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }

  Logger._internal(this.name) {
    // 初始化逻辑
  }

  static final Map<String, Logger> _cache = <String, Logger>{};
}

void main() {
  var log1 = Logger('log1');
  var log2 = Logger('log1');
  assert(log1 == log2); // true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…

连续时间傅里叶变换

一、非周期信号的表示&#xff1a;连续时间傅里叶变换 傅里叶变换对&#xff1a; 通常称为的频谱 二、傅里叶变换的收敛 1、绝对可积 2、在任何有限区间内&#xff0c;只有有限个最大值和最小值 3、在任何有限区间内&#xff0c;有有限个不连续点&#xff0c;且在每个不连…

C语言动态内存管理(26)

文章目录 前言一、引子二、malloc三、calloc四、realloc五、free六、常见的动态内存错误对NULL指针进行解引用操作对动态开辟空间的越界访问对非动态开辟的内存使用free释放使用free释放动态开辟内存的一部分对同一块内存多次释放动态开辟内存忘记释放&#xff08;内存泄漏&…

k8s 之安装helm服务

helm安装包下载helm官网_zh 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/01/30 00:51 下载安装包 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz 解压安装包 tar -zxcf helm-v3.2.3-linux-amd64.tar.gz 进入到解压目录 cd linux-amd64 将helm目录拷贝…

101. 对称二叉树【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 递归3.2 迭代 四、参考代码4.1 递归4.2 迭代 零、原题链接 101. 对称二叉树 一、题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 进阶&#xff1a;你可以运用递归和迭代两种方法解决…

YOLO11改进|注意力机制篇|引入上下文锚注意力机制CAA

目录 一、【CAA】注意力机制1.1【CAA】注意力介绍1.2【CAA】核心代码 二、添加【CAA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【CAA】注意力机制 1.1【CAA】注意力介绍 CAA注意力机制的结构图如下&#xff0c;下面根据…

Selenium WebDriver和Chrome对照表

PS&#xff1a;我的没下载WebDriver 也没配置环境变量 也能用Selenium 网上有说把WebDriver放到chrome的安装目录并将路径配到path中【可能之前用playwright下载过】 查看浏览器版本号 在浏览器的地址栏&#xff0c;输入chrome://version/&#xff0c;回车后即可查看到对应版…

Java项目实战II基于Java+Spring Boot+MySQL的智能推荐的卫生健康系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在健康意识日益增强的今天&#xff0c;如何为用户提供个性化、精准的卫生健康建议成为了一个亟待解决…

java中的多层循环控制,包括金字塔和九九乘法表的打印

多重循环控制 多重循环控制练习 多重循环控制 1.将一个循环放在另一个循环体内&#xff0c;就形成了嵌套循环。其中&#xff0c;for&#xff0c;while&#xff0c;do…while均可以作为外层循环和内层循环。【建议一般用两层&#xff0c;最多不要超过3层&#xff0c;否则代码的…

【前端】前端数据转化为后端数据

【前端】前端数据转化为后端数据 写在最前面格式化数组代码解释hasOwnProperty是什么&#xff1f; &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限…

k8s实战-3

k8s实战-3 一、Ingress1.安装2.测试 二、存储抽象1.环境准备2.PV和PVC3.ConfigMap4.Secret 总结 一、Ingress Ingress 类似于一个“网关”&#xff0c;它负责将外部 HTTP 请求路由到集群内的服务。你可以把它想象成一个“交通警察”&#xff0c;根据请求的 URL 和路径&#xf…

无锡自闭症康复寄宿学校:每天的康复方式揭秘

无锡自闭症康复寄宿学校的启示&#xff1a;揭秘广州星贝育园的日常康复方式 在自闭症儿童的教育与康复领域&#xff0c;每一所学校都在用自己的方式探索着前行的道路。无锡的自闭症康复寄宿学校以其独特的康复方式和显著的效果&#xff0c;为众多家庭带来了希望。而在广州&…

jvisualvm学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

前端工程化 - Vue

环境准备 Vue-cli是Vue官方提供的一个脚手架&#xff0c;用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能&#xff1a; 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…

蓝桥杯省赛真题打卡day4

[蓝桥杯 2013 省 A] 大臣的旅费 题目描述 很久以前&#xff0c;T 王国空前繁荣。为了更好地管理国家&#xff0c;王国修建了大量的快速路&#xff0c;用于连接首都和王国内的各大城市。 为节省经费&#xff0c;T 国的大臣们经过思考&#xff0c;制定了一套优秀的修建方案&am…

模电中二极管,三极管和电容的应用

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

三维模型点云化工具V1.0使用介绍:将三维模型进行点云化生成

三维软件绘制的三维模型导入之后&#xff0c;可以生成点云&#xff0c;用于替代实际的激光扫描过程&#xff0c;当然&#xff0c;主要是用于点云算法的测试和验证&#xff0c;没法真正模拟扫描的效果&#xff0c;因为太过于理想化了。 功能介绍 将三维软件绘制的三维模型变成…

一个月学会Java 第3天 对类的深刻认识

Day3 对类的深刻认识 第一章 方法 在Day2的时候已经浅浅的认识过类&#xff0c;但是还是不够深刻&#xff0c;我们现在来深刻的认识一下类是什么和他的结构&#xff0c;首先在认识类的结构之前我们需要再认识和了解这么一个东西&#xff0c;他就是——方法 方法(method)也叫函…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代&#xff0c;管理和备份手机数据变得越来越重要。无论是转移照片、备份短信&#xff0c;还是管理应用程序&#xff0c;一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件&#xff0c;已经成为许多用户的选择。但是&#xff0c;许多…