且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Dart基础-泛型和库

更新时间:2022-09-16 21:17:25

泛型

如果你看过API文档的基本类型数组和列表,你会发现实际上所有都是泛型,使用泛型可以提高代码的可读性

var names = new List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
//检查模式编译失败,生产模式编译成功
names.add(42);

使用泛型的另一个原因是减少代码重复,泛型可以创建多类型共享的接口,同时还能在检查模式早期预警,假如您创建一个接口缓存对象

abstract class ObjectCache {
  Object getByKey(String key);
  setByKey(String key, Object value);
}

如果你想要的只是String的接口,你可以创建另一个接口

abstract class StringCache {
  String getByKey(String key);
  setByKey(String key, String value);
}

再如果,你想要一个number的接口,是不是很麻烦,使用泛型类型可以节省您创建这些接口的麻烦

abstract class Cache<T> {
  T getByKey(String key);
  setByKey(String key, T value);
}

在上面代码中,T是类型的替身,可以认为是开发人员自定义的类型的占位符

使用文字集合

字符串类型的list和map可以参数化

var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <Stringk, String>{
  'index.html': 'Homepage',
  'robots.txt': 'Hints for web robots',
  'humans.txt': 'We are people, not machines'
};

用参数化类型作构造函数

指定一个或多个类型使用一个构造函数

var names = new List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = new Set<String>.from(names);

下面的代码创建了map、integer和Key Value

var views = new Map<int, View>();

泛型集合和包含的类型

dart的泛型类型需要具体化,这意味着泛型在运行时携带着类型信息

var names = new List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>);

import、part和library指令可以帮助您创建模块和共享代码,库不仅提供api,还是privacy权限的单位:标识符为下划线( _ )是只有在包内可见的,每个dart应用程序都是一个库,即使它不使用库的指令

使用库

使用 import 指定一个命名空间从一个库中使用另一个库

import 'dart:html';

dart: 开头的是dart内置的库,其他的库用 package: 开头

import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';

指定库的前缀

如果你导入的两个库有冲突的标识符,你可以为其中一个或两个库都指定一个前缀

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// ...
var element1 = new Element();
var element2 = new lib2.Element();

导入库的一部分

如果你只想要使用一个库的一部分,可以选择性的导入

//只导入foo
import 'package:lib1/lib1.dart' show foo;

//导入除了foo以外的所有
import 'package:lib2/lib2.dart' hide foo;

延迟加载库

在必要的时候允许程序延迟加载一个库的需求,延迟加载库,您必须使用 deferred as

import 'package:deferred/hello.dart' deferred as hello;

当你需要使用库,使用 loadLibrary() 调用库

greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

上面代码中,await 关键字暂停执行直到加载库,您可以多次使用loadLibrary(),库只加载一次

声明库

使用 library identifier 指定库的标识符

library ballgame;
import 'dart:html';

//...

关联文件与库

第一个 ballgame.dart 声明了ballgame库和需要的ball.dart和util.dart

library ballgame;

import 'dart:html';
//...

part 'ball.dart';
part 'util.dart';

//...

第二个 ball.dart 实现ballgame的一部分

part of ballgame;

//...

第三个 util.dart 实现ballgame的其他部分

part of ballgame;

//...

重导出库

您可以通过再结合或重新包装库的部分或全部

library french;

hello() => print('Bonjour!');
goodbye() => print('Au Revoir!');

library togo;

import 'french.dart';
export 'french.dart' show hello;

import 'togo.dart';

void main() {
  hello();
  goodbye();
}