Dart语法学习

最近在学习flutter相关方面的知识,里面用到了Dart语言,于是写下这篇博客记录学习的一门过程。如果你有其他编程语言的经验(尤其是Java和JavaScript),可以很快的上手Dart语言,Dart 在设计时应该是同时借鉴了 Java 和 JavaScript,同时又引入了一些现代编程语言的特性,如空安全,除此之外还有一些独创的语法,比如级联操作符。总之,熟悉之后,你会发现 Dart 是一门非常有意思的编程语言 !
选择的编译工具为vscode,在vscode扩展中安装flutter和coder runner插件,之后便可以运行dart语言
例如:

void main(List<String> args) {

  var name = "zhangsan";

  print(name);

}
//输出为zhangsan

![[Pasted image 20230529151412.png]]

1.特殊关键字

变量是一个引用,在dart语言中具有“:万物皆对象的原则,即变量存储的都是对象的引用,或者说是它们指向对象。

1.1 不指定数据类型,即使用var关键字(类似与JavaScript)

 var name = 'John';

1.2 指定数据类型

String name = 'John';
//因为有类型推导,所以两种实现效果一样,官方推荐在函数内的本地变量尽量使用var声明。

1.3 默认值

未初始化的变量默认值是 null。即使变量是数字类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型也不例外。

int lineCount;//默认为空
assert(lineCount == null);//true

1.4 final和const关键字

使用过程中从来不会被修改的变量, 可以使用 final 或 const,而不是 var 或者其他类型,Final 变量的值只能被设置一次; Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型) 。最高级 final 变量或类变量在第一次使用时被初始化。

  • Const关键字主要用于声明和创建常量。例如:
 const bar = 1000000; // 压力单位 (dynes/cm2)
 const double atm = 1.01325 * bar; // 标准气压
  • final关键字
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
name = 'Alice'; // Error: 一个 final 变量只能被设置一次。

2. 常见数据类型

Dart 语言有以下的数据类型:

  • Number
  • String
  • Boolean
  • List (也被称为 Array)
  • Map
  • Set
  • Rune (用于在字符串中表示 Unicode 字符)
  • Symbol

2.1 Number

number有两种数据类型

  • int(整型)
  • double(双精度浮点数)

int 和 double 都是 num. 的亚类型。 num 类型包括基本运算 +, -, /, 和 *, 以及 abs(), ceil(), 和 floor(), 等函数方法。 (按位运算符,例如»,定义在 int 类中。) 如果 num 及其亚类型找不到你想要的方法, 尝试查找使用 dart:math 库。

double x = 1; 相当于 double z = 1.0.
int x  = 0;

数据类型之间的相互转换(类似于Java语言)

// String -> int
var one = int.parse('1'); assert(one == 1); // String -> double 
var onePointOne = double.parse('1.1'); assert(onePointOne == 1.1); 
// int -> String 
String oneAsString = 1.toString(); assert(oneAsString == '1'); 
// double -> String 
String piAsString = 3.14159.toStringAsFixed(2); assert(piAsString == '3.14');


2.2 string数据类型

Dart 字符串是一组 UTF-16 单元序列。 字符串通过单引号或者双引号创建。

var s1 = 'Single quotes work well for string literals.';

字符串可以通过 ${expression} 的方式内嵌表达式。 如果表达式是一个标识符,则 {} 可以省略。 在 Dart 中通过调用就对象的 toString() 方法来得到对象相应的字符串。

var s = 'string interpolation';
assert('Dart has $s, which is very handy.' == 'Dart has string interpolation, ' + 'which is very handy.'); //用$s来引用字符串s
assert('That deserves all caps. ' + '${s.toUpperCase()} is very handy!' == 'That deserves all caps. ' + 'STRING INTERPOLATION is very handy!');//引用字符串s并调整为大写字母

  • 同时, == 运算符用来测试两个对象是否相等,可以使用 + 运算符来把多个字符串连接为一个。

2.3 Boolean数据类型

Dart使用bool类型标识布尔值。Dart只有字面量true和false。

// 检查空字符串。
var fullName = ''; 
assert(fullName.isEmpty);

2.4 List数据类型

Dart中的List字面量和Java的arry类型相类似,例如:

var list = [1, 2, 3];
assert(list.length == 3); 
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);

// 往list里面添加数据
 var test = [];
 test.add(1);

2.5 set集合

在 Dart 中 Set 是一个元素唯一且无序的集合。 Dart 为 Set 提供了 Set 字面量和 Set 类型。下面为创建set集合的实例:

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};//指定固定的几个元素
var elements = <String>{};//未指定大小
elements.add('fluorine'); elements.addAll(halogens);
assert(elements.length == 5);//获取长度

