現在我們來看看如何在Dart中處理異步代碼。使用Flutter時,會執行各種操作,例如網絡調用和數據庫訪問,這些操作都應該異步執行。
在Dart中導入庫
在Dart中使用異步,需要先導入異步庫。
Future
異步庫包含一個名爲Future的類,Future是基於觀察者模式的。如果您熟悉Javascript中的Rxjs或Promises,那麼理解起來會很容易。
簡單來說,Future定義的是“未來”發生的事情,也會在未來某個時刻返回一個值給我們。讓我們看看如何使用Future。
Future是一個泛型類型,即 Future <T>,你必須指定返回值的類型。
我們定義了一個名爲getAJoke的函數,它返回一個Future <String>。使用new關鍵字創建Future,Future構造函數接收一個返回值類型爲T的函數參數。無論您在匿名函數中返回什麼,都會被轉化爲Future。
在main中,我們調用getAJoke函數,該函數返回 Future<String>。我們通過調用then函數來訂閱Future,這些函數註冊了一個回調,當Future發出值時調用它。我們還註冊了一個catchError來處理在執行Future期間發生的任何異常。在我們的示例中,我們沒有發生任何異常。
以下是發生異常的示例。
在這個例子中,結果會立即返回。但在實際業務中,會使用Future來執行一些需要時間的代碼,例如網絡調用。我們可以使用 Future.delayed() 來模擬該行爲。
現在,如果運行該程序,等待2秒鐘後纔出結果。讓我們看另一個例子。
如您所見,我在調用函數後添加了一個print語句。在這種情況下,首先執行print語句,然後打印從Future返回的值。
但是,如果我們有一個Future,我們想先執行它,然後再執行print語句。這就需要使用 async/await 了。
Async/Await
首先在第3行的main函數的大括號之前添加async關鍵字。
然後我們在調用getAJoke函數之前添加await關鍵字,它的作用是等待從Future返回結果。後邊的代碼也會一直等待着被執行。
我們將代碼包裝在 try/catch 塊中,來捕獲任何異常(之前使用catchError回調來捕獲)。要使用關鍵字await,就必須使用async關鍵字標記該函數,否則它將無法工作。
總結
這就是本教程系列的內容,更多語法細節和功能特性,強烈推薦閱讀官方語言文檔。接下來讓我們一起探索Flutter開發之旅。