在開發 App 的過程中,我們的程式常常會需要與外部服務互動,例如:利用 http 像後端 API 拿回一些資料,或者把一些資料存到 Local storage 中。在這些情境中,我們無可避免地需要使用非同步來處理,因為這些互動往往需要一些時間,而我們不能讓程式因為等待結果而卡住。
在非同步呼叫回傳 Future 後,我們可以呼叫 Future.then,並傳入我們想要的後續操作,來完成非同步處理。也可以繼續使用 .catchError 處理錯誤情況。
https://dartpad.dev/?id=631e48f94fc4932beb2f8d6ca0ffbd30
除了使用 .then 之外,Dart 還提供 async/await 的方式來處理非同步。使用 async/await 來處理非同步的呼叫,可以把程式碼寫的與同步程式碼一樣,閱讀上非常直觀。而在錯誤處理的方面,能像同步程式碼一樣,使用 try / catch 處理。
https://dartpad.dev/?id=61b515070bef07ebb8d5694fca43af52
再看了 .then 和 async/await 的作法之後,大家可能會思考,到底用哪個比較好呢?
有些時候,我們不得不使用 .then:當我們在 StatefulWidget 中的 initState 裏,想呼叫非同步方法來初始化狀態時,由於 initState 本身回傳值 void,使得我們無法在其中使用 await。此時,我們必須使用 .then 來處理。
https://dartpad.dev/?id=50d3d9e4f54c6ec3047780ea4eec715f
雖然我們可以硬把 initState 加上 async,實際上執行卻會發生錯誤
大多數時候,用 .then 或用 async/await 並不會差很多,但是我自己強烈推薦使用 async/await,原因如下
https://dartpad.dev/?id=fa2f7f3786ad656b894153e59a4a027b
https://dartpad.dev/?id=966b04b98c4b2a37ae09a3ffb928e65f
非同步處理是開發過程中很常使用到的技巧之一,如果此時程式碼寫的不夠清楚,往往在實現時忽略執行邏輯而造成 Bug,當程式碼又不好讀時,更是雪上加霜。使用 async/await 能讓我們把非同步處理寫的像同步處理一樣,讓程式碼變得更好讀,也易於新手學習。