2.6 Map集合

通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。 但是 value 可以出现多次。 Dart 中 Map 通过 Map 字面量 和 Map 类型来实现。
简单例子:

var gifts = { 
// Key: Value 
'first': 'partridge', 'second': 'turtledoves', 'fifth': 'golden rings' }; 
var nobleGases = {
2: 'helium', 
10: 'neon',
18: 'argon', };

也可以使用Map构造函数来创建

var gifts = Map();
gifts['first'] = 'partridge'; //相当于添加元素
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings'; 
var nobleGases = Map(); 
nobleGases[2] = 'helium'; 
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

查找

var gifts = {'first': 'partridge'}; assert(gifts['first'] == 'partridge');//查找键值对
var gifts = {'first': 'partridge'};//查看key是否存在
assert(gifts['fifth'] == null);

3. 函数

3.1 函数声明

  • 直接声明
// 直接声明
void printMsg() {
  print("hello the world");
}
// 返回值与函数声明的类型要保持一致
String getNum(int num) {
  return 'Age is $num';

}
void main(List<String> args) {
  // 调用函数
  print(getNum(18)); // Age 18
  printMsg();
}
  • 匿名函数
    多数函数是有名字的, 比如 main() 和 printElement()。 也可以创建没有名字的函数,这种函数被称为 匿名函数, 有时候也被称为 lambda 或者 closure 。
var list = ['apples', 'bananas', 'oranges']; list.forEach((item) { print('${list.indexOf(item)}: $item'); });
// 如果函数只有一条语句, 可以使用箭头简写。
list.forEach( (item) => print('${list.indexOf(item)}: $item'));
  • 立即执行函数
  ((int n) {
    print(n);
  }(55)); // 55

3.2 函数参数

  • 必填参数
    参数类型 参数名称 如:int age
  // 必填参数
  int getAge(int age) {
    return age;
  }
  • 可选参数
    1. 放在必填参数后面
    2. 通过 中括号 包起来
    3. 带默认值的可选参数
    ![[Pasted image 20230529162256.png]]
//解决方案一

String getNum(int age, [String name = "zhangsan"]) {
  return 'Age is $age';
}

//解决方案二
String getNum1(int age, [dynamic name]) {
  return 'Age is $age and his name is $name';
}
  • 命名参数
    1. 用 大括号 包起来
    2. 调用函数时,命名参数的名称与声明函数中的名称保持一致
  // 命名参数
  String getScore(String subject, {double score = 0}) {
    return '科目:$subject,分数:$score';
  }
  String math = getScore('数学', score: 123);//score与函数参数里面的名称一样
  print(math); // 科目:数学,分数:123.0

3.3 main()函数

相当于Java的主函数,一个Java类必须要有主函数才能启动,任何应用都必须有一个顶级 main() 函数,作为应用服务的入口。 main() 函数返回值为空,参数为一个可选的 List<String>


void main(List<String> args) {
  // 调用函数
}

4. 控制流程语句

dart语言的流程控制语句和Java语言相类似,主要有以下一些控制语句。

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert

4.1 if - else语句


if (isRaining()) { 
	you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket(); 
} else { 
car.putTopDown();
}

4.2 for 循环语句

进行迭代操作

var message = StringBuffer('Dart is fun'); 
for (var i = 0; i < 5; i++) {
	message.write('!'); 
}

foreach迭代操作

var collection = [0, 1, 2]; 
for (var x in collection) {
print(x); // 0 1 2 
}

4.3 while和do-while语句

while循环在执行前判断执行条件

while (!isDone()) { doSomething(); }

do-while循环在执行后判断执行条件

do{
	printLine();
	
}while(!atEndOfPage());

4.4 beak 和continue语句

使用break停止程序循环

while (true) { 
		if (shutDownRequested()) break;    processIncomingRequests();
	 }

使用continue跳转到下一次迭代

for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) { 
continue; 
}
}

4.5 switch与case

在 case 语句中,每个非空的 case 语句结尾需要跟一个 break 语句。 除 break 以外,还有可以使用 continue, throw,者 return。

当没有 case 语句匹配时,执行 default 代码:

var command = 'OPEN'; 
switch (command) {
case 'CLOSED':executeClosed();break;
case 'PENDING': executePending(); break; 
case 'APPROVED': executeApproved(); break;
case 'DENIED': executeDenied(); break;
case 'OPEN': executeOpen(); break; default: executeUnknown();
}

4.6 assert语句

如果 assert 语句中的布尔条件为 false , 那么正常的程序执行流程会被中断

// 确认变量值不为空。 
assert(text != null); // 确认变量值小于100。 
assert(number < 100); // 确认 URL 是否是 https 类型。
assert(urlString.startsWith('https'));

