FlutterとDartの非同期処理を完全解説!Future・async/awaitを初心者向けにわかりやすく解説
生徒
「Flutterアプリを作っているときに、データの読み込み中に画面が止まってしまいました。どうすればいいですか?」
先生
「それはDartの非同期処理を使っていない可能性があります。FlutterではFutureやasync/awaitを使って、処理を待ちながらも画面を止めない仕組みを作ります。」
生徒
「非同期処理って難しそうですが、初心者でも理解できますか?」
先生
「仕組みから順番に理解すれば大丈夫です。Flutter開発では必須の知識なので、基礎から丁寧に学んでいきましょう。」
1. Dartの非同期処理とは何か
Dartの非同期処理とは、時間のかかる処理を実行している間もアプリの動作を止めないための仕組みです。Flutterアプリ開発では、API通信やデータベースアクセス、ファイル読み込みなどが頻繁に発生します。これらを通常の同期処理で書くと、処理が終わるまで画面が固まってしまいます。
そこで使われるのがFutureとasync/awaitです。Dart言語では、時間のかかる処理をFuture型として扱い、結果が返ってくるまで待つ仕組みを提供しています。Flutterの非同期処理を理解することは、実用的なアプリ開発に直結します。
2. Futureとは何かをわかりやすく解説
Futureとは、これから値が返ってくる予定を表すオブジェクトです。今すぐには結果が出ないが、将来的に結果が返る処理を表現します。例えばサーバー通信は数秒かかる場合があります。その間、アプリを止めないためにFutureを使います。
Future<String> fetchMessage() {
return Future.delayed(
Duration(seconds: 2),
() => "データ取得完了",
);
}
void main() {
fetchMessage().then((value) {
print(value);
});
}
このコードでは、二秒後に文字列を返しています。thenメソッドは、Futureの結果を受け取るための仕組みです。FlutterとDartの非同期処理では、このFutureの理解が第一歩です。
3. asyncとawaitの基本的な使い方
thenを使う方法もありますが、より読みやすく書けるのがasyncとawaitです。Flutter初心者にはこちらの書き方がおすすめです。asyncは非同期関数であることを示し、awaitは結果が返るまで待つという意味になります。
Future<String> fetchUser() async {
await Future.delayed(Duration(seconds: 2));
return "ユーザー情報取得";
}
void main() async {
String result = await fetchUser();
print(result);
}
awaitを使うことで、同期処理のように上から順番に読めるコードになります。Flutter開発ではAPI通信処理をこの形で書くことが非常に多いです。
Flutterを「実務レベル」で使えるようになりたい人や、 iPhone / Android両対応アプリ開発の流れをまとめて学びたい人には、 定番の実践書がこちらです。
Flutter実践開発をAmazonで見る※ Amazon広告リンク
4. Flutterでの非同期処理の実例
Flutterアプリでは、ボタンを押したときにデータを取得する場面がよくあります。例えば、非同期処理で値を取得して画面に表示する例を見てみましょう。
import 'package:flutter/material.dart';
class SamplePage extends StatelessWidget {
Future<String> loadData() async {
await Future.delayed(Duration(seconds: 2));
return "読み込み完了";
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("非同期処理サンプル")),
body: Center(
child: ElevatedButton(
onPressed: () async {
String data = await loadData();
print(data);
},
child: Text("データ取得"),
),
),
);
}
}
このように、FlutterとDartの非同期処理を使えば、ボタン操作中もアプリはフリーズしません。モバイルアプリ開発では必須のテクニックです。
5. Futureのエラーハンドリング
非同期処理ではエラー処理も重要です。通信エラーや例外が発生する可能性があるため、tryとcatchを使います。Flutterの実務開発ではこの書き方が標準的です。
Future<String> fetchData() async {
try {
await Future.delayed(Duration(seconds: 1));
throw Exception("通信エラー");
} catch (e) {
return "エラー発生";
}
}
void main() async {
String result = await fetchData();
print(result);
}
このように書くことで、アプリが強制終了するのを防げます。Dartの非同期処理ではエラーハンドリングも必ずセットで覚えましょう。
6. Futureとasync/awaitの違いと使い分け
Future.thenを使う方法とasync/awaitを使う方法は、内部的には同じ仕組みです。しかし可読性の面ではasync/awaitが優れています。Flutter初心者はまずasync/awaitに慣れることが大切です。
一方で、複数の非同期処理を同時に実行する場合はFuture.waitも便利です。非同期処理の理解が深まると、より高度なFlutterアプリ開発が可能になります。
7. 非同期処理を理解するための考え方
非同期処理を難しく感じる理由は、処理の順番が直感と異なるためです。大切なのは、時間のかかる処理はFutureとして扱われるという点です。FlutterとDartでは、UIスレッドを止めない設計が重要です。
Flutter開発初心者は、まずFutureの概念を理解し、次にasync/awaitの書き方を覚え、最後にエラー処理を組み合わせる流れで学習すると効率的です。これが理解できれば、API通信やFirebase連携など実践的な開発にも対応できます。
まとめ
今回はFlutterとDartにおける非同期処理の基本から実践までを丁寧に解説しました。Flutterアプリ開発では、API通信、データベースアクセス、ファイル読み込み、Firebase連携など、時間のかかる処理が必ず登場します。その際に重要になるのがFuture、async、awaitというDartの非同期処理の仕組みです。
非同期処理とは、時間のかかる処理を実行している間も、アプリの画面表示やユーザー操作を止めないための仕組みです。もし同期処理でAPI通信を実装してしまうと、データ取得が完了するまで画面が固まり、ユーザー体験が大きく損なわれます。Flutter開発ではUIスレッドを止めない設計が非常に重要であり、その中心となるのがDartのFutureとasync awaitです。
Futureは、将来的に値が返ってくる予定を表すオブジェクトです。まだ結果は出ていないが、後で結果が取得できる処理を表現します。Futureを理解することが、Dart非同期処理の第一歩です。そしてasyncキーワードを付けた関数の中でawaitを使うことで、非同期処理をまるで同期処理のように読みやすく書くことができます。これによりコードの可読性が向上し、Flutter初心者でも安全に非同期処理を実装できます。
また、非同期処理ではエラーハンドリングも欠かせません。通信エラーや例外が発生した場合に備えて、try catch構文を使用することが実務開発では必須です。エラー処理を組み込むことで、Flutterアプリの強制終了を防ぎ、安定したモバイルアプリ開発が可能になります。
さらに、複数の非同期処理を同時に実行したい場合はFuture.waitを使う方法もあります。例えば複数のAPIを並列で呼び出す場合などに活用できます。FlutterとDartの非同期処理を正しく理解すれば、高速で快適なアプリケーション設計ができるようになります。
非同期処理を理解するためのポイントは、時間のかかる処理は必ずFutureとして扱われるという意識を持つことです。そしてasync awaitを使うことで、処理の流れを直感的に把握できます。Flutterアプリ開発初心者は、まずFutureの概念を理解し、次にasync awaitの書き方に慣れ、最後にエラーハンドリングを確実に身につける流れで学習することが大切です。
非同期処理の総合サンプルコード
Future<String> fetchProfile() async {
try {
await Future.delayed(Duration(seconds: 2));
return "プロフィール取得成功";
} catch (e) {
return "プロフィール取得失敗";
}
}
Future<String> fetchSettings() async {
await Future.delayed(Duration(seconds: 1));
return "設定取得成功";
}
Future<void> loadAll() async {
List<String> results = await Future.wait([
fetchProfile(),
fetchSettings(),
]);
for (var result in results) {
print(result);
}
}
void main() async {
await loadAll();
}
上記のサンプルでは、Future waitを使って複数の非同期処理を並列実行しています。Flutter開発ではこのような書き方が頻繁に登場します。API通信やクラウド連携、ローカルデータ取得など、実践的なモバイルアプリ開発に直結する重要な技術です。
実行結果
プロフィール取得成功
設定取得成功
生徒
FlutterとDartの非同期処理について理解が深まりました。Futureは将来の結果を表すもので、asyncとawaitを使うと読みやすく書けるのですね。
先生
その通りです。Flutterアプリ開発ではAPI通信やデータ取得が必ずあります。非同期処理を正しく理解することで、画面を止めない快適なアプリが作れます。
生徒
try catchを使ったエラーハンドリングも重要だと分かりました。実務では必須ですね。
先生
はい。さらにFuture waitを使えば複数の非同期処理を同時に実行できます。FlutterとDartの非同期処理を理解すれば、より高度なモバイルアプリ開発やクラウド連携にも対応できます。
生徒
これでFlutterの非同期処理に自信が持てそうです。Futureとasync awaitを繰り返し練習して、実践的なアプリを作ってみます。
先生
素晴らしい姿勢です。非同期処理はFlutter開発の基礎であり、最重要スキルの一つです。継続して学習を進めていきましょう。