<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Stream</title>
	<atom:link href="https://techgrowup.net/tag/stream/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Wed, 09 Oct 2024 06:52:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>Stream</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門44 DartでのStreamの作成方法を解説：リアルタイムデータ処理を効率化しよう</title>
		<link>https://techgrowup.net/flutter-dart-stream/</link>
					<comments>https://techgrowup.net/flutter-dart-stream/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Wed, 09 Oct 2024 06:52:09 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Stream]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1942</guid>

					<description><![CDATA[はじめに DartのStreamは、非同期データのフローを処理するための強力なツールです。データが逐次的に流れる場合（リアルタイムデータ、イベント処理、ネットワーク通信など）、Streamを使うことで効率的にデータを扱う [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph"><strong>DartのStream</strong>は、非同期データのフローを処理するための強力なツールです。データが逐次的に流れる場合（リアルタイムデータ、イベント処理、ネットワーク通信など）、Streamを使うことで効率的にデータを扱うことができます。Streamは、リスナーに対してデータやエラーを非同期に提供し、リアルタイムアプリケーションで頻繁に利用されます。</p>



<p class="wp-block-paragraph">この記事では、<a rel="noopener" target="_blank" href="https://dart.dev/libraries/async/creating-streams">Dart公式ドキュメント<span class="fa fa-external-link external-icon anchor-icon"></span></a>を基に、<strong>Streamの作成方法</strong>や<strong>使い方の基本から応用例</strong>までを解説します。Flutterアプリケーションでも活用できるStreamの使い方をマスターし、効率的なリアルタイムデータ処理を実現しましょう。</p>



<h2 class="wp-block-heading">Streamとは</h2>



<p class="wp-block-paragraph"><strong>Stream</strong>は、非同期に一連のデータを受信するためのDartのデータ型です。データはイベントの形で連続的に提供され、各イベントがリスナーによって処理されます。Streamを使用することで、データのリアルタイム処理や非同期処理を効率的に行うことができます。</p>



<h3 class="wp-block-heading">Streamの主な特徴</h3>



<ul class="wp-block-list">
<li><strong>非同期データの処理</strong>：非同期に到着するデータをリアルタイムで処理します。</li>



<li><strong>リスナーを設定可能</strong>：複数のリスナーがStreamのデータを受け取ることができます。</li>



<li>単一購読（Single subscription）とブロードキャスト（Broadcast）の2つのモードをサポート。</li>
</ul>



<h2 class="wp-block-heading">Streamの作成方法</h2>



<p class="wp-block-paragraph">Dartでは、Streamを作成する方法がいくつかあります。以下のセクションで、それぞれの方法について詳しく説明します。</p>



<h3 class="wp-block-heading">1. StreamControllerを使ったStreamの作成</h3>



<p class="wp-block-paragraph"><code>StreamController</code>を使うことで、Streamにデータを追加したり、リスナーに通知を送ることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'dart:async';

void main() {
  // StreamControllerの作成
  final controller = StreamController&lt;int&gt;();

  // リスナーを追加
  controller.stream.listen((data) {
    print('Received: $data');
  });

  // データをストリームに追加
  controller.add(1);
  controller.add(2);
  controller.add(3);

  // StreamControllerを閉じる
  controller.close();
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;dart:async&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// StreamControllerの作成</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> controller = </span><span style="color: #4EC9B0">StreamController</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// リスナーを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.stream.</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">((data) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Received: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// データをストリームに追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// StreamControllerを閉じる</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">close</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong><code>StreamController</code></strong>：Streamを作成するためのコントローラー。<code>add</code>メソッドを使ってデータを追加できます。</li>



<li><strong><code>controller.stream.listen</code></strong>：リスナーを追加し、Streamからデータを受信します。</li>
</ul>



<h3 class="wp-block-heading">2. 非同期ジェネレーター（async*）を使ったStreamの作成</h3>



<p class="wp-block-paragraph"><code>async*</code>と<code>yield</code>を使うことで、非同期にデータを生成するStreamを簡単に作成できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Stream&lt;int&gt; countStream(int max) async* {
  for (int i = 1; i &lt;= max; i++) {
    // 非同期で値を出力
    yield i;
    await Future.delayed(Duration(seconds: 1)); // 1秒待機
  }
}

void main() {
  // 非同期ジェネレーターで生成したStreamをリスン
  countStream(5).listen((data) {
    print('Received: $data');
  });
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Stream</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">countStream</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> max) </span><span style="color: #C586C0">async</span><span style="color: #D4D4D4">* {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> i = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">; i &lt;= max; i++) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// 非同期で値を出力</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">yield</span><span style="color: #D4D4D4"> i;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Future</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">delayed</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)); </span><span style="color: #6A9955">// 1秒待機</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 非同期ジェネレーターで生成したStreamをリスン</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">countStream</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">((data) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Received: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong><code>async*</code>と<code>yield</code></strong>：非同期にデータを順次出力するために使用します。</li>



<li><strong><code>await Future.delayed</code></strong>：データを出力する前に1秒の遅延を設定。</li>
</ul>



<p class="wp-block-paragraph">ちなみにasync/awaitについては以下の記事で書いていますので、良かったら見てみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/flutter-dart-async-await/" title="Flutter開発入門43 DartのAsync/Awaitを解説：非同期処理でパフォーマンスを最大化する方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-160x90.webp 160w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-1024x585.webp 1024w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-768x439.webp 768w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-120x68.webp 120w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-320x180.webp 320w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await-376x212.webp 376w, https://techgrowup.net/wp-content/uploads/2024/10/flutter-dart-async-await.webp 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Flutter開発入門43 DartのAsync/Awaitを解説：非同期処理でパフォーマンスを最大化する方法</div><div class="blogcard-snippet internal-blogcard-snippet">Dartのasync/awaitを使って、非同期処理をシンプルかつ効率的に実装する方法を解説。基本から応用、エラーハンドリングまで徹底的に紹介し、Flutter開発でも役立つ知識を提供します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.08</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading">3. Stream.periodicを使ったStreamの作成</h3>



<p class="wp-block-paragraph"><code>Stream.periodic</code>を使うと、指定した間隔でデータを生成するStreamを作成できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void main() {
  // 1秒ごとにデータを生成するStream
  final periodicStream = Stream&lt;int&gt;.periodic(
    Duration(seconds: 1),
    (count) =&gt; count,
  );

  // リスナーを追加してデータを受信
  final subscription = periodicStream.listen((data) {
    print('Periodic data: $data');
  });

  // 5秒後にストリームをキャンセル
  Future.delayed(Duration(seconds: 5), () {
    subscription.cancel();
    print('Stream cancelled');
  });
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 1秒ごとにデータを生成するStream</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> periodicStream = </span><span style="color: #4EC9B0">Stream</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;.</span><span style="color: #DCDCAA">periodic</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    (count) =&gt; count,</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// リスナーを追加してデータを受信</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> subscription = periodicStream.</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">((data) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Periodic data: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 5秒後にストリームをキャンセル</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Future</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">delayed</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">), () {</span></span>
<span class="line"><span style="color: #D4D4D4">    subscription.</span><span style="color: #DCDCAA">cancel</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Stream cancelled&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong><code>Stream.periodic</code></strong>：一定の間隔でデータを生成するためのStream。</li>



<li><strong><code>subscription.cancel</code></strong>：Streamの購読をキャンセルするためのメソッド。</li>
</ul>



<h2 class="wp-block-heading">Streamのタイプ</h2>



<h3 class="wp-block-heading">1. 単一購読のStream（Single-subscription Stream）</h3>



<p class="wp-block-paragraph">単一購読のStreamは、一度に1つのリスナーのみが購読できます。通常、ファイル読み込みやHTTPリクエストの結果を処理する場合に使用されます。</p>



<h3 class="wp-block-heading">2. ブロードキャストのStream（Broadcast Stream）</h3>



<p class="wp-block-paragraph">ブロードキャストStreamは、複数のリスナーが同時に購読できるStreamです。イベントの通知など、複数のリスナーにデータを送る場合に適しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void main() {
  // ブロードキャストStreamの作成
  final controller = StreamController&lt;int&gt;.broadcast();

  // 複数のリスナーを追加
  controller.stream.listen((data) {
    print('Listener 1: $data');
  });

  controller.stream.listen((data) {
    print('Listener 2: $data');
  });

  // データをストリームに追加
  controller.add(1);
  controller.add(2);
  controller.add(3);

  // StreamControllerを閉じる
  controller.close();
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// ブロードキャストStreamの作成</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> controller = </span><span style="color: #4EC9B0">StreamController</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;.</span><span style="color: #DCDCAA">broadcast</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// 複数のリスナーを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.stream.</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">((data) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Listener 1: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  controller.stream.</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">((data) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Listener 2: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// データをストリームに追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// StreamControllerを閉じる</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">close</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong><code>StreamController&lt;int>.broadcast</code></strong>：ブロードキャストモードのStreamを作成します。</li>



<li>複数のリスナーが同時にデータを受信可能。</li>
</ul>



<h2 class="wp-block-heading">Streamのエラーハンドリング</h2>



<p class="wp-block-paragraph">Streamを使う際には、エラーが発生する可能性があります。<code>onError</code>を使ってエラーを処理することができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'dart:async';

void main() {
  final controller = StreamController&lt;int&gt;();

  controller.stream.listen(
    (data) {
      print('Received: $data');
    },
    onError: (error) {
      print('Error occurred: $error');
    },
    onDone: () {
      print('Stream closed');
    },
  );

  // データを追加
  controller.add(1);
  controller.addError('This is an error'); // エラーを追加
  controller.add(3);

  // ストリームを閉じる
  controller.close();
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;dart:async&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> controller = </span><span style="color: #4EC9B0">StreamController</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  controller.stream.</span><span style="color: #DCDCAA">listen</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    (data) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Received: $</span><span style="color: #9CDCFE">data</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">    onError: (error) {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Error occurred: $</span><span style="color: #9CDCFE">error</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">    onDone: () {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Stream closed&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">  );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// データを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">addError</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;This is an error&#39;</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// エラーを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">add</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// ストリームを閉じる</span></span>
<span class="line"><span style="color: #D4D4D4">  controller.</span><span style="color: #DCDCAA">close</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong><code>addError</code></strong>：Streamにエラーを送信するメソッド。</li>



<li><strong><code>onError</code></strong>：エラーハンドリング用のコールバック。</li>
</ul>



<h2 class="wp-block-heading">Streamのベストプラクティス</h2>



<ol class="wp-block-list">
<li><strong>リソースの管理</strong>
<ul class="wp-block-list">
<li>Streamを使う際には、<code>StreamController</code>を適切に閉じる（<code>close</code>メソッドを呼ぶ）ことが重要です。これにより、リソースリークを防ぎます。</li>
</ul>
</li>



<li><strong>Streamのキャンセル</strong>
<ul class="wp-block-list">
<li>購読を終了したい場合には、<code>cancel</code>メソッドを使ってStreamの購読をキャンセルすることが推奨されます。特にブロードキャストStreamでは、購読のキャンセルが必要です。</li>
</ul>
</li>



<li><strong>エラーハンドリングを徹底する</strong>
<ul class="wp-block-list">
<li>Streamを使用する際には、常にエラーハンドリングを行い、予期しないエラーがアプリケーション全体に影響を与えないようにしましょう。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Dartの<strong>Stream</strong>を活用することで、非同期データの処理やリアルタイムアプリケーションの開発が容易になります。Streamを使うと、データのフローを管理しやすく、リスナーを設定することで効率的にデータを処理できます。また、非同期ジェネレーターや<code>Stream.periodic</code>を使って簡単に非同期データを生成できるため、様々なシチュエーションに対応可能です。</p>



<p class="wp-block-paragraph">この記事を参考にして、DartのStreamを活用してリアルタイム処理を効率化し、Flutterアプリケーションのパフォーマンスを向上させましょう！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-dart-stream/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-05-24 06:33:43 by W3 Total Cache
-->