Dart

2023-11-01

Dart 是一种跨平台的客户端开发语言。具有专门为客户端优化、高生产力、快速高效、可移植易学的风格。Dart主要由Google负责开发和维护。

构造函数:命名构造函数+默认构造函数

私有属性需要加_ 并且是单独的文件才可以(也可以通过公员有方法返回私有属性)

私有方法加_  只能在当前类中使用(也可以通过公员有方法返回私有属性)

类中有get set()方法;

初始化数据在实例化之前  class Person{

int a; Person():this.a=1{ }

}

 

内置数据类型 (num, String, bool, List, Map, Runes)


在Dart中,所有能够使用变量引用的都是对象,每个对象都是一个类的实例。数字、函数和 null 也都是对象。所有的对象都继承于Object类。

要注意,没有初始化的变量默认值为 null。数值类型变量的默认值也是 null。

数值类型num有两个具体子类,分别为int和double,其中int为整数值,范围是-2^53至2^53之间;double则是64位的双精度浮点数。

变量与常量
定义变量
Dart中定义变量有两种方式,一种是静态类型语言常用的方式,显式指定变量类型,另一种则是动态语言的常用方式,不指定类型,由vm自动推断。

// 1.通过显式指定类型来定义变量
String name = "张三";
num age = 18;

// 2.使用关键字var,不指定类型
var address = "深南大道";
var id = 100;

/* 使用var定义变量,即使未显式指定类型,一旦赋值后类型就被固定
 * 因此使用var定义的变量不能改变数据类型
 */
var number = 19;
// 以下代码错误,无法运行,number变量已确定为int类型
number = "2019";
如想动态改变变量的数据类型,应当使用dynamic或Object来定义变量。

// dynamic声明变量
dynamic var1 = "hello";
var1 = 19;
print(var1);    // 19

// Object声明变量
Object var2 = 20;
var2 = "Alice";
print(var2);    // Alice
建议在编写代码时,尽可能显式指定变量类型,这样可以提升代码可读性与调试的便利性。

定义常量
Dart中定义常量也有两种方式,一种使用final关键字,同Java中的用法, 一个 final 变量只能赋值一次;另一种是Dart的方式,使用const关键字定义。

// 1.使用final关键字定义常量
final height = 10;

// 2.使用const关键字定义常量
const pi = 3.14;
需要注意,final定义的常量是运行时常量,而const常量则是编译时常量,也就是说final定义常量时,其值可以是一个变量,而const定义的常量,其值必须是一个字面常量值。

final time = new DateTime.now(); // 正确
const time = new DateTime.now(); // 错误


const list = const[1,2,3];       // 正确
const list = [1,2,3];            // 错误

内置类型的常用操作
数值类型
// String 转 int
var one = int.parse('1');

// String 转 double
var onePointOne = double.parse('1.1');

// int 转 String
String oneAsStr = 1.toString();

// double 转 String
String piAsStr = 3.14159.toStringAsFixed(2); // 保留两位 '3.14'

// Dart也支持整数位操作,<<、 >>、&、|
print((3 << 1) == 6);  // 0011 << 1 == 0110
print((3 >> 1) == 1);  // 0011 >> 1 == 0001
print((3 | 4)  == 7);  // 0011 | 0100 == 0111


字符串
值得一提的是,Dart中提供的字符串插值表达式使字符串格式化变得异常方便。

// 1.Dart可以使用单引号或双引号来创建字符串
var s1 = "hello";
var s2 = 'world';

// 2.类似Python,Dart可以使用三引号来创建包含多行的字符串
var multiLine1 = """你可以像这样,创建一个
包含了多行的字符串内容
""";

var multiLine2 = '''你也可以使用三个单引号,创建一个
包含了多行的字符串内容
''';

// 3.类似Python,还可以在字符串字面值的前面加上`r`来创建原始字符串,则该字符串中特殊字符可以不用转义
var path = r'D:\workspace\code';

