【Flutter/Dart】Futureで非同期処理の実装方法!await/asyncの使い方

この記事からわかること
- Flutter/DartでFutureで非同期処理を実装する方法
- await/asyncの使い方
- thenやwaitメソッドなどの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Xcode:16.0
- Flutter:3.29.2
- Dart:3.7.2
- Mac M1:Sequoia 15.4
公式リファレンス:Asynchronous programming: Streams
Dartでの非同期処理
アプリ開発をしていく中で非同期処理の実装はマストになってきます。「非同期処理」とは処理の結果を待たずに並行して別の処理を進めるような処理のことです。例えばネットワーク通信やデータベースのCRUD操作、ファイルの読み書きなど処理に時間のかかる操作はアプリが一時的に停止してしまう原因になります。これらの処理を非同期で実行できるようにすることで、ユーザーはアプリをスムーズに操作し続けることができます。
反対の言葉で「同期処理」があります。これは処理が完了するまで次の処理には進まず、すべてを順番通りに実行する処理方法です。時間のかかる処理を同期的に行うと、アプリの応答が止まってしまいUXが低下してしまいます。
Dartにおける非同期プログラミングはFuture
クラスとStream
クラス、async
/await
キーワードなどによって制御することが可能になっています。
- Future・・・1回だけの非同期結果
- Stream・・・複数の非同期イベント(値・エラー・完了)
Futureクラス
Future
は未来(future)に取得できる非同期処理の結果を管理するためのオブジェクトです。使い方は関数の返り値をFuture<任意のデータ型>
で定義します。例えば以下は非同期にしたい処理(時間のかかる処理)ではなく同期的に実行しても問題ない処理を敢えてFuture
にしてみた場合でこの場合はFuture.value()
メソッドでレスポンスを行います。
時間のかかる処理の場合はasync
/await
キーワードを使用します。例えば擬似的に再現するためにFuture.delayed
を使用し遅延させてみます。async
はメソッド自体にawait
は時間のかかる処理に記述します。どれでもつけれるわけではなく戻り値がFuture
で定義されているメソッドで使用します。この場合はFuture<任意のデータ型>
で定義しているデータ型をそのまま返却します。
定義したfetchData
を呼び出すときも呼び出し側にasync
を付与し、await
を使用して呼び出します。
エラーハンドリング
Future
ではエラーをスローすることができます。エラーをスローする方法はthrow
で直接エラーを投げる方法とFuture.error()
を使用する2パターンあります。
呼び出し側でエラーハンドリングを行うためにはtry ~ catch
文を使用してエラーをキャッチします。
thenメソッド
非同期処理をawait
を使わずに結果後の処理をコールバックで記述できるのがthen
メソッドです。クロージャーから結果を取得でき、処理を記述することができ、呼び出し側でもasync
の付与が不要になります。
then
はメソッドチェーンで処理を連結させることも可能です。
catchErrorメソッド
then
で結果を取得する際のエラーハンドリングはcatchError
メソッドで行います。
waitメソッド
wait
メソッドは複数の非同期処理(返り値がFuture)を並列で実行し、すべての結果を待機して取得することができます。処理は並列に実行されるため、最も遅い非同期処理が完了したタイミングで結果を取得することができます。
wait
の引数にはIterable<Future>
型を返す処理を指定することができるるのでList
やSet
などを使用することが可能です。
forEachメソッド
forEach
メソッドは指定したコレクション要素の中身に対して非同期処理を繰り返し行うことができます。コレクションはIterable<T>
型で指定することができ、クロージャーの引数で各要素を順番に参照することができます。
delayedメソッド
delayed
は非同期処理内で遅延処理を行うメソッドです。引数にはDuration
型で遅延させたい時間を指定します。2つ目の引数には指定時間後に実行させたい処理を指定することもできます。
timeoutメソッド
timeout
は指定時間を超えたらタイムアウトさせるメソッドです。引数にはタイムアウトを設ける時間をDuration
型で指定します。タイムアウトするとTimeoutException
がスローされます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。