一、dart语言中的重要概念
-
您可以放在变量中的所有内容都是一个对象,每个对象都是一个类的实例。 偶数,函数和null都是对象。 所有对象都从Object类继承.
-
尽管Dart是强类型的,但类型注释是可选的,因为Dart可以推断类型。如果明确不需要说明类型,使用dynamic 关键字。
-
dart支持泛型,例如
List<int>
-
Dart支持顶级函数(例如main(),程序入口),以及绑定到类或对象的函数(分别是静态和实例方法)。 您还可以在函数内创建函数(嵌套函数或本地函数)。
-
类似地,Dart支持顶级变量,以及绑定到类或对象的变量(静态和实例变量)。 实例变量有时称为字段或属性。
-
与Java不同,Dart没有关键字public,protected和private。 如果标识符以下划线(_)开头,则它对其库是私有的。
-
标识符可以以字母或下划线(_)开头,后跟这些字符加数字的任意组合。
-
dart中有表达式和声明语句,表达式具有运行时值,而声明语句没有。
-
Dart工具可以报告两种问题:警告和错误。 警告只是表明您的代码可能无法正常工作,但它们不会阻止您的程序执行。 错误可以是编译时或运行时。 编译时错误会阻止代码执行; 运行时错误导致代码执行时引发异常。
二、dart常见的数据类型
1. | numbers数字 |
2. | strings 字符串 |
3. | booleans 布尔 |
4. | lists(also known as arrays) list集合(也称为数组) |
5. | map集合 |
6. | runes(for expressing Unicode characters in a string) 字符(用于在字符串中表示Unicode字符) |
7. | symbols |
1.numbers 数字
dart中numbers有两种类型。int类型:整数值不大于64位,具体取决于平台。 在Dart VM上,值可以是-2^63 到 2^63 - 1。double类型:64位(双精度)浮点数,由IEEE 754标准规定,dart中没有float这个概念,小数都是double。int和double都是num的子类型。num类型包括基本运算符,如+、- 、/和*,也是你可以找到abs()
,ceil()
和floor()
以及其他方法的地方。 (按位运算符,如>>,在int类中定义。)如果num及其子类型没有您要查找的内容,则dart:math库可能有。
int x = 1;
int hex = 0xDEADBEEF;
double y = 1.1;
double exponents = 1.42e5;
num z = 30;
num m = 4.50;
2.strings 字符
Dart字符串是一系列UTF-16代码单元。 您可以使用单引号或双引号来创建字符串:
String s1 = 'Single quotes work well for string literals.';
String s2 = "Double quotes work just as well.";
String s3 = 'It\'s easy to escape the string delimiter.';
String s4 = "It's even easier to use the other delimiter.";
String s5= 'The + operator ' + 'works, as well.';
您可以使用$ {expression}将表达式的值放在字符串中。 如果表达式是标识符,则可以跳过{}。 要获取对应于对象的字符串,Dart调用对象的toString()方法。在字符串前加一个r字符,可以消除\的转译作用。创建多行字符串的另一种方法:使用带有单引号或双引号的三重引号:
String s1 = '''You can create
multi-line strings like this one.''';
String s2 = """This is also a
multi-line string.""";
num expression = 30;
String s3 = "this is expression value:${expression}";
// \n本来是换行符,前面加r会消除\n的转译作用,从而使得\n被看作是字符串的一部分。
String s3 = r"this is \n right content";
文字字符串是编译时常量,只要任何插值表达式是一个编译时常量,其值为null或数值,字符串或布尔值。
3.booleans 布尔
为了表示布尔值,Dart有一个名为bool的类型。boolean字符 true和false,它们都是编译时常量。
4.lists array集合
dart中List与java中array的意义相同。列表使用从零开始的索引,其中0是第一个元素的索引,list.length - 1是最后一个元素的索引。
// 没有类型限制,相当于List<Object>
List list = ["one",2,"three"];
// String List,只能包含String字符元素
List<String> strList = ["one","two","three"]
int two = list[1];
String two2 = strList[1];
5.maps map集合
通常,映射是关联键和值的对象。 键和值都可以是任何类型的对象。 每个键只出现一次,但您可以多次使用相同的值。dart中使用Map来表示map类型。Map同样支持泛型。
Map gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
Map nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
// dart2中可以省略new关键字。
Map gifts2 = Map();
gifts2["first"] = 'partridge';
gifts2['second'] = 'turtledoves';
gifts2['fifth'] = 'golden rings';
// 获取gifts2中first键对应的值,如果对应的键的值不存在,那么对应的值为null。
String firstValue = gifts2["first"];
6.runes 解码后的字符串表示
在Dart中,runes是字符串的UTF-32代码点。
Unicode为世界上所有书写系统中使用的每个字母,数字和符号定义唯一的数值。表达Unicode代码点的常用方法是\uXXXX,其中XXXX是4位十六进制值。要指定多于或少于4个十六进制数字,请将值放在大括号中。String类有几个属性可用于提取符文信息。 codeUnitAt
和codeUnit
属性返回16位代码单元。 使用runes属性获取字符串的符文。
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
outPut:
?
[55357, 56399]
[128079]
♥ ? ? ? ? ?
7.Symbols 符号
Symbol对象表示在Dart程序中声明的运算符或标识符。 您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。Symbols时编译时常量。
三、变量
dart中使用可以使用弱类型var来声明变量,这个时候,编译器会使用类型推导——简单来说就是编译器根据你对变量的赋值和上下文来确定声明的对象的类型。如果希望声明的是Object类型的变量,你可以使用dynamic
关键字
// 类型推导会知道str是一个String类型的变量。
var str = "this is string";
//str = 30; 这样写编译器报错,str已经是String类型了。
// dStr 最后是int(num)类型;
dynamic dStr = "this is right";
dStr = 30;
默认值:dart中一切都是对象,没有初始化的对象会被赋值为null,bool 类型除外。bool 对象默认值为false。
final 和 const
1.被final或者const修饰的变量,变量类型可以省略。
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
const versionCode = 30;
2.被 final 或 const 修饰的变量无法再去修改其值。final修饰的变量一旦初始化一次后便不能再次赋值,而const修饰的变量的值再编译时已确定,无法修改
3.注意:flnal 或者 const 不能和 var 同时使用。这个错误是一个运行时错误。
4.常量如果是类级别的,请使用 static const
5.常量可以由计算赋值。
final speed = 200;//(km/h)
final double distance = 2.5 * speed;
// 距离 = 速度 * 时间
const speed1 = 200;
6.const关键字不只是声明常数变量。也可以使用它来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值。
//注意:[] 创建的是一个空的list集合
// const[] 创建一个空的、不可变的列表(EIL)
var varList = const []; //varList 当前时一个EIL
final finalList = const []; //finalList一直是EIL
const constList = const []; //constList是一个编译时常量的EIL
// 注意 varList变量本身不是const或者final的,因此,varList是可以改变的,但是const和final修饰的finalList和constList是不能改变的。
varList = [111, 222, 333];
7.final和const的本质区别
//编译器通过
var a = 1;
final f = 3;
const d = 2;
final b = a;
const c = d;
//编译器报错
//报错:Const variables must be initialized with a constant value
const e = a;
const g = f;
final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。final是第一次使用时初始化,const是编译时就确认值了。