# 其他

# 泛型

泛型的好处是正确指定泛型可以提高代码质量,减少重复的代码 运行时中的泛型集合,Dart中泛型类型是固化的,即它们在运行时是携带类型信息的.

var list = List<int>();
list.addAll([2,3]);
assert(list is List<int>);

#

库不仅提供API,还封装代码,下划线(_)开头的标识符只能在库中可见,库可通过包来分发

# 引用库

引用内置库

import 'dart:html';

引用其他库

import 'package:pages/index.dart';

# 指定库前缀

如果导入两个存在冲突标识符的库,可为其制定库前缀

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

Element ele1 = Element();  // 使用 lib1 中的 Element。
lib2.Element ele2 = lib2.Element();  // 使用 lib2 中的 Element。

# 导入部分库

只导入fn

import 'package:pages/index.dart' show fn;

除了fn都导入

import 'package:pages/index.dart' hide fn;

# 延迟加载

在需要库的时候再加载

import 'package:pages/index.dart' deferred as lib1;

当需要使用的时候

Future getLib() async {
  await lib1.loadLibrary();
  lib1.fn();
}

一个库可以多次调用loadLibrary,但只会载入一次

# 异步编程

Future getLib() async {
  await lib1.loadLibrary();
  lib1.fn();
}

其中async 表明这是一个异步函数,await等待其完成后,再执行下面的lib1.fn(),这看起来很像同步代码 假如我们要在主函数main中使用await,那么main()的函数体就必须被标记

Future main() async {
  await xx();
}

在一个异步函数中可以使用多个await 在await表达式中,其值通常是一个Future对象,有点类似于JS中的Promise

# 声明异步函数

同步写法

String fn() => 'zhangsan';

异步写法

Future<String> fn() async => 'zhangsan';

若函数没有返回值,则返回类型声明为Future<void>

# typedef

因为在Dart中一切皆对象,函数也是,我们可以使用typedef为函数起一个别名,用来声明字段及返回值类型 未使用typedef

void main(){
  Test t = Test(foo);
  print(t.fn is Function);
}
class Test {
  Function fn;
  Test(bool f(String a, int b)){
    fn = f;
  }
}
bool foo(String a, int b) => true;

上面的代码在将f赋值给fn时,类型信息就丢失了,但是如果我们使用显式的名字保留类型信息,这样开发者和工具都可以使用它们.

使用typedef

void main(){
  var t = new Test(foo);
  print(t.fn is Function);
  print(t.fn is Fn);
}
typedef Fn = bool Function(String a, int b);
class Test {
  Fn fn;
  Test(this.fn);
}
bool foo(String a, int b) => true;

# 元数据

元数据注释以@开头,Dart中有两种可用注解: @deprecated@override 下面是@deprecated 的用法

void main(){
  var t = new Test();
  t.oldFn();  // 在vscode中,这里会有一条删除线提示我们这个方法是不推荐使用的,但它仍是能够执行的
  t.newFn();
}

class Test {
  
  void oldFn(){
    newFn();
  }
  
  newFn(){
    print(1);
  }
}

# 注释

# 普通注释

单行注释

// print(1);

多行注释

/*
print(1);
print(1);
*/

# 文档注释

单行注释

/// 继承自[Test2]

多行注释

/** 
 * 继承自[Test2]
 * 有个参数
**/

[Test2]会成为一个链接,指向Test2类的API文档