Dartのasync/awaitは、通信、ファイル読み込み、時間のかかる処理を順番に読みやすく書くための仕組みです。FlutterではAPI取得やFirebase処理でほぼ必ず使います。
この記事の結論
asyncは「この関数は非同期処理を含む」と宣言する印、awaitは「Futureの結果が返るまで待つ」ための印です。まずはFuture、async、await、try-catchの4つだけ押さえれば実装を始められます。
async/awaitとは何か
Dartでは、すぐに値が返らない処理をFutureで表します。asyncを付けた関数の中ではawaitが使えるようになり、Futureの結果を通常の値のように受け取れます。
Future<String> loadUserName() async {
await Future.delayed(const Duration(seconds: 1));
return "Sato";
}
基本の書き方
async関数を呼び出す側も、結果を待ちたい場合はawaitを使います。main関数でもasyncを付けられます。
Future<void> main() async {
final name = await loadUserName();
print("Hello, $name");
}
Futureとthenの関係
Futureは「あとで完了する処理の結果」を表す型です。async/awaitを使わずthen()で完了後の値を受け取ることもできますが、処理が増えるとネストしやすいため、実務ではasync/awaitの方が読みやすいことが多いです。
// then で受け取る書き方
loadUserName().then((name) {
print(name);
});
// await で受け取る書き方(同じ意味・こちらが読みやすい)
final name = await loadUserName();
print(name);
エラーをtry-catchで扱う
API通信では失敗が起きる前提で書きます。awaitしている処理が例外を投げた場合はtry-catchで受け取ります。
Future<void> main() async {
try {
final name = await loadUserName();
print(name);
} catch (error) {
print("読み込みに失敗しました: $error");
}
}
複数の非同期処理を待つ
順番に実行したい場合はawaitを並べます。同時に実行してまとめて待ちたい場合はFuture.waitを使います。
final results = await Future.wait([
loadUserName(),
loadUserName(),
]);
print(results);
Flutterで使うときの考え方
Flutterでは、ボタンを押したときにasync関数を呼び、開始時にローディング状態をtrue、完了時にfalseへ戻す形がよく使われます。UIの再描画にはsetStateや状態管理ライブラリを組み合わせます。
よくあるつまずき
- awaitを書けるのはasync関数の中だけ
- async関数は戻り値がFutureになる
- 通信処理ではtry-catchを省略しない
- UIでは待っている間のローディング表示を用意する
次に読む記事
- Dartのデータ型|int・double・String・bool・null安全を初心者向けに解説 — Dartの基本データ型を初心者向けに解説します。int、double、String、bool、List、Map、null安全、型推論の使い分けを確認します。
- Dartの文字列|Stringの作り方・埋め込み・改行・数値変換を解説 — DartのStringを初心者向けに解説します。文字列の作り方、変数埋め込み、複数行文字列、数値変換、FlutterのText表示で使う基本を整理します。
- flutter runの使い方|端末選択・起動確認・よくあるエラー — flutter runでFlutterアプリを起動する方法を解説します。デバイス確認、端末指定、ホットリロード、停止方法、失敗時の見方を整理します。
- Flutter初心者の学習順|環境構築からアプリ公開までのロードマップ — Flutter初心者向けに、学習順を環境構築、Dart基礎、UI、状態管理、API、Firebase、公開まで段階別に整理します。
まとめ
async/awaitは、Futureを読みやすく扱うための基本文法です。API取得やFirebase処理へ進む前に、await、try-catch、Future.waitを小さなコードで確認しておきましょう。