0%

Dart入门一

1.变量

可以通过显式声明指定类型的方式,创建一个变量并进行初始化。

1
String name = 'Bob';

dart中变量支持类型推导,用var创建一个变量并进行初始化:
1
var name = 'Bob';

name 变量的类型被推断为 String。 var的错误用法:
1
2
var name = 'Bob';
name = 18; // error 不可以将int赋值给一个String类型

如果对象不限定为单个类型,可以指定为 对象类型动态类型
1
2
3
4
dynamic name = 'Bob';
print(name.runtimeType); // String
name = 18;
print(name.runtimeType); // int

提示: 本页局部变量遵守 风格建议指南 使用 var。 没有使用指定类型的方式。

默认值

未初始化的变量默认值是 null。即使变量是数字 类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型 也不例外。

Final 和 Const

使用过程中从来不会被修改的变量, 可以使用 final 或 const, 而不是 var 或者其他类型, Final 变量的值只能被设置一次; const 变量在编译时就已经固定或类变量在第一次使用时被初始化。

1
2
3
4
5
6
7
8
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
name = 'Alice'; // error: 一个 final 变量只能被设置一次。

const bar = 1000000; // 压力单位 (dynes/cm2)
const double atm = 1.01325 * bar; // 标准气压
const baz = [];
baz[0] = 1; // error: Cannot modify an unmodifiable list

  • const在赋值时,赋值的内容必须是在编译期间就确定下来的。const是不可以赋值为DateTime.now()
  • final在赋值时,可以动态获取,比如赋值一个函数。final一旦被赋值后就有确定的结果,不会再次赋值.

2.内建类型

Dart 语言支持以下内建类型:

Number
String
Boolean
List (也被称为 Array)
Map
Set
Rune (用于在字符串中表示 Unicode 字符)
Symbol

Number

int
整数值不大于64位, 具体取决于平台。 在 Dart VM 上, 值的范围从 -2^63 到 2^63 - 1. Dart 被编译为 JavaScript 时,使用 JavaScript numbers, 值的范围从 -2^53 到 2^53 - 1.

double
64位(双精度)浮点数,依据 IEEE 754 标准。

1
2
var x = 1;
var hex = 0xDEADBEEF; // 支持16进制格式

String
Dart 字符串是一组 UTF-16 单元序列。 字符串通过单引号或者双引号创建。

提示: == 运算符用来测试两个对象是否相等。可以使用 + 运算符来把多个字符串连接为一个。

类似 python 中使用连续三个单引号或者三个双引号实现多行字符串对象的创建,使用 r 前缀,可以创建 “原始 raw” 字符串:

1
2
3
4
5
6
7
8
9
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

var s = r"In a raw string, even \n isn't special.";

Boolean
Dart 使用 bool 类型表示布尔值。 Dart 只有字面量 true and false 是布尔类型, 这两个对象都是编译时常量。

Dart 的类型安全意味着不能使用 if (nonbooleanValue) 或者 assert (nonbooleanValue)。 而是应该像下面这样,明确的进行值检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 检查空字符串。
var fullName = '';
assert(fullName.isEmpty);

// 检查 0 值。
var hitPoints = 0;
assert(hitPoints <= 0);

// 检查 null 值。
var unicorn;
assert(unicorn == null);

// 检查 NaN 。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

List
Dart 中的 List 字面量非常像 JavaScript 中的 array 字面量。 下面是一个 Dart List 的示例:

1
var list = [1, 2, 3];

提示:Dart 推断 list 的类型为 List 。 如果尝试将非整数对象添加到此 List 中, 则分析器或运行时会引发错误。

在 List 字面量之前添加 const 关键字,可以定义 List 类型的编译时常量:

1
2
var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注释会引起错误。

Set
下面是通过字面量创建 Set 的一个简单示例:
1
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

要创建一个空集,使用前面带有类型参数的 {} ,或者将 {} 赋值给 Set 类型的变量:
1
2
3
var names = <String>{};
// Set<String> names = {}; // 这样也是可以的。
// var names = {}; // 这样会创建一个 Map ,而不是 Set 。

Map
通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。 但是 value 可以出现多次。Map 对象也可以使用 Map 构造函数创建:

1
2
3
4
5
6
7
8
9
10
11
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

提示: 这里为什么只有 Map() ,而不是使用 new Map()。 因为在 Dart 2 中,new 关键字是可选的。

类似 JavaScript ,添加 key-value 对到已有的 Map 中:

1
2
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

类似 JavaScript ,从一个 Map 中获取一个 value:
1
2
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');

集合的常见操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 获取集合的长度
print(list.length);
print(set.length);
print(map.length);

// 添加/删除/包含元素
list.add(5);
set.add(5);
print('$list $set');

list.remove(1);
set.remove(1);
print('$list $set');

print(list.contains(2));
print(set.contains(2));

// List根据index删除元素
list.removeAt(3);
print('$list');
Map的常见操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Map的操作
// 1.根据key获取value
print(map['name']); // Bob

// 2.获取所有的entries
print('${map.entries} ${map.entries.runtimeType}');

// 3.获取所有的keys
print('${map.keys} ${map.keys.runtimeType}'); // (name, age) _CompactIterable<String>

// 4.获取所有的values
print('${map.values} ${map.values.runtimeType}'); // (Bob, 18) _CompactIterable<Object>

// 5.判断是否包含某个key或者value
print('${map.containsKey('age')} ${map.containsValue(18)}'); // true true

// 6.根据key删除元素
map.remove('age');
print('${map}'); // {name: Bob}

实现了 Iterable 的类(比如, List 和 Set)同样也支持使用 for-in 进行迭代操作 iteration :

1
2
3
4
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}

赞赏是最好的支持