📖
【Flutter/Dart】ソースレビューしていてawait/unawaitedの使い方に疑問があったのでまとめてみました
✅ 本記事の目的
本記事は、Flutter/Dart
の「同期処理・非同期処理・並行処理(Isolate)」の違い、
そして await / unawaited
の正しい使い分けを理解するためのまとめです。
会話ベースで深掘りした内容を、記事としてそのまま使えるように整理しています。
1. 同期処理と非同期処理の違い
✅ 同期処理(Synchronous)
- コードが 上から下へ順番に実行される
- 処理が終わるまで次の行に進まない
- 時間のかかる処理を同期で行うと UI が固まる(フリーズ)
✅ 非同期処理(Asynchronous)
- 時間のかかる処理を待っている間も メインスレッドを止めない
- Dart の
async / awaitによって分かりやすく書ける - 実際には裏でイベントループが処理タイミングを管理している
2. 非同期処理の概念は言語によって違う?
✅ 結論:非同期処理の概念自体はどの言語でも同じ
- 「待ち時間中に他の処理を止めたくない」という目的は共通
- ただし実装方式(スレッド、イベントループ、Promise、Future)は言語で違う
3. Dart/Flutter の非同期処理はどう動く?
Flutter/Dart は基本 シングルスレッド(メイン Isolate) で動く。
✅ 非同期処理が動く場所
- 新しいスレッドは作らない
- メインスレッド上で、イベントループがタスクを調整して実行
✅ 同時に動いているように見える理由
非同期処理を「細切れにして同時に実行している」のではなく...
- 同期処理を実行
- イベントループが「今実行できる非同期タスク」を見つけて実行
- また同期処理に戻る
このように「高速で切り替えている」ため、並行して動いているように見える。
4. 並行処理(Isolate)とは?
✅ 並行処理=本当の意味で同時に動く処理
- 計算が重い処理は Isolate で実行する
- メモリ空間が分かれているため安全
- ただしメモリを多く消費しがち
5. 非同期処理 vs 並行処理(使い分け)
種類 目的 例
非同期処理 待ち時間中にメインスレッドを止めたくない ネットワーク通信、ファイル読み込み
並行処理(Isolate) 本当に同時並列で重い処理を動かしたい 大量データ処理、画像圧縮、重い計算
6. await と unawaited の違い
✅ await
- 処理が終わるまで 待つ
- 次の処理を進める前に結果が必要な場合に使用
例:単語帳ダウンロードが完了するまで待ちたい場合
await downloadWordbook();
✅ unawaited
- 処理を 待たずに裏で実行することを明示する
- 「待つ必要のない非同期処理」用
例:\
- GAイベント送信\
- Firestoreログ書き込み\
- 通知登録
など
unawaited(sendAnalyticsEvent());
7. unawaited の注意点:エラーがスルーされる
✅ なぜか?
- unawaited は「呼び出し側で待たない」ため\
- メソッド外では try/catch できない
✅ ではどうする?
メソッド内で try/catch するのが基本
Future<void> sendAnalyticsEvent() async {
try {
await analytics.logEvent(...);
} catch (e) {
// ログだけ残すなど
}
}
✅ unawaited を使うなら、内部で最低限のエラー処理を書くのが安全。
8. unawaited のエラーハンドリングは一般的か?
✅ 結論:ケースバイケース
- 重要な処理なら内部で try/catch を入れるべき
- ログ送信など失敗しても問題ない処理なら何もしないこともある
つまり一般的には...
unawaited は「失敗してもアプリに影響がないタスク」に使う
✅ まとめ
- Flutter/Dart
は基本シングルスレッドだが、非同期処理はイベントループで効率的に動く - 並行処理(Isolate)は重い処理で使う
- await は結果を待つ、unawaited は裏で実行して結果を待たない
- unawaited はエラーがスルーされやすいので、重要な処理はメソッド内で
try/catch が必要 - 記事として十分成り立つ内容!
お疲れ様でした 🙌
Discussion