カテゴリ: Flutterの状態管理 更新日: 2026/05/14

Flutterのグローバル変数とシングルトンの使い方を完全ガイド!初心者でもわかる状態管理の基本

296
Flutterでグローバル変数・シングルトンを活用する方法

先生と生徒の会話形式で理解しよう

生徒

「Flutterでアプリ全体からアクセスできる変数ってどうやって作るんですか?」

先生

「Flutterでアプリ全体に渡って変数を共有したい場合は、グローバル変数やシングルトンという仕組みを使う方法があります。」

生徒

「どっちを使えばいいんですか?違いがよくわからなくて…」

先生

「ではFlutterでのグローバル変数とシングルトンの違いや使い分け方を、丁寧に見ていきましょう!」

1. Flutterにおけるグローバル変数とは?

1. Flutterにおけるグローバル変数とは?
1. Flutterにおけるグローバル変数とは?

Flutter(フラッター)でグローバル変数とは、アプリ全体のどこからでもアクセスできる変数のことです。main.dartなどのファイルで、関数やクラスの外に変数を定義することで、どのウィジェットや関数からでも参照・変更が可能になります。

ただし、グローバル変数は使い方を誤ると予期しないバグ状態の不整合を引き起こす可能性があるため、注意が必要です。

例えば次のように定義します。


String username = "ゲストユーザー";

この変数は、他のファイルからでもそのままアクセス・書き換えが可能です。便利ですが、設計には気をつけましょう。

2. グローバル変数のメリットとデメリット

2. グローバル変数のメリットとデメリット
2. グローバル変数のメリットとデメリット

メリット:

  • アプリ全体から簡単にアクセスできる
  • 状態管理ライブラリを使わずにデータ共有が可能

デメリット:

  • 状態の追跡が難しくなる
  • テストがしにくくなる
  • 依存性注入やOOP原則から逸脱しやすい

そのため、グローバル変数の使用は一時的なデモ用設定値などにとどめ、複雑な状態管理には適しません。

3. Flutterでのシングルトンパターンの使い方

3. Flutterでのシングルトンパターンの使い方
3. Flutterでのシングルトンパターンの使い方

Flutterで安全に状態を共有したい場合は、シングルトンを使うのが一般的です。シングルトンはアプリ内でただ1つのインスタンスしか存在しないことを保証する設計パターンです。

Dartでは次のようにシングルトンを作成できます:


class AppSettings {
  // プライベートなコンストラクタ
  AppSettings._privateConstructor();

  // インスタンス保持
  static final AppSettings _instance = AppSettings._privateConstructor();

  // 外部からアクセスするためのgetter
  static AppSettings get instance => _instance;

  // 任意のプロパティ
  String theme = "light";
}

使うときは以下のようにアクセスします:


AppSettings.instance.theme = "dark";
print(AppSettings.instance.theme); // dark

このように、AppSettings.instanceを通じて、どこからでも安全にアクセスできます。

Flutterを「実務レベル」で使えるようになりたい人や、 iPhone / Android両対応アプリ開発の流れをまとめて学びたい人には、 定番の実践書がこちらです。

Flutter実践開発をAmazonで見る

※ Amazon広告リンク

4. シングルトンのメリットと用途

4. シングルトンのメリットと用途
4. シングルトンのメリットと用途

メリット:

  • 状態が1箇所で管理できる
  • テストがしやすい
  • 設計として明確

よくある用途:

  • アプリ全体で共有したい設定情報(ダークモードなど)
  • ユーザー情報
  • APIクライアントのインスタンス

Flutterアプリで複数の画面間に共通データを持ちたいとき、シングルトンはとても有効な手段です。

5. ProviderやRiverpodとの使い分け

5. ProviderやRiverpodとの使い分け
5. ProviderやRiverpodとの使い分け

FlutterではProviderRiverpodといった状態管理ライブラリもよく使われます。これらはリビルドの最適化や依存注入が簡単に行えるため、アプリが複雑になる場合は導入が推奨されます。

しかし、次のようなケースではシングルトンで十分なこともあります:

  • 状態が少なく頻繁に変わらない
  • アプリ規模が小さい
  • 外部ライブラリを使いたくない

逆に、UIの再構築が頻繁に発生するような場合はChangeNotifierStateNotifierなどを活用しましょう。

6. シングルトンのバリエーション:Lazy Initialization

6. シングルトンのバリエーション:Lazy Initialization
6. シングルトンのバリエーション:Lazy Initialization

シングルトンを必要になったタイミングで初期化する「遅延初期化(Lazy Initialization)」というパターンもあります。


class Logger {
  static Logger? _instance;

  Logger._privateConstructor();

  static Logger get instance {
    _instance ??= Logger._privateConstructor();
    return _instance!;
  }

  void log(String message) {
    print("LOG: $message");
  }
}

このように書くことで、初回アクセス時にのみインスタンスが生成されます。

7. 実用例:ユーザー情報をシングルトンで保持

7. 実用例:ユーザー情報をシングルトンで保持
7. 実用例:ユーザー情報をシングルトンで保持

Flutterでログイン状態を保持する例として、以下のようなUserManagerクラスを作成することができます:


class UserManager {
  static final UserManager _instance = UserManager._internal();

  factory UserManager() {
    return _instance;
  }

  UserManager._internal();

  String? userId;
  String? userName;

  void login(String id, String name) {
    userId = id;
    userName = name;
  }

  void logout() {
    userId = null;
    userName = null;
  }
}

アクセス例:


UserManager().login("u123", "山田太郎");
print(UserManager().userName); // 山田太郎

8. Flutterでグローバル状態を適切に管理するには

8. Flutterでグローバル状態を適切に管理するには
8. Flutterでグローバル状態を適切に管理するには

Flutterでは、グローバル変数シングルトンを上手に使い分けることが重要です。

  • 簡単なデータや定数 → グローバル変数
  • アプリ全体の共有状態 → シングルトン
  • 複雑な再描画や通知が必要 → ProviderやRiverpod

アプリの規模や複雑さに応じて選ぶことで、Flutter開発がより安定し、保守性の高いコードになります。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Flutterでアプリ全体からアクセスできる変数を作るにはどうすればいいですか?

Flutter(フラッター)でアプリのどこからでも参照できる変数を作成したい場合、主に「グローバル変数」または「シングルトン」というデザインパターンを利用する方法があります。グローバル変数は関数の外で定義するだけで簡単に使えますが、より安全で設計が明確な方法として、クラスのインスタンスを一つに制限するシングルトンパターンが推奨されることが多いです。これらを使うことで、異なる画面(ウィジェット)間でも同じデータを共有することが可能になります。
Flutterの状態管理の一覧へ
新着記事
Python
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに解説
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに徹底解説
Dart
Dartのクラスの作り方!定義・インスタンス生成の基礎
Dartのクラスの作り方を完全解説!初心者でも理解できるクラス定義とインスタンス生成の基礎
Java
Javaの同一性と同値性
Javaの同一性と同値性をわかりやすく解説!初心者向けの基礎知識
AWS
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク