📖

【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. awaitunawaited の違い

✅ 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