一.Dart 简介
Dart是谷歌发布的一门面向对象的开源编程语言,诞生于2011年10月10日,Dart是一种“结构化的Web编程”语言,在所有现代的浏览器和环境中提供高性能。
Dart主要用途分为三种:
- Flutter开发移动应用
- Dart webdev 开发浏览器应用
- Dart VM开发脚本或者服务器应用
下面即将开启Dart学习之旅
二.Dart语法
重要概念(Important concepts)
在学习Dart的时候,请牢记下面的一下事实和概念:
- 所有能够使用变量引用的都是对象,每个对象都是一个类的实例。在Dart中甚至连数字、方法和null都是对象。所有的对象都继承与Object类。
- 虽然Dart是强类型,但由于Dart可以推断类型,所以类型注释是可选的,当您不需要明确的类型时,可以使用dynamic类型。
- Dart支持泛型类型,像List<int>(整数类型)或者List<dynamic>(任何类型的对象)
- 支持顶层函数(例如main()),以及绑定到类或者对象的函数(分别是静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或本地函数)。
- 类似地,Dart支持*变量,以及绑定到类或对象的变量(静态变量和实例变量)。实例变量有时称为字段或属性
- 与Java不同,Dart没有关键字public、proteched、private。如果标识符以下划线(_)开头,则它是其库的私有标识符。
- 标识符可以以字母或下划线开头,然后这些字符和数字的任意组合
- Dart同时具有表达式和语句。例如,条件表达式条件 ? expr1 : expr2 ; 最后得到的值为expr1 或expr2,将其与没有值得if-else 语句进行比较,语句通常包含一个或多个表达式,但表达式不能直接包含语句。
- Dart工具可以报告两种类型的问题:警告和错误,警告只表明您的代码可能无法工作,但它们不会阻止您的程序执行。错误可以是编译时的,也可以是运行时的。编译时的错误完全阻止了您的程序执行,运行时错误会导致在执行代码时引发异常。
1. 变量
变量是一个引用,根据Dart中“万物皆对象”原则,即变量存储的都是对象的引用,或者说它们都是指向对象
1) 声明变量
声明可以有两种方式,一种是不指定类型,即使用var关键字
var name = "Bob";
另一种是明确指定类型(Optional types)
String name = "Bob";
因为有类型推导,所以两种实现效果一样,官方推荐在函数内的本地变量尽量使用var声明。
在变量类型并不明确的情况下,可以使用dynamic关键字
dynamic name = "Bob";
2 ) 默认值
没有初始化的变量自动获取一个默认值为null。类型为数字的变量如果没有初始化其值也是null,不要忘记数字类型也是对象。
var name; var age; print(name); // null print(age); // null
2. Final与const
如果一个变量的值不再修改,则使用final或者const代替var。
一个final变量只能赋值一次;一个const变量是编译时常量,const变量默认为final变量。顶层final变量与类变量在首次访问时才执行初始化。需要注意的是,实例变量可以为final,但是不能是const
// 常量 const bar = 1000; // 常量计算也是常量 const atm = 0.15 * bar;
const 关键字不仅仅只能用来定义常量,也可以用来创建不变的值,还能定义构造函数为const类型的,这中类型的构造函数创建的对象是不可改变的。任何变量都可以有一个不变的值。
var foo = const[1,2,3]; final baz = const[2,3,4];
3. 内置类型
Dart内置支持下面这些类型
- numbers
- string
- boleans
- lists(或称arrays)
- sets
- maps
- runes(用于在字符串中表示Unicade字符)
- symbols
1) Numbers(数值)
Dart支持两种类型的数字
int 整数值、double (双精度) 浮点数,两者都是num的子类。Num类型定义了基本的操作符,例如+-*/,还定义了abs()、ceil()、和floor()等函数。
2) 字符串(String)
Dart字符串使用单引号或者双引号来创建字符串;
String s1 = 'Single quotes work well for string literals.'; String s2 = "Double quotes work just as well.";
可以使用+操作符来把多个字符串连接为一个,也可以把多个字符串放到一起实现同样的功能
String s3 = 'String ''concatenation' ' works even over line breaks.'; String s4 = 'The + operator ' + 'work,as well.'; print(s3); print(s4);
输出结果:
其中官方不建议使用+操作符连接字符串。
使用三个单引号或者双引号也可以创建多行字符串对象
String s5 = ''' You can create multi-line strings like this one. '''; String s6 = """ This is alse a multi-line string. """; print(s5); print(s6);
输出结果:
通过提供一个r前缀可以创建一个“原始raw”字符串
var s = r"In a raw string, even \n isn't special."; var ss = "In a raw string, even \n isn't special."; print(s); print(ss);
输出结果:
可以在字符串中使用表达式,用法为:${expression}。如果表达式是一个标识符,可以省略{},如果表达式的结果为一个对象,则Dart会调用对象的toString()函数来获取一个字符串
var str = 'string interpolation'; if("Dart has $str ,which is very handy." == "Dart has string interpolation ,which is very handy."){ print("yes"); } if('Dart has ${str.toUpperCase()} ,which is very handy.' == 'Dart has STRING INTERPOLATION ,which is very handy.'){ print("upperCase is yes"); }
3) Booleans(布尔值)
为了代表布尔值,Dart有个名为bool的类型。只有两个对象是布尔类型的:true和false所创建的对象,这两个对象也都是编译时常量。
当Dart需要一个布尔值的时候,只有true对象才被认为是true,所有其他的值都是false,这点和javascript不一样,像1,“aString”以及someObject等值都认为是false。
如果在javascript中运行,则会打印Bob,在javascript中name是非null对象,所以为true,但在Dart的生产模式下运行,则不打印任何内容,原因是name != true; name被转换为false了。如果在Dart检查模式运行,代码会抛出异常,表示变量name不是一个布尔值。
4) Lists(列表)
也称array(有序集合)是所有编程语言中最常见的集合类型。在Dart中数组就是List对象。所以通常称之为lists。
var list = [1,2,3]; print("list长度为:"+list.length.toString()); //list长度为:3 print("第二个数值为:"+list[1].toString()); //第二个数值为:2 list[1] = 1; print("修改后,第二个数值为:"+list[1].toString()); //修改后,第二个数值为:1
list可以使用const关键字,可以定义一个不变的list对象(编译时常量)
var constantList = const[1,2,3];
定义一个空的可变的list,尽量使用[],如(var points = []),如果您想创建一个不可变的list,护着其他自定义类型的集合,可以使用构造函数。
如果有必要还可以提供泛型类型
var points = <Point>[];
5 ) Maps
通常来说,Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键出现一次,而一个值则可以出现多次。
下面是一些简单实例
var gifts = { 'frist':'partridge', 'second':'turtldoves', 'fifth':'golden rings' }; var nobleGases = { 2 : 'helium', 10: 'neon', 18: 'argon', };
使用map构造函数也可以实现同样的功能:
var gifts2 = new Map(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings'; var nobleGases2 = new Map(); nobleGases[2] = 'helium'; nobleGases[10] = 'neon'; nobleGases[18] = 'argon';
往map中添加新的键值对和在javascript中用法一样
gifts['fourth'] = "calling birds"; // 添加新的键值对
获取map中的对象
print(gifts['fourth']); //calling birds
使用length来获取map中键值对的数目:
print("gifts中总数为:"+gifts.length.toString()); //gifts中总数为:4
同样使用const可以创建一个编译时常量的map
final constantMap = const { 2: 'helium', 10: 'neon', 18: 'argon', };