// 4.Dart支持使用"+"操作符拼接字符串
var greet = "hello" + " world";

// 5.Dart提供了插值表达式"${}",也可以用于拼接字符串
var name = "王五";
var aStr = "hello,${name}";
print(aStr);    // hello,王五

// 当仅取变量值时,可以省略花括号
var aStr2 = "hello,$name"; // hello,王五

// 当拼接的是一个表达式时,则不能省略花括号
var str1 = "link";
var str2 = "click ${str1.toUpperCase()}";
print(str2);   // click LINK

// 6. 与Java不同,Dart使用"=="来比较字符串的内容
print("hello" == "world");

布尔类型
Dart中的布尔类型用法同Java,仅有false、true两个值,不能使用0、非0或者null、非null来表达false和true。与Java不同的是,布尔类型的默认值为null

bool flags;
print(flags);    // null

列表
Dart中列表操作与JavaScript中的数组相似。

// 创建列表
var list = [1, 2, 3];
// 下标从0开始。使用length可以访问list的长度
print(list[0]);
print(list.length);

// 可以使用add添加元素
list.add(5);

// 可在list字面量前添加const关键字,定义一个不可改变的 列表(编译时常量)
var constantList = const [1, 2, 3];
constantList[1] = 1;     // 报错

映射
又称为关联数组,相当于Java中的HashMap,list.asMap()可以将list集合转为map,list角标作为map的key

// 1.通过字面量创建Map
var gifts = {
  'first' : 'partridge',
  'second': 'turtledoves',
  'fifth' : 'golden rings'
};

// 2.使用Map类的构造函数创建对象
var pic = new Map();
// 往Map中添加键值对
pic['first'] = 'partridge';
pic['second'] = 'turtledoves';
pic['fifth'] = 'golden rings';

// 3.获取Map的长度
print(pic.length);

// 4.查找Map
pirnt(pic["first"]);
print(pic["four"]);    // 键不存在则返回 null

函数
在Dart中,函数(或方法) 也是对象,它的类型是 Function。 这意味着,函数可以赋值给变量,也可以当做其他函数的参数。

定义函数
Dart中定义函数,基本上与Java类似

String greet(String name){
    return "hello,$name";
}

在Dart中,类型是可选,可以省略显式的类型,但仍然建议显式指定类型。

greet(name){
    return "hello,$name";
}

要注意,函数也是对象,所有函数都有返回值。当没有指定返回值的时候,函数会返回null。当然,如果你强行使用void来修饰函数,则函数真的没有返回值,这种情况就另当别论了。

函数的参数
Dart中支持两种可选参数

命名可选参数
位置可选参数
在Java中通常使用方法重载来实现同名方法的不同参数调用,Dart中则可以通过可选参数来实现相同效果。

命名可选参数
先来看一下命名参数,它使用花括号来定义参数列表

// 定义一个函数,参数列表用花括号包裹
enableFlags({bool bold, bool hidden}) {
    // do something
}

// 调用方式,传参时使用"参数名:值"的形式
enableFlags(hidden:true,bold:false);

如果在定义函数时,给参数列表中的参数设置默认值,则该参数就是可选的,函数调用时可以忽略该参数,使用默认的值。

