Dart速通(五)- 泛型、库和其他(完结篇)

290 阅读3分钟

泛型

泛型通常是为了类型安全而设计的,设当地指定泛型类型会生成更好的地代码,也可以使用泛型来减少代码重复。Dart中使用地方式来定义泛型。例如,想要List包含字符串,可以将其声明为list<String>。如下:

void test(){
    var names = List<String>();
    names.addAll(['cxl','zs','ls']);
}

用于集合泛型

泛型用于ListMap类型参数化:

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.dartlib2/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功能,该功能提供接口来进行耗时操作,比如文件读写、网络请求。该功能返回FutureStream对象。 可以通过如下方式来获取asynchronous功能返回地Future对象值:

  • 使用async函数和await表达式。
  • 使用Future功能提供地API。 可以通过如下地方式获取asynchronous功能返回地Stream对象值:
  • 使用async和一个异步的循环(await for)。
  • 使用Stream的相关API。 下面示例代码使用asyncawait异步处理,虽然代码看起像同步处理:
await readFile()

必须在一个使用async关键字标记后的函数中使用await表达式:

void fileOperate() async{
    //读取文件
    readFile()
    //其他操作
    //...
}

元数据(@

使用袁术给代码添加更多的信息,元数据是以@开始的修饰符,在@后面接着编译时的常量或调用一个常量构造函数。目前Dart语言提供三个@修饰符:

  • @deprecated被弃用。
  • @override重写。
  • @proxy代理。

注释

Dart支持三种注释类型

  • 单行注释
  • 多行注释
  • 文档注释

跟JAVA一样