Dart(二)

Posted by Csming on 2018-05-25

容器

StringBuffer

StringBuffer能够高效的构建多个字符串。

1
2
3
4
5
6
7
8
9
10
StringBuffer sb = new StringBuffer();

sb.write("11111");
sb.writeAll(['222', '333 ', 'string ', '444 ']);
sb..write('123112')
..write('333');

print(sb.toString());

sb.clear();

List

List提供添加、索引、删除等方法

可以用以下两种方式初始化:

1
2
3
4
var aList = new List();

// 或者简单的用List来赋值
var bList = ['xx', 'yy'];

List支持add、addAll、indexOf、removeAt等方法。

还可以使用sort对List进行排序。但是必须定义两个对象的对比函数。

1
fruits.sort((a, b) => a.compareTo(b));

Set集合

Set在Dart中无序,并且具有唯一性。

Map字典

Map是一个无序的键值对容器。

可以通过以下几种方式使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var hawaiianBeaches = {
'oahu' : ['waikiki', 'kailua', 'waimanalo'],
'big island' : ['wailea bay', 'pololu beach'],
'kauai' : ['hanalei', 'poipu']
};
var searchTerms = new Map();

// 指定键值对的参数类型
var nobleGases = new Map<int, String>();

// Map的赋值,中括号中是Key,这里可不是数组
nobleGase[54] = 'dart';

nobleGases[54] = 'xenon';

nobleGases.remove(54);

//V putIfAbsent(K key, Function V ifAbsent())函数,通过Key来查找Value
//当某个Key不存在的时候,会执行第二参数的Function来添加Value
var teamAssignments = {};
teamAssignments.putIfAbsent('Catcher', () => 'Catcher'.length);

可以使用getKeys和getValues获取所有的key和value的迭代器。

1
2
3
4
5
6
7
var keys = hawaiianBeaches.getKeys();

var values = hawaiianBeaches.getValues();

hawaiianBeaches.forEach((k,v) {
print('I want to visit $k and swim at $v');
});

迭代

Set、List、Map都继承于Iterable,可以迭代。

引用库

使用import

import后面跟一个字符串形式的Uri来指定需要引用的库。

eg:

1
2
3
4
5
6
7
8
9
10
11
//dart:前缀表示Dart的标准库,如dart:io、dart:html
import 'dart:math';

//可以用相对路径或绝对路径的dart文件来引用
import 'lib/student/student.dart';

//Pub包管理系统中有很多功能强大、实用的库,可以使用前缀 package:
import 'package:args/args.dart';

//包名有冲突时,可以用as来使用命名空间
import 'lib/student/student.dart' as Stu;

show可以用来显示某个成员而屏蔽其他。
hide可以用来屏蔽某个成员而显示其他。

1
2
3
import 'lib/student/student.dart' show Student, Person;

import 'lib/student/student.dart' hide Person;

Library

用library来定义库的名字。

part和part of

用于将分布在各个dart文件中的功能集合在该库中。

export

可以使用export导出一个更大的库,也可以导出部分组成一个新库(难以理解)

异步和并发

Future、Completer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//并发在Dart中非常的简便,首先声明函数为Future对象,异步传回的结果为int
//计算中奖号码
Future<int> getFutureWinningNumber() {
//Completer就像是控制器,决定Future对象后续的流程,then或者catchError

Completer<int> numberCompleter = new Completer<int>();

//获取中奖号码
Random r = new Random();
int randomNum = r.nextInt(32) + 1;

//这里用Timer模拟一个比较耗时的操作计算
//异步计算的结果,调用函数complete送出结果
new Timer(
new Duration(milliseconds: 2000),
() => numberCompleter.complete(randomNum));

return numberCompleter.future;
}

void main() {

//1、异步,效果为同时显示(肉眼无法察觉先后顺序)
Future<int> f1 = getFutureWinningNumber();
Future<int> f2 = getFutureWinningNumber();
Future<int> f3 = getFutureWinningNumber();
f1.then((int result1) => updateResult(1, result1));
f2.then((int result2) => updateResult(2, result2));
f3.then((int result3) => updateResult(3, result3));

//2、上面的逻辑可以用wait,执行多个函数后,一并将结果返回为list
// Future.wait([getFutureWinningNumber(),
// getFutureWinningNumber(),
// getFutureWinningNumber()])
// .then((list) {
// for(int i=0;i<list.length; i++) {
// updateResult(i+1, list[i]);
// }
// });

//3、异步,效果为顺序显示
// getFutureWinningNumber().then((num1) {
// updateResult(1, num1);
// //return Future,继续获取中奖号码
// //并执行下一个then
// return getFutureWinningNumber();
// }).then((num2) {
// updateResult(2, num2);
// return getFutureWinningNumber();
// }).then((num3) {
// updateResult(3, num3);
// });
}

updateResult(int ball, int winningNum) {
var ballDiv = "#ball$ball";
print("$ballDiv $winningNum");
// ballDiv.innerHtml = "$winningNum";
}

基础内容大概就这些了……
然后我发现:https://www.jianshu.com/p/8a62b1a2fd75
这个教程还不错。然后我决定,去看Dart in Action这本书,还有就是直接上手撸Flutter了。感觉都是英文的东西,可以锻炼一下。
目前Dart的资料还是比较少的。