dart语言学习笔记-4

泛型

Dart的泛型会一直保留到运行时

Libraries & visibility

import和library指令可以帮助你创建模块和分享代码。Libraries不仅对外提供了API同时也包含一组隐私,所有以_开头的声明都只在Library可见。任何app可以当做一个library。

using libraries

通过import关键字导入某个命名空间的库(用URI声明库)

import 'dart:html';

对于内建的库,URI的scheme为dart:,其他库可以通过文件系统路径或scheme为package:指定。package:定位的资源有包管理器(pub tool)提供.

import 'package:test/test.dart';
库别名-as

当库中的类有冲突时,可以给库取个别名

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

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();
库的部分导入
// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
库的懒加载

可能需要懒加载的场景

  1. 减少app的启动时间
  2. 执行A/B测试时,可选的加载库
  3. 当库的使用频率很低时

懒加载步骤

  1. 使用deferred as
import 'package:greetings/hello.dart' deferred as hello;
  1. 用之前,调用loadLibrary()方法,多次调用该方法之后加载一次
Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

注:(后续懒加载规则可能会变化)

  1. 懒加载的库,只能在加载后才能使用
  2. 如果想在库加载之前使用接口,可以把它抽离出来,让懒加载的库和实际的库都引用
  3. Dart隐式的在将要懒加载的库中插入loadLibrary()函数,该函数返回Future对象。

异步编程

通过async和await的组合,让异步调用看起来和同步调用一样的。
  1. 函数虽然标记为async,但直到遇到await才会异步执行
  2. await语句可以在async函数中重复出现
  3. 每一个await expression都返回一个Future对象,如果不是,会被自动包装为Future对象
  4. await只能出现在有async的函数中
流处理

当你需要从流中获取值时,有两张方式

  1. 使用async和异步循环(await for)
//expression必须是Stream类型
await for (varOrType identifier in expression) {
  // Executes each time the stream emits a value.
}
  1. 使用Stream API

生成器-Generators

Dart提供两种内建的生成器

  1. 同步生成器,返回Iterable对象
    方式:用sync*标记函数,用yield派发值
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while(k < n) yield k++;
}
  1. 异步生成器,返回Stream对象
    方式:用async*标记函数,用yield派发值
Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while(k < n) yield k++;
}

如果需要递归,使用yield*,如:

Iterable<int> naturalsDownFrom(int n) async* {
  if(n > 0) {
    yield n;
    yield* naturalsDownFrom(n -1);
  }
}

callable classes

为了允许类像方法那样调用,需要定义一个call()方法

class WannabeFunction {
  call(String a, String b, String c) => '$a $b $c!';
}

main() {
  var wf = new WannabeFunction();
  var out = wf("Hi","there,","gang");
  print('$out');
}

typedef

目前只适用于给function取别名,并且类型信息会一直保留到运行期间

typedef Compare = int Function(Object a, Object b);

class SortedCollection {
  Compare compare;

  SortedCollection(this.compare);
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

void main() {
  SortedCollection coll = SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}

也可包含泛型

typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}

元数据-metadata

用于为代码提供额外的信息,元数据以@开头,跟随编译期常量(如deprecated、override)或常构造器方法的调用。

  1. dart提供@deprecated和@override
class Television {
  /// _Deprecated: Use [turnOn] instead._
  @deprecated
  void activate() {
    turnOn();
  }

  /// Turns the TV's power on.
  void turnOn() {...}
}
  1. 自定义注解
library todo;

class Todo {
  final String who;
  final String what;

  const Todo(this.who, this.what);
}
import 'todo.dart';

@Todo('seth', 'make this do something')
void doSomething() {
  print('do something');
}

Metadata can appear before a library, class, typedef, type parameter, constructor, factory, function, field, parameter, or variable declaration and before an import or export directive. You can retrieve metadata at runtime using reflection.

Metadata can appear before a library, class, typedef, type parameter, constructor, factory, function, field, parameter, or variable declaration and before an import or export directive. You can retrieve metadata at runtime using reflection.

文档注释

单行以///开头,多行以/开头,连续的单行效果和多行是一样的。内容中用括弧([])包裹的内容为词法上下文对象的引用,如类、方法、字段、顶级变量、函数等等。

/// A domesticated South American camelid (Lama glama).
///
/// Andean cultures have used llamas as meat and pack
/// animals since pre-Hispanic times.
class Llama {
  String name;

  /// Feeds your llama [Food].
  ///
  /// The typical llama eats one bale of hay per week.
  void feed(Food food) {
    // ...
  }

  /// Exercises your llama with an [activity] for
  /// [timeLimit] minutes.
  void exercise(Activity activity, int timeLimit) {
    // ...
  }
}

如上代码,通过dart文档生成工具生成的文档,[Food]将连接到Food的类文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 孟尝君田文是我较为熟悉的侠客,他招募天下贤能之人来壮大自己的门客,与魏无忌,赵胜和黄歇,并称“战国四公子”。...
    HETTYYY_萱阅读 764评论 0 0
  • 今天是开学第一天,我们班四个宝贝在幼儿园度过了愉快的一天!!! 1、保育工作:今天我们带着小朋友们熟悉了一些...
    中班小可爱阅读 278评论 0 0
  • 很多家长以为让孩子背背唐诗、认认字母、学学儿歌就是学前最好的智力开发了,果真如此吗?有科学家认为,画画是开发孩子智...
    豆豆美育馆王晓音阅读 307评论 0 0
  • 标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 列表 有序列表 第一条 第二条 第三条 无序列表...
    linwan阅读 212评论 0 0
  • 有空和我去看个星星晒个月亮吗月亮和星星没空的话那我们就去路灯下站站如果你有空的话——《如果》 ​​​ 有的人莫名其...
    吕三岁同学阅读 1,514评论 7 38