Dart 语言基础入门篇( 二 )

这里List容器接受的类型是dynamic,你可以往里面添加任何类型的对象,但如果像这样声明:
var iList = [1,2,3];iList.add(4);//编译错误 The argument type 'String' can't be assigned to the parameter type 'int'//iList.add('Hello');那么Dart就会推导出这个List是个List<int>,从此这个List就只能接受int类型数据了,你也可以显式声明List的类型:
var sList = List<String>();//在Flutter类库中,有许多这样的变量声明:List<Widget> children = const <Widget>[];上面右边那个 const 的意思表示常量数组,在这里你可以理解为一个给children赋值了一个编译期常量空数组,这样的做法可以很好的节省内存,下面的例子可以让大家更好的理解常量数组的概念:
var constList = const <int>[1,2];constList[0] = 2; //编译通过, 运行错误constList.add(3); //编译通过, 运行错误Dart2.3 增加了扩展运算符 (spread operator) ... 和...?,通过下面的例子你很容易就明白它们的用法:
var list = [1, 2, 3];var list2 = [0, ...list];assert(list2.length == 4);如果扩展对象可能是null,可以使用...?:
var list; var list2 = [0, ...?list]; assert(list2.length == 1);你可以直接在元素内进行判断,决定是否需要某个元素:
var promoActive = true;var nav = ['Home','Furniture','Plants',promoActive? 'About':'Outlet'];甚至使用for来动态添加多个元素:
var listOfInts = [1, 2, 3];var listOfStrings = ['#0',for (var i in listOfInts) '#$i'];assert(listOfStrings[1] == '#1');这种动态的能力使得 Flutter 在构建 Widget 树的时候非常方便 。
SetsSet的语意和其他语言的是一样的,都是表示在容器中对象唯一 。在Dart中,Set默认是LinkedHashSet实现,表示元素按添加先后顺序排序 。
声明Set对象:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};遍历Set,遍历除了上面提到的for...in,你还可以使用类似 Java 的 lambada 中的 forEach 形式:
halogens.add('bromine');halogens.add('astatine');halogens.forEach((el) => print(el));输出结果:
fluorinechlorinebromineiodineastatine除了容器的对象唯一特性之外,其他基本和List是差不多的 。
// 添加类型声明:var elements = <String>{};var promoActive = true;// 动态添加元素final navSet = {'Home', 'Furniture', promoActive? 'About':'Outlet'};MapsMap对象的声明方式保持了 JavaScript 的习惯,Dart 中Map的默认实现是LinkedHashMap,表示元素按添加先后顺序排序 。
var gifts = {// Key:Value'first': 'partridge','second': 'turtledoves','fifth': 'golden rings'};assert(gifts['first'] == 'partridge');添加一个键值对:
gifts['fourth'] = 'calling birds';遍历Map:
gifts.forEach((key,value) => print('key: $key, value: $value'));函数在 Dart 中,函数本身也是个对象,它对应的类型是Function,这意味着函数可以当做变量的值或者作为一个方法入传参数值 。
void sayHello(var name){print('hello, $name');}void callHello(Function func, var name){func(name);}void main(){// 函数变量var helloFuc = sayHello;// 调用函数helloFuc('Girl');// 函数参数callHello(helloFuc,'Boy');}输出:
hello, Girlhello, Boy对于只有一个表达式的简单函数,你还可以通过=>让函数变得更加简洁,=> expr在这里相当于{ return expr; } ,我们来看一下下面的语句:
String hello(var name ) => 'hello, $name';相当于:
String hello(var name ){return 'hello, $name';}参数在Flutter UI库里面,命名参数随处可见,下面是一个使用了命名参数(Named parameters)的例子:
void enableFlags({bool bold, bool hidden}) {...}调用这个函数:
enableFlags(bold: false);enableFlags(hidden: false);enableFlags(bold: true, hidden: false);命名参数默认是可选的,如果你需要表达该参数必传,可以使用@required:
void enableFlags({bool bold, @required bool hidden}) {}当然,Dart 对于一般的函数形式也是支持的:
void enableFlags(bool bold, bool hidden) {}和命名参数不一样,这种形式的函数的参数默认是都是要传的:


推荐阅读