Hello World
作为重新认识新语言的常规套路,每个程序员都不可避免的需要经历Hello World的历练,今天学习Dart语言也不例外,所以我们先来用Dart语言,输出Hello World:
void main(){ print("Hello World") }
比较与Java语言来说,Dart语言输出Hello World要简练许多,当然还是比Python的代码要多一点,你可以将这段程序用文本文件输入后, 将txt后缀改成dart后缀,然后在命令行中输入"dart 文件名",就可以打印出来了,如下图所示:
变量与常量
变量
Dart语言在声明变量的时候与JavaScript一致,都是通过var关键字定义,然后可以接着给这个变量设置不同的值,默认为null。
这里博主有必要强调一点,Dart语言是一门强类型语言,在第一次赋值的时候,如果已经确定了字符串类型,则不能更改为其他类型,这一点与JavaScript弱类型语言不一样,如果你是从JavaScript转过来,需要额外的注意,当然Dart第一次赋值为其他类型是可以变更的。
常量
对于已经学习过其他各种语言的小伙伴来说,这里算是非常基础的知识,一般的就不介绍了,我们直接来看代码:
//这里声明的是一个变量 var num; num=11; print("小明的年龄是 $num 岁"); //开始声明不是字符串,可以变更类型 num='20'; print(num); //这里定义了一个常量,只能被赋值一次,与Java语言一致 final c=30; print(c); const d=50; print(d);
在这里,我们可以看到,用了const定义了d,那么const与final有什么不同?
在Dart语言中,const变量是一个编译时常量,可以理解为const变量是一个隐式的final,但实例变量可以是final,不能是const。而且常量如果是类级别的,可以使用static const,例如:static const PI=3.1415。
内置类型
Dart语言内置了一些类型,具体如下:
(1)Number(数值型)
(2)String(字符串)
(3)Boolean(布尔型)
(4)List(列表)
(5)Map(键值对)
(6)Runes(符号字符)
(7)Symbols(标识符)
Number(数值型)
在Dart语言中,数值型分为整形int与浮点型double,可以用num,int,double声明使用。我们直接来看一段代码:
num a=10 a=10.2
可以看到,用num声明的变量也是int类型,而且可以修改为double类型,那么这里就有一个灵魂拷问了,反过来,把double类型改为int型可以吗?
答案是不可以,看一下源码我们就很好理解了,源码如下:
abstract class int extends num abstract class double extends num
数值型运算
这里博主列举了常用的三种数值型运算操作:
(1)运算符:+,-,*,/,~/,%(加,减,乘,除,取整,取余)
(2)常用属性:isNaN,isEven,isOdd等
(3)常用方法:round(),floor(),ceil(),toInt(),toDouble(),abs()
这里需要注意的是,在Dart2.0中,如果我们声明的变量是double类型,但值是int型的,会自动转换为double类型,当然也可以通过toDouble()方法进行转换。
String(字符串)
在这篇博文开头,我们已经打印出来字符串Hello World,那么在Dart语言中,有哪几种创建的方式?
(1)直接使用单引号,双引号创建字符串
(2)使用三个引号或双引用创建多行字符串
(3)使用r创建原始raw字符串
字符串运算
(1)运算符:+,*,==,[]
(2)插值表达式:${expression}
(3)常用属性:length,isEmpty,isNotEmpty
(4)常用方法:contains(),subString(),startWith(),endsWith(),indexOf(),lastIndexOf(),toLowerCase(),toUpperCase(),trim(),trimLeft(),trimRight(),split(),replaceAll()
这里不需要死记硬背,大多数方法都是Java中都有的,而剩下的如果不会用,编译器也会提示你它的详细用法,所以这里博主就不再赘述。
特别注意:但是,这里还是与一点需要注意的,如果单引号嵌套单引号,或者双引号嵌套双引号需要加反斜杠进行转义
Boolean(布尔型)
在Dart语言中,布尔类型常用的地方也是在if条件中判断,Dart语言中布尔类型有四个特点:
(1)使用bool表示布尔类型
(2)布尔类型只有true和false二个值
(3)布尔值是编译时的常量
(4)可以在debug模式下,通过assert断言函数判断布尔值,如果不为真,会引发异常并终止程序往下运行,在开发的时候这点非常有用。
List(列表)
在Dart语言中,List表示集合,但其实与数组是同一个概念,使用的方式如下:
//创建List var list=[1,2,3]; //通过构造方法创建 var list=new List(); //创建一个不可变的List var list=const[1,2,3]
在实际的使用过程中,我们除了要创建List数组以外,还需要学会如何使用它,获取或者修改它的值,操作的代码如下:
list[0]=55;
在Dart语言中,List的常用的方法有这些:length(),add(),insert(),remove(),clear(),indexOf(),lastIndexOf(),sort(),sublist(),asMap(),forEach(),shuffle(),这里面有些很好理解,与Java的差不多,我们特别看看下面几个方法,使用代码如下:
var list=['one','two','three']; print(list.indexOf('one'));//获取元素所在位置索引 print(list.sublist(2));//去除前两个元素返回新的List print(list.shuffle());//打乱List元素的顺序
Map(键值对)
在Dart语言中,Map与Java中的Map类似,都是以键值对的形式存储数据,键和值可以是任何类型的对象,每个键只能出现一次,我们来看看它的声明代码:
//第一种声明方式 Map map={'book':'zhangyue','yellow':'blue'}; //第二种声明方式 Map map=new Map(); map['book']='zhangyue';
同样创建一个不可变的Map,只要和上面List一样加上const就行了:
Map map=const{'book':'zhangyue','yellow':'blue'};
在flutter中,我们还需要使用到两个方法,代码如下:
map.remove('book');//把key为book的元素溢出掉 map.clear();//清空整个Map集合
dynamic和Object
在Dart语言中,一切皆是对象,而且这些对象的父类都是Object。当没有明确类型时,编译的时候会根据值明确类型,例如:
var name='Liyuanjing'; Object name1='Liyuanjing'; dynamic name2='Liyuanjing';
以上三种写法都没有问题,但是Dart语言不建议我们这么做。我们在实际的开发中,我们应尽量为变量确定一个类型,这样可以提高安全性,加快程序的运行速度,如果不指定类型,则在debug模式下类型会是动态的,所以博主推荐定义字符串要这样:
String name='Liyuanjing';
上面我们还使用了dynamic,这个定义是告诉编译器,代码变量不用做类型检测,并且知道写代码的人知道自己在做什么,我们先来看一段代码:
dynamic obj='李元静'; obj['name']=27;
这段代码编译时可以通过,但会抛出“NoSuchMethodError”异常,为了运行的时候对类型进行检测,我们可以使用as和is关键字,代码如下:
dynamic obj=<String,int>{}; if(obj is Map<String,int>){ obj['name']='Liyuanjing'; } var map=obj as Map<String,int>;