👥

【Flutter/dart】Stream

2022/09/11に公開

はじめに

FireBaseとか記事にしようかなって思いましたが、書き始めると長くなりそうだったので今回はStreamにしました。
次の連休あたりに記事を書こうかなって思ったり、思わなかったりです。(ちょっと、gcpのデプロイコマンドが気になっているのでそのあたりにしようかと迷っています。)

てなわけで内容

概要

とりあえず、以下の2つの記事あたりを読めば大体わかります。

https://dart.dev/tutorials/language/streams

https://dart.dev/articles/libraries/creating-streams#using-a-streamcontroller

リアルタイムにデータを取得する場合とかに使ったりします。
ひとえにStreamと言っても実はIterable (同期実行)Stream (非同期実行)の2種類がある。

同期は触れないので詳しい内容は、Google先生か以下を参考にしてほしい。

https://dart.dev/codelabs/iterables

ビデオ

https://www.youtube.com/watch?v=nQBpOIHE4eE&t=48s

内容

以下で、1秒間に一回数字をカウントアップする処理を実装しています。

counter_stream.dart
class Counter {
  // Streamの場合は、asyncの後に*がつきます。
  Stream<int> counterSync() async* {
    int count = 0;

    for (var i = 0; i < 80; ++i) {
      count = await _counter(count);
      yield count; // Stream型の場合はreturnではなくて、yieldを使います。
    }
  }

  Future<int> _counter(int count) async {
    await Future.delayed(const Duration(seconds: 1));
    return count + 1;
  }
}

作成したStreamクラスを使って、画面のコントロールを行います。

counter_page.dart
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:stream_test/streamer.dart';

class AutoCounterPage extends StatefulWidget {
  const AutoCounterPage({
    super.key,
    required this.counter,
  });

  final Counter counter;

  
  State<AutoCounterPage> createState() => _AutoCounterPageState();
}

class _AutoCounterPageState extends State<AutoCounterPage> {
  int _count = 0;
  late StreamSubscription _streaming;

  
  void initState() {
    super.initState();
    _streaming = widget.counter.counterSync().listen((event) {
      if (mounted) {
        setState(() {
          _count = event;
        });
      }
    });
  }

  
  void dispose() {
    _streaming.cancel();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
  ・・・・・

やってみて

使い所としては、複数にまたがる画面に対してこのクラスを継承して各画面に通知するって感じかな。
まぁ、他に色々あるけど。(Blocの更新内容を他の画面に通知したりとか)

使って見るとかなり便利なので、試しに使ってみてもらえればと思います。

Discussion