5.异常

Dart 代码可以抛出和捕获异常。 异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。

和 Java 有所不同, Dart 中的所有异常是非检查异常。 方法不会声明它们抛出的异常, 也不要求捕获任何异常。(就是如果没有主动抛出异常或者捕获异常,在编写代码时不会报错,但是会在运行的过程中报错)

Dart 提供了 Exception 和 Error 类型, 以及一些子类型。 当然也可以定义自己的异常类型。 但是,此外 Dart 程序可以抛出任何非 null 对象, 不仅限 Exception 和 Error 对象。

5.1 throw

下面是关于抛出或者 引发 异常的示例:

throw FormatException('Expected at least 1 section');

也可以抛出任意的对象

throw 'Out of llamas!';

5.2 try catch

捕获异常可以避免异常继续传递(除非重新抛出( rethrow )异常)。 可以通过捕获异常的机会来处理该异常:

try { breedMoreLlamas(); } on OutOfLlamasException { // 一个特殊的异常 
buyMoreLlamas();
} on Exception catch (e) { // 其他任何异常,只捕捉指定类型的异常 
print('Unknown exception: $e');
} catch (e) { // 没有指定的类型,处理所有异常 
print('Something really unknown: $e'); }

5.3 finally

不管是否抛出异常, finally 中的代码都会被执行。 如果 catch 没有匹配到异常, 异常会在 finally 执行完成后,再次被抛出:

try { breedMoreLlamas(); } finally { // Always clean up, even if an exception is thrown. 
cleanLlamaStalls(); 
}

//任何匹配的catch执行完成后都要执行finally语句:
try { breedMoreLlamas(); 
	} catch (e) { 
	print('Error: $e'); // Handle the exception first. 
	} finally {
	 cleanLlamaStalls(); 
	// Then clean up. 
	}

6. 类

6.1 实例变量

所有实例变量都生成隐式 getter 方法。

class Point {
  num x = 0; // 声明示例变量 x,初始值为 0 。
  num y = 0; // 声明示例变量 y,初始值为 0 。
  num z = 0; // 声明示例变量 z,初始值为 0 。
}
void main(List<String> args) {
  // 调用函数
  var point = Point();
  point.x = 4;
  print(point.x == 4);// true
}

6.2 构造函数

通过创建一个与其类同名的函数来声明构造函数

在没有声明构造函数的情况下, Dart 会提供一个默认的构造函数。

class Point {
  int x = 0, y = 0; //必须进行初始化
  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
  //或者采用下面的方法
  // Point(this.x, this.y);
}

6.3 继承

继承通过extends关键字实现,默认情况下,子类的构造函数会自动调用父类的默认构造函数(匿名,无参数)。

class Father {
  String name = "zhangsan";
  void sayName() {
    print(name);
  }
}
class Son extends Father {
  void sayName() {
    super.sayName();//调用父类方法
  }
}
void main(List<String> args) {
  var son = Son();
  son.sayName(); // zhangsan
}

6.4 抽象类(与Java一样)

使用 abstract 修饰符来定义 抽象类 — 抽象类不能实例化。 抽象类通常用来定义接口,以及部分实现。 如果希望抽象类能够被实例化,那么可以通过定义一个 工厂构造函数 来实现。

抽象类通常具有 抽象方法。 下面是一个声明具有抽象方法的抽象类示例:

// 这个类被定义为抽象类, 
// 所以不能被实例化。 
abstract class AbstractContainer { // 定义构造行数,字段,方法... 
void updateChildren(); // 抽象方法。 
}

抽象类的一些特性:

  • 抽象类不能实例化,只能单继承。
  • 抽象类可以有抽象方法,只需声明,无需实现
  • 有抽象方法的类一定是抽象类
  • 抽象类的子类必须实现抽象类中的抽象方法,否则子类仍然是抽象类。(实现了就不是抽象类)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI注册流程

1、首先需要有一个OpenAI账号&#xff0c;如果有方法的&#xff0c;就可以自己先注册一下。如果没有方法的&#xff0c;还有一个付费版本的可以备选&#xff0c;亲测可用。 2、注册建议使用谷歌账号关联登录&#xff0c;最方便。微软账号太慢了&#xff0c;也可以使用。注册使用…

Git的安装和环境变量的配置

目录 前言一、下载Git二、安装Git三、检查是否安装成功四、 配置用户名和邮箱五、环境变量配置1. 获取git的安装路径2. 设置环境变量 前言 当我们第一次在新电脑上使用git命令的时候&#xff0c;会报错【git 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件】…

企业工程项目管理系统源码-专注项目数字化管理-Java工程管理-二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

javaWeb 酒店民宿预定信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店民宿预定信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为T…

