动态

详情 返回 返回

Flutter/Dart第21天:Dart異步編程(Future/Stream) - 动态 详情

Dart官方文檔:https://dart.dev/language/async

重要説明:本博客基於Dart官網文檔,但並不是簡單的對官網進行翻譯,在覆蓋核心功能情況下,我會根據個人研發經驗,加入自己的一些擴展問題和場景驗證。

Future處理

我們有2種方式編寫Future異步代碼:

  • 使用asyncwait關鍵字
  • 使用Future API(https://dart.dev/guides/libraries/library-tour#future)

推薦使用asyncwait關鍵字,讓異步代碼看起來和同步代碼一樣。

如下代碼樣例:wait關鍵字等待異步函數返回結果,它必須在async函數中。

Future<void> checkVersion() async {
  var version = await lookUpVersion();
  var exitCode = await findExitCode();
  // ......
  await flushThenExit(exitCode);
}

可以用trycatchfinally關鍵字處理錯誤和清理代碼:

try {
  version = await lookUpVersion();
} catch (e) {
  // React to inability to look up the version
} finally {
  // Clean code
}

申明異步函數

使用async修飾一個函數體,這個函數就是異步函數,它的返回結果是一個Future<T>,當函數無需返回結果時,返回結果為Future<void>

Future<String> lookUpVersion async {
  // ......
  return '1.0.1';
}

Future<void> doSomething() {
  // ......
}

Stream處理

同樣的,我們也有2種方式編寫Stream代碼:

  • 在異步循環使用async異步關鍵字(await for
  • 使用Stream API(https://dart.dev/guides/libraries/library-tour#stream)

推薦使用async關鍵字,異步循環的形式如下:

await for (varOrType identifier in expression) {
  // ......
}

在上訴異步循環形式中,expression的值為一個Stream類型,異步循環的執行過程如下:

  • 等待Stream產出一個值(即觸發循環執行)
  • 設置identifier變量值,執行循環體邏輯
  • 重複上面2步,直到Stream關閉(即循環結束)

我們可以通過break或者return語句,退出循環,從而中斷監聽Stream生產的值。

同樣的,異步循環的函數,必須使用async關鍵字修飾。如下所示,main()函數體使用了await for異步循環,則函數必須使用async修飾:

void main() async {
  // ......
  await for (final request in requestServer) {
    handleRequest(request);
  }
  // ......
}

最後

  • 第4課對異步編程文檔(Future和async/await):https://ntopic.cn/p/2023092901
  • 其他更多關於異步編程信息,請求參考異步包dart:async(https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming)

我的本博客原地址:https://ntopic.cn/p/2023111801


Add a new 评论

Some HTML is okay.