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