Flutter 學習(三) dart基礎

dart 語言的異步 同步 構造器 隔離 元註解 註釋方式bash

1. async await

下面依次調用 三個方法 輸出的順序爲1--3--4--2--5await該關鍵字會執行暫停當前線程 等外部執行完畢再執行剩下的異步

main() async {
  // async wait
  getName1();
  getName2();
  getName3();
  }
複製代碼
/ async wait
Future<void> getName1() async {
//  getStr1();//能夠不用await打斷點看下await後的區別
  await getStr1(); //遇到第一個await表達式執行暫停,返回future對象,await表達式執行完成後繼續執行
  await getStr2(); //await表達式能夠使用屢次
  print('5');
}

getStr1() {
  print('1');
}

getStr2() {
  print('2');
}

getName2() {
  print('3');
}

getName3() {
  print('4');
}

複製代碼

2. 隊列添加

  • Future

每次新建一個Future 會將這個Future添加到隊列當中 先添加先執行 下面代碼的輸入順序爲f7--f1--f6--f3--f5--ff2--f4async

void testFuture() {
  Future f = new Future(() => print("f1"));
  Future f1 = new Future(() => null); //7163524
//  Future f1 = new Future.delayed(Duration(seconds: 1) ,() => null);//7132465
  Future f2 = new Future(() => null);
  Future f3 = new Future(() => null);

  f3.then((_) => print("f2"));
  f2.then((_) {
    print("f3");
    new Future(() => print("f4"));
    f1.then((_) {
      print("f5");
    });
  });

  f1.then((m) {
    print("f6");
  });
  print("f7");
}
複製代碼
  • scheduleMicrotask 微隊列

微隊列會優先與隊列執行,微隊列執行會在當前正在執行的Future任務 執行完纔會去執行微隊列的任務, 若是then返回一個future任務那這個任務也會放到隊列中, delayed延遲隊列會在最後執行 下面的代碼輸出順序爲s9--s1--s8--s3--s4--s6--s5--s10--s7--s11--s12--s2ide

void testScheduleMicrotask() {
  //918346572
  scheduleMicrotask(() => print('s1'));

  new Future.delayed(new Duration(seconds: 1), () => print('s2'));

  new Future(() => print('s3')).then((_) {
    print('s4');
    scheduleMicrotask(() => print('s5'));
  }).then((_) => print('s6'));

  new Future(() => print('s10'))
      .then((_) => new Future(() => print('s11')))
      .then((_) => print('s12'));

  new Future(() => print('s7'));

  scheduleMicrotask(() => print('s8'));

  print('s9');
}

複製代碼

3. isolates 隔離

全部的 Dart 代碼在 isolates 中運行而不是線程。 每一個 isolate 都有本身的堆內存,而且確保每一個 isolate 的狀態都不能被其餘 isolate 訪問。 其實 一個main方法就是一個隔離函數

main() async {
  var receivePort = new ReceivePort();
  await Isolate.spawn(echoo, receivePort.sendPort);
  receivePort.listen((s) {
    if (s is SendPort) {
      s.send("不我想要桃子");
    } else
      print(s);
  });
}

/// 新isolate的入口函數
echoo(SendPort sendPort) async {
  // 實例化一個ReceivePort 打開接收端口以接收消息
  var port = new ReceivePort();

  // 把它的sendPort發送給宿主isolate,以便宿主能夠給它發送消息
  sendPort.send(port.sendPort);
  sendPort.send("給你爛蘋果");
  // 監聽循環接收消息
  port.listen((s) {
    print(s);
  });
}

複製代碼

4. 生成器

sync* async用於生成 Iterrable 和 Stream yield yield 優化性能性能

  • 同步生成器

返回值是Iterable 須要調用 moveNext() 纔會執行迭代優化

//調用getSyncGenerator當即返回Iterable
  var it = getSyncGenerator(5).iterator;
//  調用moveNext方法時getSyncGenerator纔開始執行
  while (it.moveNext()) {
    print(it.current);
  }
  
  
//同步生成器: 使用sync*,返回的是Iterable對象
Iterable<int> getSyncGenerator(int n) sync* {
  print('start');
  int k = n;
  while (k > 0) {
    //yield會返回moveNext爲true,並等待 moveNext 指令
    yield k--;
  }
  print('end');
}

複製代碼
  • 異步生成器

返回值是Stream 執行了只有執行了listen以後函數纔會執行,也能夠使用能夠使用StreamSubscription對象對數據流進行控制ui

//調用getAsyncGenerator當即返回Stream,只有執行了listen,函數纔會開始執行
//  getAsyncGenerator(5).listen((value) => print(value));


  StreamSubscription subscription = getAsyncGenerator(5).listen(null);
  subscription.onData((value) {
    print(value);
    if (value >= 2) {
      subscription.pause(); //能夠使用StreamSubscription對象對數據流進行控制
    }
 });

//異步生成器: 使用async*,返回的是Stream對象
Stream<int> getAsyncGenerator(int n) async* {
  print('start');
  int k = 0;
  while (k < n) {
    //yield不用暫停,數據以流的方式一次性推送,經過StreamSubscription進行控制
    yield k++;
  }
  print('end');
}

複製代碼
  • 遞歸生成器
//同步
  var it1 = getSyncRecursiveGenerator(5).iterator;
  while (it1.moveNext()) {
    print(it1.current);
  }
  //異步
  getAsyncRecursiveGenerator(5).listen((value) => print(value));


//遞歸生成器:使用yield*
Iterable<int> getSyncRecursiveGenerator(int n) sync* {
  if (n > 0) {
    yield n;
    yield* getSyncRecursiveGenerator(n - 1);
  }
}

//異步遞歸生成器
Stream<int> getAsyncRecursiveGenerator(int n) async* {
  if (n > 0) {
    yield n;
    yield* getAsyncRecursiveGenerator(n - 1);
  }
}
複製代碼

5. 元註解

  • @deprecated 過期
  • @override 重寫
  • 自定義註解
class Todo {
  final String who;
  final String what;

  const Todo({this.who, this.what});
}
複製代碼

6. 註釋方式

  • 這是單行註釋
// 這是單行註釋
複製代碼
  • 多行註釋
/*
 * 這是多行註釋
 * 這是多行註釋 
 */

複製代碼
  • 文檔註釋
兩種方式
/// 這是文檔註釋

/**
  * 這是文檔註釋
  */

複製代碼
相關文章
相關標籤/搜索