Dart语言

基础篇:

第 1 部分:Dart 的基础语法

1.1 Dart 程序的结构

一个简单的 Dart 程序通常包含一个 main() 函数,这是程序的入口点。所有 Dart 程序都会从 main() 函数开始执行。

void main() {print('Hello, Dart!');
}
  • void 表示 main() 函数没有返回值。
  • print() 是一个函数,用于将内容输出到控制台。
1.2 变量和数据类型

Dart 是一种静态类型语言,这意味着你需要声明变量的类型,或者让 Dart 自动推断类型。

void main() {int a = 10; // 整数类型double b = 20.5; // 浮动类型String name = 'Dart'; // 字符串类型bool isActive = true; // 布尔类型print(a); print(b);print(name);print(isActive);
}

常见数据类型:

  • int:整数
  • double:浮动数
  • String:字符串
  • bool:布尔值(true 或 false
1.3 常量和变量

Dart 还支持常量和变量的声明,使用 var 关键字时 Dart 会自动推断类型。

void main() {var age = 25; // 自动推断为 int 类型const pi = 3.14; // 常量(编译时值不可更改)final name = 'Dart Language'; // 只读变量,运行时值不可更改print(age);print(pi);print(name);
}
  • const:编译时常量
  • final:运行时常量

第 2 部分:控制结构

2.1 条件语句

Dart 使用 ifelseswitch 来处理条件。

void main() {int number = 10;if (number > 0) {print('Number is positive');} else if (number < 0) {print('Number is negative');} else {print('Number is zero');}
}
2.2 循环语句

Dart 提供 forwhiledo-while 来进行循环。

void main() {for (int i = 0; i < 5; i++) {print('i = $i');}
}

你也可以使用 for-in 来遍历集合:

void main() {List<int> numbers = [1, 2, 3, 4, 5];for (var number in numbers) {print(number);}
}

第 3 部分:函数

Dart 中的函数定义方式与其他语言类似。你可以定义带有参数和返回值的函数。

int add(int a, int b) {return a + b;
}void main() {var result = add(3, 4);print(result); // 输出 7
}
  • int add(int a, int b) 定义了一个接受两个整数并返回整数的函数。
  • return 关键字用于返回结果。
3.1 可选参数

Dart 还支持可选参数,分为两种类型:位置参数命名参数

位置参数(Positional Parameters):

  • [] 表示参数可选,且放在必需位置参数的后面,可以指定默认值。
  • 在调用时按位置传递参数,不能改变顺序。
  • ? 使参数能够接受 null 值

示例:

void greet(String name, [int? age, String gende = 'Unknown']) {print('Hello $name, your gender is $gende');if (age != null) {print('You are $age years old.');}
}void main() {greet('Alice', 25);  // 传递时按位置greet('Bob');  // 只传递 name
}

命名参数(Named Parameters):

  • 使用大括号 {} 来定义。
  • 在调用时需要指定参数名,可以按任意顺序传递。
  • ? 使参数能够接受 null 值
  • 位置参数需按顺序传递(如下1要在'1'之前)

示例:

void greet(int index1, String index2, {required String name, int? age, String gende = 'Unknown'}) {print('$index2, $index1, Hello $name, your gender is $gende');if (age != null) {print('You are $age years old.');}
}void main() {greet(age: 25, 1, name: 'Alice', '1');  // 按名称传递greet(name: 'Bob', 1, '1');  // 只传递 name,age 默认为 null// 虽然上面两行也可以运行不报错,但代码的可读性和可维护性变差// 建议入参按函数参数顺序greet(1, '1', name: 'Alice', age: 25);  // 按名称传递greet(1, '1', name: 'Bob');  // 只传递 name,age 默认为 null
}

第 4 部分:面向对象

Dart 是面向对象的语言,支持类和对象的创建。

4.1 定义类和对象
class Person {String name;int age;Person(this.name, this.age);  // 构造函数void introduce() {print('My name is $name and I am $age years old.');}
}void main() {var person1 = Person('Alice', 25);person1.introduce();  // 输出:My name is Alice and I am 25 years old.
}
4.2 继承
class Animal {void speak() {print('Animal speaks');}
}class Dog extends Animal {@overridevoid speak() {print('Dog barks');}
}void main() {var dog = Dog();dog.speak();  // 输出:Dog barks
}
  • extends 用于继承父类。
  • @override 用于重写父类方法。

第 5 部分:集合和异步编程

5.1 List 和 Map
void main() {List<String> fruits = ['Apple', 'Banana', 'Orange'];print(fruits);Map<String, String> capitals = {'USA': 'Washington, D.C.','France': 'Paris','Japan': 'Tokyo'};print(capitals);
}
5.2 异步编程

Dart 使用 Futureasyncawait 来处理异步操作。

Future<void> fetchData() async {await Future.delayed(Duration(seconds: 2));print('Data fetched!');
}void main() {fetchData();print('Waiting for data...');
}
  • Future 是用于表示未来某个时间点会完成的操作。
  • async 和 await 用于处理异步操作。

进阶篇:

第 6 部分:错误处理

在 Dart 中,错误处理通过 trycatchfinally 来实现。

6.1 trycatch 和 finally
void main() {try {int result = 10 ~/ 0;  // 故意让除数为 0,抛出异常print(result);} catch (e) {print('An error occurred: $e');} finally {print('This will always execute');}
}
  • try 块中放置可能会抛出异常的代码。
  • catch 用来捕获异常并处理。
  • finally 无论是否发生异常都会执行。
6.2 自定义异常

你还可以创建自定义的异常类来更好地处理特定的错误情况。

class CustomException implements Exception {String cause;CustomException(this.cause);@overrideString toString() {return 'CustomException: $cause';}
}void main() {try {throw CustomException('Something went wrong!');} catch (e) {print('Caught an exception: $e');}
}

第 7 部分:库和包

Dart 允许你通过库(import)和包来扩展应用程序的功能。你可以导入 Dart 标准库或者第三方库。

7.1 导入库
import 'dart:math';  // 导入 Dart 内置的数学库void main() {var random = Random();print(random.nextInt(100));  // 打印一个 0 到 99 之间的随机数
}
7.2 创建和使用包

你可以创建自己的 Dart 包,或者使用社区发布的包。在 pubspec.yaml 文件中配置依赖关系后,通过 import 使用这些包。

dependencies:http: ^1.2.2

通过 pub get 下载包,然后在代码中使用:

import 'package:http/http.dart' as http;void main() async {var response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));print(response.body);
}