【十一】设计模式~~~结构型模式~~~代理模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★☆】 6.1. 模式动机 在某些情况下&#xff0c;一个客户不想或者不能直接引用一个对 象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起…

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

前言 在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM&#xff0c;介绍了FMs系列模型的发展过程&#xff0c;开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成&#xff0c;虽然有自动学习二阶特征组合的能力&#xff0c;一定程度上避免了人工组合特征…

Springboot中使用mail邮件

Springboot中使用mail邮件发送 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务2、导入依赖和一些默认#配置新的3、发送邮件4、整合工具类 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务 这里使用的是QQ邮箱,进入设置-账户&#xff0c;开启下服务。 开启后获取授权码&#xff0c;保存…

智能路由器开发之OpenWrt简介

智能路由器开发之OpenWrt简介 1. 引言 1.1 智能路由器的重要性和应用场景 智能路由器作为网络通信的核心设备&#xff0c;具有重要的地位和广泛的应用场景。传统的路由器主要提供基本的网络连接功能&#xff0c;但随着智能家居、物联网和大数据应用的快速发展&#xff0c;对于…

Typora+PicGo+阿里云OSS搭建博客图床

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 程序日常 ✨特色专栏&…

每日一题——删除字符串中的所有相邻重复项

每日一题 删除字符串中的所有相邻重复项 题目链接 思路 这是一道用栈解决的典型题目 我们先来看看栈的基本性质&#xff1a; 栈&#xff1a;是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶&#xff0c…

【PC迁移与管理】上海道宁为每个用户和每个 PC 传输和迁移场景提供解决方案——PCmover

PCmover 是一款 可以自动将所有选定文件、 文件夹、设置、用户配置文件 甚至应用程序 从旧PC传输、恢复和升级到 新PC或操作系统的软件 而且由于 大多数迁移的应用程序 都已安装在新PC上即可使用 通常无需查找旧CD 以前下载的程序 序列号或许可证代码 开发商介绍 La…

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程

1、客户端API操作 1.1 IDEA 环境搭建 前提&#xff1a;保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程&#xff1a;Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …

Android Studio 2022.3 新版 flamingo 安装步骤及遇到的问题

下载地址: https://developer.android.google.cn/studio D盘中新建一个 Android 文件夹, 用来存储 Android studio 和 SDK 文件. 下载好之后, 运行 exe 文件, 点击 next 注意这个路径最好不要有空格,比如 program files这种目录,不然后面安装sdk的时候会有问题. 点击 instal…

【Linux】线程概述、创建线程、终止线程

目录 线程概述1、创建线程函数解析代码举例 2、终止线程函数解析代码举例 橙色 线程概述 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。 进程是 CPU 分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位。…

Qt与Excel:从底层原理到上层应用的全面探索

Qt与Excel&#xff1a;从底层原理到上层应用的全面探索 一、Qt与Excel文件的交互基础&#xff08;Basics of Qt and Excel Interaction&#xff09;1.1 Qt与Excel文件的基本概念&#xff08;Basic Concepts of Qt and Excel Files&#xff09;1.2 Qt读取Excel文件的基本方法&am…

Python文件打包成exe文件

文章目录 背景安装pyinstaller开始打包总结 背景 今天因为在线将pdf转为word被收费了&#xff0c;有点不爽&#xff0c;所以自己动手撸一个pdf转word的小工具&#xff0c;想着打包成exe给朋友使用&#xff0c;万一哪天会用到呢&#xff1f; 安装pyinstaller 打开cmd命令窗口…

Homeassistant --openwrt docker 安装

openwrt homeassistant安装教程 前提&#xff1a;在N1盒子上面烧录 f大的openwrt系统 (安装81o 或者82o都可以) 一.进入openwrt系统 通常为192.168.1.1 打开网络配置 点击网络点击接口然后修改 这样网络是属于旁路由上网了 可以联通网络了 主要需要填写正确 二.点击docker …

【群智能算法改进】一种改进的沙丘猫群优化算法 改进沙丘猫群算法 改进SCSO[2]【Matlab代码#36】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始沙丘猫群优化算法2. 改进沙丘猫群算法2.1 非线性自适应参数2.2 Cauchy变异策略2.3 最优邻域扰动策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1.…

Java反射概述

2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…

chatgpt赋能python:使用Python关闭所有子进程

使用Python关闭所有子进程 如果您使用Python编写了多进程应用程序&#xff0c;那么您可能会遇到一些关闭所有子进程的问题。这种情况可能是您的主进程已经完成了&#xff0c;但是子进程却没有关闭&#xff0c;从而导致资源浪费和程序崩溃。在这篇文章中&#xff0c;我们将讨论…