こんにちは、テルプロです!
「非同期処理(Future/Stream)の使い方がわからない」とお悩みではないでしょうか?
本記事ではそんな悩みを解決していきます!
非同期処理とは
- ある処理の実行中に、他の処理を実行できるもの
- FutureとStreamの2種類がある
非同期処理を理解する上で、押さえておくべきポイントは上記の2点のみです。
では、詳しく解説していきます!
基本的な使い方
簡単解説
今回は「ある処理の実行中に他の処理を実行したい場合」を例に挙げます。
プログラムは基本的に上から順に読み込まれていきます。
基本的にはこれで問題ないのですが、「ネット上から情報を読み取る」などの重い処理がある場合に上から順に読み込まれていては、その処理が終わるまで他の画面が表示されないため、効率が悪くなってしまします。
このような場合に非同期処理は役に立ちます。
非同期処理を用いることで、上から順にプログラムを読み込みながらも、重たい処理などは個別で読み込んでいくという同時並行での読み込みをすることができます。
非同期処理は例のように、ある処理の実行中に他の処理を実行したいときに用います。
FutureとStreamの違い
Dart言語における非同期処理(Future/Stream)の違いは上記の通りです。
では、それぞれ詳しく解説していきます!
Future (単数データの非同期処理)
// 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を用いることで単数データの管理をできるようにしています。
本当なら「task1→task2→task3」と出力されるところ、task2とtask3が入れ替わって出力されています。
Futureは、単数データの非同期処理を行うことができます。
以上が、Futureの基本的な使い方です。
Stream(複数データの非同期処理)
import 'dart:async';
// コントローラーを用意
final streamController = StreamController<String>();
void main() {
// データが追加されるたびに、データを受け取る
streamController.stream.listen((addData){
print(addData);
});
// データを追加する
streamController.sink.add("赤そーめん");
streamController.sink.add("青そーめん");
streamController.sink.add("黄そーめん");
}
/*出力結果
赤そーめん
青そーめん
黄そーめん
*/
簡単解説
上記の例では、Streamを用いることで複数のデータを管理できるようにしています。
Streamは流しそーめんをイメージすると分かりやすいと思います。そーめん(データ)が流れてくる度に、そーめん(データ)をキャッチするようなイメージです。
Streamは、複数データの非同期処理を行うことができます。
以上が、Streamの基本的な使い方です。
まとめ
今回は【非同期処理】の概念や使い方を徹底解説しました。
解説の通り非同期処理は、ある処理の実行中に、他の処理を実行したい際に用いるものとなります。Dartの文法をしっかりと押さえて、開発の幅を広げていきましょう!
▼以下では、私が実際にFlutter学習に使用した厳選のUdemyの動画をご紹介してます!
ぜひ参考にしてみてください!
最後までご覧いただきありがとうございました。ではまた!