第 8 部分:异步编程(更深入)

虽然前面简单介绍了 Dart 的异步编程,但 Dart 的 asyncawait 可以更深入地应用。特别是在处理复杂的 I/O 操作或多个异步任务时,理解其工作方式非常重要。

8.1 Future 和 Stream
  • Future 表示一个尚未完成的异步操作。
  • Stream 用于表示一系列异步事件(比如从网络获取的数据流)。

使用 Future 进行并行操作:

Future<int> fetchData() async {await Future.delayed(Duration(seconds: 1));return 66;
}void main() async {print('Fetching data...');int result = await fetchData();print('Data fetched: $result');
}

使用 Stream 来处理数据流:

Stream<int> countStream() async* {for (int i = 0; i < 5; i++) {await Future.delayed(Duration(seconds: 1));yield i;  // 使用 yield 产生数据}
}void main() async {await for (var count in countStream()) {print('Count: $count');}
}
  • async* 和 yield 用于异步生成流数据。
  • await for 用来监听流数据。

其他说明:

  • async:将函数标记为异步,返回一个 Future 对象。
  • await:用于等待异步操作完成,通常在 async 函数中使用。
  • async*:用于定义一个返回 Stream 的异步生成器函数,支持异步地产生多个值。

第 9 部分:扩展与 mixins

9.1 扩展(Extensions)

Dart 允许你为现有的类添加新的功能,甚至不需要修改类的原始定义。通过扩展,你可以给类添加新的方法。

extension StringUtils on String {// 计算单词数int get wordCount {return split(' ').length;}// 获取字符串反转String get reverse {return split('').reversed.join('');}
}void main() {String text = "Hello world, how are you?";print(text.wordCount);  // 输出: 5print(text.reverse);    // 输出: "?uoy era woh ,dlrow olleH"
}
9.2 Mixins

Mixin 是 Dart 中的一种复用代码的机制,它允许你将方法或属性混入到多个类中,而不是通过继承。

mixin Swimmable {void swim() {print('Swimming!');}
}mixin Flyable {// 默认的属性String flySpeed = "fast";void fly() {print("Flying at $flySpeed speed!");}
}class Bird with Flyable, Swimmable {// 可以重写 Flyable 中的属性@overrideString flySpeed = "medium";void chirp() {print('Chirp Chirp!');}
}void main() {var bird = Bird();bird.swim();  // 输出: Swimming!bird.fly();   // 输出: Flying at medium speed!bird.chirp(); // 输出: Chirp Chirp!
}
  • mixin 用来定义一个可以被其他类混入的类。
  • with 用来将 mixin 添加到类中。

第 10 部分:Flutter 简介

Dart 的一大亮点是与 Flutter 的结合。Flutter 是一个开源的 UI 框架,允许你使用 Dart 来构建跨平台的应用。

10.1 安装 Flutter 和创建第一个应用

如果你打算学习 Flutter,可以通过安装 Flutter SDK 来开始。在 Flutter 中,你可以使用 Dart 语言来构建用户界面。

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',home: Scaffold(appBar: AppBar(title: Text('Hello, Flutter!'),),body: Center(child: Text('Welcome to Dart and Flutter!'),),),);}
}
  • runApp() 启动应用。
  • MaterialApp 和 Scaffold 用于构建基本的应用界面。

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

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

