😸

[Flutter]FutureとStreamの違いの個人的まとめ

2022/09/05に公開

公式記事
参考記事
参考記事
参考記事

同期・非同期処理のおさらいと確認

いつも参考に見させていただいている記事がこちら

  • 同期処理:「直列」に処理をこなす。処理が一列に並んでる感じ。
  • 非同期処理:「並列」に処理をこなす。同時並行での読み込みができ、他の処理を待つ必要がない。

これらを踏まえてFutureとStreamについて考える

Futureとは

  • 単数データの非同期処理 を実装する時に使う

単数データ、とは

  • 値が細かく変化せず返り値が一つで変わらないデータ
main.dart
// task1〜3を出力する
void main() {
  task1();
  task2();
  task3();
}

// task1の内容
void task1() => print("task 1 complete");

// task2の内容(2秒後に出力されるように設定している)
Future<void> task2() async {
  Future<String> future =
      Future.delayed(Duration(seconds: 2), () => "task 2 complete");
  String value = await future;
  print(value);
}

// task3の内容
void task3() => print("task 3 complete");

/*出力結果 
task 1 complete
task 3 complete
task 2 complete
全部、値を変更されたりしてる訳ではない時、Future
*/

returnやprintで出力するのが断続的には変わらず、一個限りである。

Streamとは

  • 複数データの非同期処理 を実装する時に使う

複数データ、とは

  • 値がどんどん変化し、返り値が断続的に送られてくるデータ
main.dart
import 'dart:async';

// コントローラーを用意
final streamController = StreamController<String>();

void main() {
 // データが追加されるたびに、データを受け取る
  streamController.stream.listen((addData){
    print(addData);
  });

 // データを追加する
  streamController.sink.add("赤そーめん");
  streamController.sink.add("青そーめん");
  streamController.sink.add("黄そーめん");

}

/*出力結果 
赤そーめん
青そーめん
黄そーめん

全部、addメソッドによって値変更や値追加でのデータ。こんな感じでデータの変化を追うときにStream
*/

returnやprintで出力するのが断続的には変わり、変化し続ける。データを更新したり追加したりするたびに出力が増えていったりするから。

FutureとStreamの違い

  • Futureは一度その関数を実行すれば返り値は一つ。よって一つの結果しか出ないので変数の変化を追う、ということはできない。

  • 一方Streamデータの流れを作る(どんどん値を運ぶ)ため、変数の変化を追うことができる

データを扱う際のまとめ表

それぞれの特性を活かしたBuilder関数の考察

  • Future関数を用いるFutureBuilderは一度だけデータを取得する、という点から画面を構築する、という処理が得意。

  • 一方で、Stream関数を用いるStreamBuilderは、データを監視し続け(変化を追い続け)、変化するデータごとに毎回画面を更新する、という処理が得意。例:リアルタイムのチャットアプリとか、スポーツ速報とかもそうだな。

(Stream:リアタイ性が高い時に細かい変化を追えるチャット画面向き Future:細かい変化というよりも画面構築など細かい変更の少ない画面の構築向き)



以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏

addとか(ゲッターメソッド?いうのかな)でデータを追加したりして画面の値変更が多いならStreamを使えって感じなんかな。

GitHubで編集を提案

Discussion