Dart语法学习

news2024/11/25 22:40:39

最近在学习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(); // 抽象方法。 
}

抽象类的一些特性:

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

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

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

相关文章

Spring Cloud Alibaba - Nacos源码分析

目录 一、源码 1、为什么要分析源码 2、看源码的方法 二、Nacos服务注册与发现源码剖析 1、Nacos核心功能点 2、Nacos服务端/客户端原理 2.1、nacos-example 2.2、Nacos-Client测试类 3、项目中实例客户端注册 一、源码 1、为什么要分析源码 1. 提升技术功底&#x…

Golang内存泄露场景与定位方式

个人博客 一、产生原因 Golang有自动垃圾回收机制&#xff0c;但是仍然可能会出现内存泄漏的情况。以下是Golang内存泄漏的常见可能原因&#xff1a; 循环引用&#xff1a;如果两个或多个对象相互引用&#xff0c;且没有其他对象引用它们&#xff0c;那么它们就会被垃圾回收机…

【计算机网络实验】BGP和OSPF协议仿真实验

实验内容  BGP和OSPF协议仿真实验 实验目的 &#xff08;1&#xff09;学习BGP协议的配置方法&#xff1b; &#xff08;2&#xff09;验证BGP协议的工作原理&#xff1b; &#xff08;3&#xff09;掌握网络自治系统的划分方法&#xff1b; &#xff08;4&#xff09;验证…

3分钟快速了解—App自动化测试是怎么实现H5测试的?

移动端 app 自动化框架很多&#xff0c;但是有一些框架因为不支持混合应用测试&#xff0c;一直没有完全流行。比较典型的是经典的 Python 框架 uiautomator2, 这个框架简单好用&#xff0c;没有 appium 那样复杂的 api 调用&#xff0c;受到不少 python 自动化工程师的青睐。 …

C++《stack和queue的一些OJ题目》

本文主要讲解C中stack和queue的一些OJ题目 文章目录 1、[最小栈](https://leetcode.cn/problems/min-stack/)2、[栈的压入、弹出序列](https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId13&&tqId11174&rp1&ru/activity/oj&qru/ta…

路径规划算法:基于乌鸦优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于乌鸦优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于乌鸦优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法乌鸦…

驱动开发:内核解析PE结构节表

在笔者上一篇文章《驱动开发&#xff1a;内核解析PE结构导出表》介绍了如何解析内存导出表结构&#xff0c;本章将继续延申实现解析PE结构的PE头&#xff0c;PE节表等数据&#xff0c;总体而言内核中解析PE结构与应用层没什么不同&#xff0c;在上一篇文章中LyShark封装实现了K…

ChatGPT国内免费使用方法【国内免费使用地址】

当下人工智能技术的快速发展&#xff0c;聊天机器人成为了越来越多人们日常生活和工作中的必备工具。如何在国内免费使用ChatGPT聊天机器人&#xff0c;成为了热门话题。本文将为你详细介绍ChatGPT国内免费使用方法&#xff0c;让你轻松拥有聊天机器人助手&#xff0c;提高工作…

基于Halcon卡尺测量: Metrology批量测量矩形和圆

处理图如下: 原图如下: 主要思想: 1.准备一次性将图中12个圆和2个矩形都检测出来 2.初步确定12个圆的圆心坐标和半径,初步确定两个矩形的中心坐标,角度,长短边长 3.创建计量模型 4.定义计量模型尺寸 5.增加检测矩形和圆形的信息参数 6.应用计量模型,获取结果 7.显示…

什么是 IMU?惯性测量单元工作和应用

术语IMU代表“惯性测量单元”&#xff0c;我们用它来描述测量工具的集合。当安装在设备中时&#xff0c;这些工具可以捕获有关设备移动的数据。IMU 包含加速度计、陀螺仪和磁力计等传感器。 IMU 如何工作&#xff1f; IMU 可以测量各种因素&#xff0c;包括速度、方向、加速度、…

vue 单点登录的方法

vue 单点登录的方法 当我们在使用 vue开发项目时&#xff0c;一般都是只有一个用户帐号&#xff0c;如果要实现多个帐号的单点登录&#xff0c;可以使用 Session和 LocalStorage这两个技术。这两个技术在实现单点登录时&#xff0c;都需要有一个用户名和一个密码&#xff0c;而…

【C++】C++ 11 智能指针

【C】C 11 智能指针 文章目录 【C】C 11 智能指针1.为什么需要智能指针2. C中智能指针和指针的区别是什么&#xff1f;3. C中的智能指针有哪些&#xff1f;分别解决的问题以及区别&#xff1f;&#xff08;1&#xff09;auto_ptr&#xff08;C98的方案&#xff0c;C11已经弃用&…

JavaEE进阶(Mybatis)5/31

目录 1. SQL注入 2.concat&#xff08;&#xff09;用于like模糊查询 3.resultMap 4. 5.动态SQL 6.foreach标签 1. SQL注入 $问题会导致SQL注入 因为$是直接替换的&#xff0c;and的优先级高于or true or false #不存在SQL注入的问题&#xff0c;因为他是预编译的&…

坚持的工作好习惯

工作好习惯 目录概述需求&#xff1a; 设计思路实现思路分析1.工作好习惯的重要性2.谈下自己的工作方法2.希望有时也从别人那里也学习一下看看 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;s…

windows xp 上 Task Scheduler服务 启动后停止,导致数据库自动备份无法编辑和使用问题解决

项目中使用了mysql数据库&#xff0c;大多数人都会选择Navicat来连接数据库&#xff0c;一般会设置计划来自动备份数据库&#xff0c;但我在编辑自动备份的计划时&#xff0c;弹出task scheduler服务无法启动&#xff0c;退出回到桌面&#xff0c;启动windows的服务&#xff0c…

牛客网C++面试宝典(一)C/C++基础之语言基础

此系列为在学习牛客网C面试宝典过程中记录的笔记&#xff0c;本篇记录第一章C/C基础部分的第一节&#xff1a;语言基础。 牛客网C面试宝典链接&#xff1a;https://www.nowcoder.com/issue/tutorial?tutorialId93&uuida34ed23d58b84da3a707c70371f59c21 文章目录 1.1 简述…

Docker 数据持久化方案详解

目录 一、Docker数据持久化概述 1.1联合文件系统 1.2容器的数据卷 1.2.1 什么是数据卷 1.2.2 数据卷特点 1.2.3 Docker提供三种方式将数据从宿主机挂载到容器 二、 Docker持久化方案 2.1 查看volume 基本命令使用方法 2.2 volume持久化方案 2.2.1volume简介 2.2.2.v…

【JavaSE】Java基础语法(四十一):TCP通信程序

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。…

Android 易忽略小知识

1.设置hint的字体大小 在Android xml文件中并没有直接设置hint字体大小的属性。如果hint文字的大小不希望跟正常字体的大小一样&#xff0c;就只能通过代码的方式来进行处理。 提供两种方式&#xff1a; //设置"用户名"提示文字的大小 EditText etUserName (Ed…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”&#xff0c;到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机&#xff0c;小度在短短10天时间成为市场关注的焦点。 而5月22日&#xff0c;其也拿出了真正的成果&#xff0c;这部专门为青少年打造的学习手机正…