相关文章

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时&#xff0c;command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似&#xff0c;但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率&#xff0c;还能帮助我们规避一些潜在的风险。在这篇文章…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程&#xff08;主线是江科大的视频&#xff09;中的记录与发散思考。 初学难免有所纰漏、错误&#xff0c;还望大家不吝指正&#xff0c;感谢~ 一、I2C 外设简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主多从的串行通信协议…

.Net Core webapi 实现JWT认证

文章目录 需求准备创建JWT配置创建JWTService注册JWT创建中间件读取jwt的token在需要的接口上添加属性启动认证启动swagger的授权认证使用 需求 实现一个记录某个用户所有操作的功能 准备 创建你的webapi项目从nuget下载安装JWT资源包根据你的项目使用.net版本下载对应的jwt…

leetcode203-移除链表元素

leetcode203 什么是链表 之前不懂链表的数据结构&#xff0c;一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的&#xff0c;题目中给的链表是单向链表&#xff0c;有两个值&#xff0c;一个val表示值&#xff0c;一个next&#xff1a;表示连接的下一个…

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和pe…

stack_queue的底层,模拟实现,deque和priority_queue详解

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#xff0c;这种模式将类的接口转化为用户希…

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

杰盛微 IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 SOP28封装

IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 IRS2336是 N型高压、高速功率 MOSFET/IGBT高低侧三相栅极驱动芯片&#xff0c;包含三路独立的半桥驱动电路。内部集成了欠压保护和过流保护功能&#xff0c;出现异常时立即关断六通道输出。提供外部使能控制可同时关断…

深入理解第三范式(3NF):数据库设计中的重要性与实践

title: 深入理解第三范式(3NF):数据库设计中的重要性与实践 date: 2025/1/17 updated: 2025/1/17 author: cmdragon excerpt: 在数据库设计中,规范化是确保数据完整性、减少冗余和提高查询效率的关键过程。第三范式(3NF)作为关系数据库设计的高级规范,建立在前两范式…

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…

RK3576 Android14 状态栏和导航栏增加显示控制功能

问题背景&#xff1a; 因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制&#xff0c;包括对锁屏后下拉状态栏的屏蔽&#xff0c;在设置功能里增加此功能的控制&#xff0c;故参考一些博客完成此功能&#xff0c;以下是具体代码路径的修改内容。 解决方案&…

C#高级:通过 Assembly 类加载 DLL 和直接引用DLL的方法大全

一、主项目不添加引用 &#xff08;主项目不添加引用&#xff0c;而是通过路径获取指定dll&#xff09; 1.打印类的属性名称 namespace ReflectionDemo {class Program{static void Main(string[] args){// 指定【编译输出】的项目类库dll&#xff08;启动项目编译输出目录下…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

电脑换固态硬盘

参考&#xff1a; https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种&#xff1a; 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜&#xff1a; M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…