泛型
泛型通常是为了类型安全而设计的,设当地指定泛型类型会生成更好的地代码,也可以使用泛型来减少代码重复。Dart中使用地方式来定义泛型。例如,想要List包含字符串,可以将其声明为list<String>。如下:
void test(){
var names = List<String>();
names.addAll(['cxl','zs','ls']);
}
用于集合泛型
泛型用于List和Map类型参数化:
List:<type>
Map:<keyType,valueType>
示例:
var names = <String>['cxl','zs','ls'];
var weeks = <String,String>{
'Monday':'星期一',
'Tuesday':'星期二',
...
'Sunday':'星期日'
}
在构造函数中参数化
Map类型如:var user = new Map<String,String>();
List类型如:var user = new List<User>();
库地使用
引用库
通过import语句在一个库中引用另一个库地文件。需要注意以下事项:
- 在
import语句后面需要接上库文件地路径。 - 对
Dart语言提供的库文件使用dart:xx格式。 - 第三方的库文件使用
package:xx格式。import的例子如下:
import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
指定一个库的前缀
当引用的库拥有互相冲突的名字,可以为其中或几个指定不一样的前缀。这与命名空间的概念比较接近,示例代码如下:
import 'package:lib1/lib1.dart';
import 'package:lib1/lib1.dart' as lib2;
void test(){
Element element1 = new Element();//使用lib1中的Element
lib2.Element element2=new lib2.Element();//使用lib2中的Element
}
lib1/lib1.dart和lib2/lib2.dart里面都有Element类,如果直接引用就不知道具体引用那个Element类,所以代码中把lib2/lib2.dart指定成lib2这样使用lib2.Element就不会发生冲突。
引用库的一部分
如果只需要使用库的一部分内容,可以有选择地使用,有如下关键字:
show关键字:只引用一点。hide关键字:除此之外都引用。
示例代码如下:
//导入foo
import 'package:lib1/lib1.dart' show foo;
//除了foo导入其他所有内容
import 'package:lib2/lib2.dart' hide foo;
异步支持
Dart语言是目前少数支持异步操作的语言。一般使用async函数和await表达式实现异步操作。
Dart库提供asynchronous功能,该功能提供接口来进行耗时操作,比如文件读写、网络请求。该功能返回Future或Stream对象。
可以通过如下方式来获取asynchronous功能返回地Future对象值:
- 使用
async函数和await表达式。 - 使用
Future功能提供地API。 可以通过如下地方式获取asynchronous功能返回地Stream对象值: - 使用
async和一个异步的循环(await for)。 - 使用
Stream的相关API。 下面示例代码使用async或await异步处理,虽然代码看起像同步处理:
await readFile()
必须在一个使用async关键字标记后的函数中使用await表达式:
void fileOperate() async{
//读取文件
readFile()
//其他操作
//...
}
元数据(@)
使用袁术给代码添加更多的信息,元数据是以@开始的修饰符,在@后面接着编译时的常量或调用一个常量构造函数。目前Dart语言提供三个@修饰符:
@deprecated被弃用。@override重写。@proxy代理。
注释
Dart支持三种注释类型
- 单行注释
- 多行注释
- 文档注释
跟JAVA一样