<?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>Pattern</title>
	<atom:link href="https://techgrowup.net/tag/pattern/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Mon, 14 Oct 2024 03:36:09 +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>Pattern</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門49 Providerパターンを使ったシンプルな状態管理</title>
		<link>https://techgrowup.net/flutter-provider-pattern/</link>
					<comments>https://techgrowup.net/flutter-provider-pattern/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 14 Oct 2024 03:36:08 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Provider]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1964</guid>

					<description><![CDATA[はじめに Flutterでアプリケーションを開発する際、状態管理は避けて通れない課題です。特に規模が大きくなるアプリでは、効率的に状態を管理し、UIとビジネスロジックを分離する設計が重要になります。そこで登場するのがPr [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">Flutterでアプリケーションを開発する際、<strong>状態管理</strong>は避けて通れない課題です。特に規模が大きくなるアプリでは、効率的に状態を管理し、UIとビジネスロジックを分離する設計が重要になります。そこで登場するのが<strong>Providerパターン</strong>です。Flutterの<code>Provider</code>パッケージは、公式が推奨する状態管理の方法で、シンプルでありながら強力です。</p>



<p class="wp-block-paragraph">この記事では、Flutterの公式ドキュメントに基づき、<strong>Providerパターンによるシンプルな状態管理</strong>について解説します。初めてFlutterで状態管理を学ぶ方にも理解しやすいように、基本的な概念から実際のコード例まで紹介します。</p>



<h2 class="wp-block-heading">Providerパターンとは</h2>



<p class="wp-block-paragraph"><strong>Providerパターン</strong>は、Flutterでの状態管理を簡潔かつ効率的に行うための設計パターンです。<code>Provider</code>は依存性注入の仕組みを提供し、<strong>データの共有とUIの更新</strong>を容易にします。特に、状態が変わるたびにUIをリビルドする必要がある場合に便利です。</p>



<h3 class="wp-block-heading">Providerパターンの主な特徴</h3>



<ul class="wp-block-list">
<li><strong>簡単な実装</strong>：シンプルなAPIで、状態管理を導入しやすい。</li>



<li><strong>依存関係の注入</strong>：データを必要な場所に簡単に渡すことができる。</li>



<li><strong>自動的なUIの更新</strong>：状態が変わった時点で、必要なウィジェットのみが再レンダリングされる。</li>



<li><strong>グローバルに状態を共有</strong>：状態をどこからでもアクセス可能にし、コードの再利用性が向上。</li>
</ul>



<h2 class="wp-block-heading">Providerパターンの基本的な使い方</h2>



<h3 class="wp-block-heading">1. セットアップ</h3>



<p class="wp-block-paragraph">まず、<code>pubspec.yaml</code>ファイルに<code>provider</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="dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0" 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">dependencies</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">flutter</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">sdk</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">flutter</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">provider</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">^6.0.0</span></span></code></pre></div>



<p class="wp-block-paragraph">その後、依存関係をインストールします。</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="flutter pub get" 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: #DCDCAA">flutter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pub</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span></span></code></pre></div>



<h3 class="wp-block-heading">2. Providerの構造</h3>



<p class="wp-block-paragraph">Providerパターンでは、状態を管理するクラスと、そのクラスを使ってUIを更新する流れが基本です。大まかな構造は以下の通りです。</p>



<ul class="wp-block-list">
<li><strong>モデルクラス</strong>：状態を保持し、更新するメソッドを持つクラス。</li>



<li><strong>ChangeNotifier</strong>：状態の変更をリスナーに通知するためのクラス。モデルクラスは<code>ChangeNotifier</code>を継承します。</li>



<li><strong>Consumerウィジェット</strong>：状態を監視し、UIを更新するために使われるウィジェット。</li>
</ul>



<h2 class="wp-block-heading">シンプルなカウンターアプリの例</h2>



<h3 class="wp-block-heading">1. モデルクラスの作成</h3>



<p class="wp-block-paragraph">まずは、状態を管理するためのモデルクラスを作成します。このクラスでは、カウンターの値を保持し、値を増加させるメソッドを定義します。</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 'package:flutter/foundation.dart';

class CounterModel with ChangeNotifier {
  int _count = 0;

  int get count =&gt; _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}" 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;package:flutter/foundation.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CounterModel</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ChangeNotifier</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> _count = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4"> count =&gt; _count;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">increment</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    _count++;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">notifyListeners</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>ChangeNotifier</strong>：<code>with ChangeNotifier</code>を使うことで、リスナーに状態の変更を通知できます。</li>



<li><strong>notifyListeners()</strong>：状態が変更されたことを通知し、UIが自動的に更新される仕組みを提供します。</li>
</ul>



<h3 class="wp-block-heading">2. Providerを使ったウィジェットの構築</h3>



<p class="wp-block-paragraph">次に、<code>Provider</code>を使ってアプリケーション全体でこのモデルクラスを提供します。<code>Provider</code>で状態をラップし、<code>Consumer</code>ウィジェットを使ってUIを更新します。</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 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart'; // モデルクラスをインポート

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) =&gt; CounterModel(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter App with Provider')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('You have pushed the button this many times:'),
            Consumer&lt;CounterModel&gt;(
              builder: (context, counter, child) {
                return Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.bodySmall,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Provider.of&lt;CounterModel&gt;(context, listen: false).increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}" 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;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:provider/provider.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;counter_model.dart&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// モデルクラスをインポート</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: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">ChangeNotifierProvider</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      create: (context) =&gt; </span><span style="color: #4EC9B0">CounterModel</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">      child: </span><span style="color: #4EC9B0">MyApp</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 style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #4EC9B0">CounterScreen</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 style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CounterScreen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Counter App with Provider&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">Column</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          mainAxisAlignment: </span><span style="color: #4EC9B0">MainAxisAlignment</span><span style="color: #D4D4D4">.center,</span></span>
<span class="line"><span style="color: #D4D4D4">          children: [</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;You have pushed the button this many times:&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">Consumer</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">CounterModel</span><span style="color: #D4D4D4">&gt;(</span></span>
<span class="line"><span style="color: #D4D4D4">              builder: (context, counter, child) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #CE9178">&#39;${</span><span style="color: #9CDCFE">counter</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">count</span><span style="color: #CE9178">}&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  style: </span><span style="color: #4EC9B0">Theme</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(context).textTheme.bodySmall,</span></span>
<span class="line"><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 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 style="color: #D4D4D4">      floatingActionButton: </span><span style="color: #4EC9B0">FloatingActionButton</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        onPressed: () {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #4EC9B0">Provider</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">CounterModel</span><span style="color: #D4D4D4">&gt;(context, listen: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">increment</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        tooltip: </span><span style="color: #CE9178">&#39;Increment&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">Icon</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Icons</span><span style="color: #D4D4D4">.add),</span></span>
<span class="line"><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 style="color: #D4D4D4">}</span></span></code></pre></div>



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



<ul class="wp-block-list">
<li><strong>ChangeNotifierProvider</strong>：<code>ChangeNotifier</code>を使って、状態をアプリ全体に提供するプロバイダです。<code>create</code>でインスタンスを生成します。</li>



<li><strong>Consumer</strong>：<code>Consumer</code>ウィジェットは、プロバイダの状態を監視し、状態が変わるたびにUIを更新します。</li>



<li><strong>Provider.of</strong>：<code>Provider.of&lt;CounterModel>(context)</code>で、プロバイダにアクセスし、状態を操作します。<code>listen: false</code>にすることで、状態が変わっても再ビルドされないようにします。</li>
</ul>



<h2 class="wp-block-heading">複雑な状態管理への拡張</h2>



<p class="wp-block-paragraph"><code>Provider</code>パターンは、シンプルなアプリから複雑なアプリまでスケーラブルに対応できます。例えば、以下のような機能を追加することが可能です。</p>



<h3 class="wp-block-heading">1. 複数のProviderを使用する</h3>



<p class="wp-block-paragraph"><code>MultiProvider</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="MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (context) =&gt; CounterModel()),
    ChangeNotifierProvider(create: (context) =&gt; AuthModel()),
  ],
  child: MyApp(),
)" 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">MultiProvider</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">  providers: [</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">ChangeNotifierProvider</span><span style="color: #D4D4D4">(create: (context) =&gt; </span><span style="color: #4EC9B0">CounterModel</span><span style="color: #D4D4D4">()),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">ChangeNotifierProvider</span><span style="color: #D4D4D4">(create: (context) =&gt; </span><span style="color: #4EC9B0">AuthModel</span><span style="color: #D4D4D4">()),</span></span>
<span class="line"><span style="color: #D4D4D4">  ],</span></span>
<span class="line"><span style="color: #D4D4D4">  child: </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">2. 非同期処理との統合</h3>



<p class="wp-block-paragraph"><code>Provider</code>は非同期データにも対応可能です。例えば、APIリクエストを実行して、取得したデータをUIに反映することができます。<code>FutureProvider</code>や<code>StreamProvider</code>を使えば、非同期データを簡単に扱えます。</p>



<h2 class="wp-block-heading">Providerパターンのメリットとベストプラクティス</h2>



<h3 class="wp-block-heading">メリット</h3>



<ol class="wp-block-list">
<li><strong>シンプルなAPI</strong>：<code>Provider</code>の使い方は非常にシンプルで、導入が簡単。</li>



<li><strong>テストがしやすい</strong>：ビジネスロジックとUIが分離されているため、テストが容易。</li>



<li><strong>パフォーマンスが高い</strong>：状態が変更されたときに必要な部分だけをリビルドするため、パフォーマンスに優れています。</li>
</ol>



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



<ul class="wp-block-list">
<li><strong>状態のロジックを分離する</strong>：ビジネスロジックはモデルクラスにまとめ、UIはUIに専念させる。</li>



<li><strong>Providerの適切な配置</strong>：アプリ全体で共有する必要がある状態は、<code>MaterialApp</code>の近くに配置し、ローカルな状態はより下層のウィジェットに配置する。</li>
</ul>



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



<p class="wp-block-paragraph">Flutterの<strong>Providerパターン</strong>は、シンプルかつ強力な状態管理方法を提供します。<code>ChangeNotifier</code>を使って状態を簡単に管理し、<code>Consumer</code>や<code>Provider.of</code>でUIに反映することで、効率的な状態管理が可能になります。また、複数のプロバイダや非同期処理も簡単に扱えるため、スケーラブルなアプリケーション開発が可能です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-provider-pattern/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-06-27 09:39:15 by W3 Total Cache
-->