Monday, October 30, 2023

FlutterでFutureとFutureOrを使った非同期プログラミングのテクニック

目次

第1章 Flutterにおける非同期プログラミング

非同期プログラミングは、今日のアプリ開発には欠かせない要素です。ユーザーエクスペリエンスの改善、アプリのレスポンシブ性の維持、複雑なタスクのバックグラウンド実行などに理想的です。Dart言語とFlutterフレームワークは、この非同期処理のための様々なツールを提供しています。

Dart言語は、非同期計算を簡単に処理できるFutureという組み込みクラスを持っています。Futureは、値が「将来的に」利用可能になるという約束を表しています。この値は、まだ計算されていないか、すぐには利用できない可能性があります。

Flutterも、UIの構成と管理にDartのFutureクラスを活用しています。例えば、ネットワーク呼び出しでデータを取得する場合、結果に応じてUIを更新するまで待機するといった処理ができます。

この章では、Flutterで使用される非同期プログラミング手法について説明し、次の章ではFutureとセットで登場するFutureOrについて詳しく説明します。

上に戻る

第2章 FlutterのFutureを理解する

Flutterにおける非同期プログラミングを理解する上で重要な概念の1つが「Future」です。FutureはDart言語の中核的なクラスで、結果が「将来的に」利用可能になるという約束を表現します。

例えば、サーバーからデータを要求する場合、即座に応答が返されるわけではありません。Futureを使用することで、応答を待ちながら他の処理を並行して進めることができます。つまり、アプリのレスポンシブ性を維持できるのです。


Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 5)); 
  return 'Hello, World!';
}  

上のコードは、5秒待機した後に「Hello, World!」の文字列を返す非同期関数です。関数の戻り値はFuture<String>と宣言されており、これは将来的にString値が返されることを示しています。

しかし、関数が失敗したりエラーが発生して適切に値が返せない場合はどうなるでしょうか。または、関数が複数の値を返す必要がある場合はどう処理すれば良いのでしょうか。

これらの疑問への答えは、次の「FutureOr」の章で見出すことができます。

上に戻る

第3章 FutureOrの登場

FutureはDart言語において、非同期処理を表現するのに非常に便利なツールです。しかし、時には関数がFuture<T>かT型の値を直接返す必要がある状況が発生します。このために登場したのが「FutureOr」です。

FutureOr<T>は、T型の値を直接返したり、将来的にT型の値を返すFuture<T>を返すことができます。これにより、関数が同期的に即座に結果を返したり、非同期的に後で結果を返す場合の両方を処理できるようになります。


void printString(FutureOr<String> value) {
  if (value is Future<String>) {
    value.then((str) => print(str));
  } else if (value is String) {
    print(value);
  }
}

上のコードは、Future<String>かStringのどちらかを入力値として受け取り、コンソールに出力する関数です。入力値がFutureの場合、then()メソッドを使用してそのFutureが完了するまで待ち、結果を出力します。

このように、Flutterは「Future」と「FutureOr」を活用して、複雑な非同期処理をよりシンプルかつ効率的に扱うことができるのです。次の章では、これらの実際の使用例を見ていきましょう。

上に戻る

第4章 実例を通してFutureとFutureOrの活用を学ぶ

この章では、実際のFlutterアプリケーションにおけるFutureとFutureOrの活用方法を見ていきます。

例として、ネットワークAPI呼び出しによってデータを取得するタスクを考えてみましょう。この作業は時間のかかる非同期処理となります。また、APIの結果に基づいてアプリのUIを更新する必要があります。


Future<String> fetchDataFromNetwork() async {
  await Future.delayed(Duration(seconds: 5)); // ネットワーク遅延を想定
  return 'Data from network';  
}

void updateUI(FutureOr<String> data) {
  if (data is Future) {
    data.then((value) => print('Update UI with $value'));
  } else if (data is String) {
    print('Update UI with $data');
  }
}

void main() {
  var data = fetchDataFromNetwork();
  updateUI(data); 
}

上のコードでは、「fetchDataFromNetwork」関数が非同期的にネットワークからデータを取得しています。この関数が返す値は「Future<String>」です。次に、「updateUI」関数がこの値を受け取ってUIを更新しています。

「updateUI」関数のパラメータの型は「FutureOr<String>」です。つまり、直接文字列を受け取ることも、将来的に文字列を返すFutureを受け取ることもできます。パラメータがFutureの場合、then()メソッドを使用してその処理が完了するまで待ち、結果でUIを更新します。

このように、API呼び出しによるデータ取得のタスクは時間のかかる非同期処理です。FutureとFutureOrを適切に利用することで、データ取得中にUIの操作をブロックすることなく、取得完了後に必要なUI更新を実行できます。

上に戻る

まとめ FutureとFutureOrは非同期プログラミングの最高のツール

非同期プログラミングは、今日のアプリ開発における必須の要素です。DartとFlutterは、FutureやFutureOrなどの高機能なツールをこのために提供しています。

Futureは、「将来的に」値を返す演算を表現し、時間のかかるタスクを処理しながらアプリのレスポンシブ性を維持できます。また、FutureOrを使えば、関数が同期的に即座に結果を返したり、非同期的に後で結果を返す場合の両方を処理できます。

Flutterで効果的な非同期プログラミングを実装する方法を見てきました。これらの手法は、複雑な非同期ロジックを簡略化し、コードの可読性を向上させるのに大いに役立ちます。

上に戻る

0 개의 댓글:

Post a Comment