// 定义add函数
add({int x, int y=1, int z=0}){
    print(x + y + z;
}

// 调用
add(x:18);              // 19
add(x:18, y:2, z:10);   // 30

这里需要注意一下,SDK 1.21之前的版本中,命名参数不能使用=号来设置默认值,而SDK 1.21之后,只能使用=号来设置默认值。因此,请检查并升级SDK版本。

位置可选参数
位置可选参数使用中括号来定义参数列表,中括号中的参数是可选的

// 定义add函数
add(int x, [int y, int z]){
    int result = x;
    if (y !=  null){
        result = result + y;
    }

    if (z !=  null){
        result = result + z;
    }
    print(result);
}

// 调用
add(18);           // 18
add(18,12);        // 30
add(18, 12, 15);   // 45

给位置可选参数设置默认值

// 定义add函数
add(int x, [int y=0, int z=0]){
    print(x +y+z);
}

最后需要注意一下命名可选参数与位置可选参数的区别,前者中的参数与顺序无关,无需按顺序传参,且传参数时需使用冒号;后者与顺序相关,传参必须依照顺序。

匿名函数
大部分函数都有名字,但我们也可以创建没有名字的函数,称为匿名函数,也被称为lambda表达式或者闭包。

// 定义匿名函数,并将其赋值给一个变量func,注意,函数体最后的花括号处必须有分号结束。
var func = (x,y){
    return x + y;
};

print(func(10,11));    // 21

注意,匿名函数与普通函数基本相同,也有参数列表,函数体,只是省去了函数名而已。

箭头函数
Dart中的箭头函数与JavaScript中的基本相同。当函数体中只包含一个语句时,我们就可以使用=>箭头语法进行缩写。注意,箭头函数仅仅只是一个简洁表达的语法糖。

普通函数

add(num x, num y){
    return x + y;
}

print(add(18,12));    // 30

箭头函数

// 与上面的普通函数完全等价
add(num x, num y) => x + y;

print(add(18,12));    // 30

箭头函数省略了花括号的表达,箭头后面跟一个表达式,函数的返回值也就是这个表达式的值。另外,箭头函数也可以与匿名函数结合,形成匿名箭头函数。

var func = (num x, num y) => x + y;
1
运算符
Dart语言中的运算符与Java中的绝大多数相同。

算术运算符
+、-、*、/、%同Java语言

Dart中又多出了一个整除运算符~/,与普通除号的区别是将相除后的结果取整返回。

类型判定运算符
以下是Dart增加的类型相关的运算符。

操作符    解释
as    用于类型转换
is    如果对象是指定的类型就返回 True
is!    如果对象不是指定的类型返回 True
当 obj 实现了 T 的接口时, obj is T 才是 true。类似于Java中的instanceof。

Dart中使用 as 操作符把对象转换为特定的类型,如无法转换则会抛出异常,因此在转换前最好使用is运算符进行检测。

// 将p转换为Person类型再操作
(p as Person).name = 'Bruce';

条件表达式
Dart中也支持三目表达式
condition ? expr1 : expr2

除此外,Dart还增加了非空条件判断符??
expr1 ?? expr2
上述运算表示,如果expr1的值不等于null,则返回其值; 否则执行表达式expr2并返回其结果。

var str1 =  "Hello";
var str2 =  "world";
var result = str1 ?? str2.toUpperCase();

级联运算符
我们通常使用.操作符调用对象的方法,这在Dart中也是支持的,但是Dart另外增加了一种级联运算符..,用两个点表示。

级联运算符可以在同一个对象上连续调用多个方法以及访问成员变量。 使用它可以避免创建临时变量, 写出更流畅的代码。

假如类Person有三个方法,setName、setAge、save,则可如下调用

new Person()..setName("Bob")..setAge(20)..save();
1
使用级联运算符调用方法,无需该方法返回对象本身即可连续的流式的调用该对象的其他方法。

条件成员访问符
在Java中很容易碰到恼人的空指针错误,因此在方法调用前需要进行对象的非空判断,这样的判断语句使代码变得冗长,可读性差,不整洁。Dart中则发明了一个新的运算符用于处理此类情况。

条件成员访问符?.,它和.类似,但是运算符左边的对象不能为null,否则返回null,若对象不为null,则返回对象本身。

// list1默认值为null
List list1;
print(list1?.length);  // null

List list2 = [];
print(list2?.length);  // 0

分支与循环
条件分支
Dart中的条件分支基本与Java相同

if条件分支

if(i < 0){
  print('i < 0');
}else if(i == 0){
  print('i = 0');
} else {
  print('i > 0');
}


switch条件分支

// 在switch的case中可以使用整数、字符串、枚举类型和编译时常量
String command = 'OPEN';
switch (command) {
  case 'CLOSED':
    break;
  case 'OPEN':
    break;
  default:
    print('Default');
}

循环语句
基本循环
Dart中的基本循环语句与Java相同

// for循环
for(int i = 0; i < 9; i++) {
  print(i);
}

// while循环
while(true){
  //do something
}

// do-while循环
do{
  //do something
} while(true);

特有循环
var myList = ['Java','JavaScript','Dart'];

// for...in...循环,类似Java中的增强for
for (var it in myList ){
    print(it);
}

// forEach循环。其参数为一个Function对象,这里传入一个匿名函数
myList.forEach((var it){
    print(it);
});

// 可以使用匿名箭头函数简写
myList.forEach((it) => print(it));

使用循环遍历Map

var myMap = {
'zhangsan':'201901',
'lisi':'201902',
'wangwu':'201902'
};

// forEach遍历Map
myMap.forEach((k, v) =>  print("$k : $v"));

// 根据键获取值来遍历。通过keys返回Map中所有键的集合
for(var k in myMap.keys){
    print("$k : ${myMap[k]}");
}
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart 的相关文章

  • 部门来了个拿25k出来的00后测试卷王,老油条表示真干不过,已被...

    内卷的来源 内卷最早的 出处 是几张名校学霸的图片 大学生们刷爆朋友圈的几张 内卷 图片是这样的 有的人骑在自行车上看书 有的人宿舍床上铺满了一摞摞的书 有的人甚至边骑车边端着电脑写论文 这些图片最早在清华北大的学霸之间流传 之后 边骑车边
  • Linux共享文件夹到windows服务器

    1 安装Samba yum y install samba samba client samba common 2 添加要使用的账号 useradd s sbin nologin username smbpasswd a username
  • 闭眼推荐,9 个不能错过的机器学习数据集

    内容一览 本期整理了 HyperAI超神经官网近期更新的 9 个数据集 涉及人脸识别 姿态估计 自动驾驶三个领域 关键词 人脸识别 姿态估计 自动驾驶 本文首发自微信公众号 HyperAI 超神经 近期 HyperAI超神经官网更新了 30
  • springboot + vue项目本地化部署配置内+外网

    1 项目使用nginx做访问代理 配置如下 内网访问配置 server listen 80 server name 192 168 0 235 client max body size 100M charset koi8 r access
  • 开发Hololens遇到The type or namespace name ‘HandMeshVertex‘ could not be found..

    The type or namespace name HandMeshVertex could not be found are you missing a using directive or an assembly reference
  • C语言——循环控制语句

    文章目录 循环控制语句 for循环控制 1 基本语法 2 注意事项和细节说明 3 练习 1 打印1 100之间所有是9的倍数的整数的个数及总和 使用for完成 2 先死后活的一种编程思想 while循环控制 1 基本语法 2 注意事项和细节
  • 谷歌浏览器如何安装vue调试工具

    下载vue devtools压缩包 git地址 vue devtools 安装环境 将下载的压缩包解压 并通过命令行进入vue devtools master文件夹中 输入安装命令 cnpm install进行安装 编译 输入编译命令 np
  • a-textarea实现自动出现滚动条不能自动伸缩

    deep textarea width 100 height 50px overflow y auto resize none
  • 2023年贵州省职业技能大赛“网络安全” 项目比赛任务书

    2023年贵州省职业技能大赛 网络安全 项目比赛任务书 2023年贵州省职业技能大赛 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 Windows Linux A 2 Nginx安全策略 Linux
  • MYSQL数据文件默认在哪个目录下?

    原文地址 MYSQL数据文件默认在哪个目录下 在Windows平台默认一般在C ProgramData MySQL C ProgramData MySQL MySQL Server X X Data文件夹中 无论在Windows还是在Lin
  • STM32 (三)GPIO的八种模式及其原理

    一 GPIO简介 GPIO就是通用I O 输入 输出 端口 是STM32可控制的引脚 STM32芯片的GPIO引脚与外部设备连接起来 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 二 GPIO工作模式 1 四种输入模式 GPIO
  • 每天一个linux命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics 虚拟内存统计 的缩写 可对操作系统的虚拟内存 进程 CPU活动进行监控 他是对系统的整体情况进行统计 不足之处是无法对某个进程进行深入分析 vmstat 工具提供了一种低开
  • 用C++做高级病毒

    今天教大家做几个超级厉害的病毒 看完这篇文章之后你就能成为一名高级黑客了 声明 若电脑收到损伤 作者一律不负责 1 鼠标病毒 作用 让鼠标一直停在一个地方动不了 include
  • js Dom事件

    1 onclick 点击事件 2 ondbclick 双击事件 3 onmousedown 鼠标按下事件 4 onmouseup 鼠标松开事件 5 onmouseenter 鼠标移入事件 不支持冒泡 只触发一次 6 onmouseover
  • xml实体小实例

    如何定义和使用实体 一下是实体的一个小实例 gt
  • C++里仿函数是什么

    一 什么是仿函数 仿函数的意思是 它不是函数 其实是个类 但用法和函数一样 既然是个类 就可以存储很多变量和其他的信息 然后实现纯函数实现不了的功能 所以在一些需要函数作为参数的地方可以用仿函数代替 在STL里很多地方用到了仿函数 二 仿函
  • Java 密码复杂度校验

    1 需求 复杂性 用户的密码中必须包含的字符类型 默认为中 弱 必须包含小写字母 中 必须包含小写字母 数字 强 必须包含小写字母 数字 大写字母 特殊字符 鼠标移入的提示文字相同 注 检查密码复杂度 仅新增账户 重置密码时生效 已有账户密
  • 揭示OLED透明屏数据:探索未来显示技术的潜力

    OLED透明屏作为一项颇具吸引力的显示技术 以其独特的特点和卓越的画质在市场上引起了广泛关注 在这篇文章中 尼伽将和大家一起深入探索OLED透明屏的数据 通过具体的市场趋势分析 技术指标解析 应用领域探讨和未来前景展望 为读者提供全面了解和
  • wish虚拟服务器,云服务器操作wish

    云服务器操作wish 内容精选 换一换 按需计费 按需计费是后付费模式 按弹性云服务器的实际使用时长计费 可以随时开通 删除弹性云服务器 包年 包月 包年 包月是预付费模式 按订单的购买周期计费 适用于可预估资源使用周期的场景 价格比按需计
  • [开发

    ModelMapper是一个用于对象之间转换的Java库 它能够自动映射一个Java对象的属性到另一个Java对象 依赖安装

随机推荐

  • C/C++

    文章目录 空间的读写 作用 实现strlen 实现strcpy 非字符空间 void 返回值 返回连续空间类型 示例 函数内部实现 示例 参考 麦子学院 嵌入式C语言高级 C语言函数的使用 空间的读写 void fun char p con
  • VUE enement-ui之table表格隐藏滚动条

    只需修改样式即可 deep el table body wrapper webkit scrollbar width 0 注意 element ui表格很多样式修改都需要加深度穿透才能生效 效果图
  • 深度神经网络的matlab实现,深度神经网络代码matlab

    为什么不用matlab做深度学习 matlab可以做深度学习 但是从实用性的角度来讲matlab的实现效率相对较低 训练耗时较长 初次学习计算机语言就选择matlab不是一个明智的选择 最好选用C或者Basic作为入门语言 matlab是一
  • 初探C语言链表(一)

    初探链表 一 静态链表 二 动态链表 初始化链表 1 尾插法建立链表 2 头插法建立链表 三 动态链表的基本操作 1 遍历 2 查找 3 插入 4 清空 5 删除 6 销毁 四 链表的综合应用 什么是链表 链表是由一系列节点组成 每个节点包
  • 面试经验:阿里Java后台开发

    最近原来实习时候的Boss联系我 说他跳槽到了阿里 问我有没有兴趣面一个Java后台开发岗位 考虑到我只工作了一年 现在去阿里肯定要降薪 因此也没有太强烈的意愿 但出于提升自我的角度考虑 参加了面试 一面 电话面试一小时 首先做一个简单的自
  • 09虚幻4【UE4】中模型沿着轨道运动

    目录 一 创建Track蓝图类 轨道 并添加一个Spline样条曲线 二 创建TrackCar 移动车 蓝图类并添加一个Mesh 车 方块都可以 三 编写TrackCar的蓝图逻辑 3 1 设置自定义事件MoveCar 3 2 添加时间轴
  • Python全栈开发【基础-04】一文彻底理解Python变量

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas
  • Android手写占位式插件化框架之apk解析原理系统源码分析

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 上一篇文章 Android手写占位式插件化框架之Activity通信 Service通信和Broad
  • JAVA--不同包类的相互访问

    1 不同包之间的访问在定义类之前使用import 加导入的类名 2 不同包没有任何关系的两个类 只有public的类中的public成员才能被另一个包访问 package yi 第一个包 public class A public void
  • sqlserver数据库触发器,对当前的表数据插入时,根据条件防止数据重复插入。

    这是一个之前做项目用的 以下是触发器sql语句 直接执行即可 如果需求不一样需要修改对应的语句就行 USE NetCoreWebApi GO Object Trigger dbo testInsertTrigger Script Date
  • git clone 遇到问题:fatal: unable to access

    git clone 遇到问题 fatal unable to access https github com ros planning navigation git Failed to connect to 127 0 0 1 port 4
  • LeNET的学习以及代码实现

    根据李沐老师的动手深度学习的书进行学习 import torch from torch import nn net nn Sequential nn Conv2d 1 6 kernel size 5 padding 2 nn Sigmoid
  • 运营活动类项目测试方案设计

    1 背景 随着业务的不断发展成熟 商业业务逐渐向重运营 重策略的模式发展 提出的需求中运营活动类需求数量也不断增多 而通过项目的积累 与其他业务的讨论共创 我们也积累了一批对运营活动类项目的测试点和对应的测试方案 下面我将从设计思路和具体内
  • Yolov5 face训练手册

    目录 支持tensorrt yolov5 face 人脸对齐 训练标签可视化 网络特点 关于tensorboard
  • 关于CUDA计算矩阵乘法那些事情

    我想记录一下今天所做的事情 与我自己对GPU 的对矩阵加速的并行运算的认知有点背道而驰 我一共写了三个相同的并行计算程序 理论上 在cpu上面运行的应该是最慢的 用共享内存计算的那个应该是最快的 但是 结果却是与预计的相反 我得提前声明一下
  • SpringBoot在一定时间内限制接口请求次数

    需要用到的知识 注解 AOP ExpiringMap 带有有效期的映射 我们可以自定义注解 把注解添加到我们的接口上 定义一个切面 执行方法前去ExpiringMap查询该IP在规定时间内请求了多少次 如超过次数则直接返回请求失败 需要用到
  • unity属性面板值的显示和隐藏

    Serialize功能 Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示 并且定义Serialize关系 简单的说 在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时
  • ROS里程计消息nav_msgs/Odometry的可视化方法

    ROS中里程计的消息类型为nav msgs Odometry 该消息类型具有以下结构 可以看到 里程计消息中的pose包含了位置pose position和姿态pose orientation 在ROS中 有一种常用消息类型为nav msg
  • discuz 配置https

    下面我就不同版本来给大家讲解下如何修改源文件来支持https discuz X2 0 x2 0的版本用的人不多了 但我这里还是提供一份X2 0的https改造教程 https www aitiancheng com article 550
  • Dart

    Dart 是一种跨平台的客户端开发语言 具有专门为客户端优化 高生产力 快速高效 可移植易学的风格 Dart主要由Google负责开发和维护 构造函数 命名构造函数 默认构造函数 私有属性需要加 并且是单独的文件才可以 也可以通过公员有方法