はじめに
 Flutterで一時的なデータを保存・管理したいとき、**shared_preferences**は便利なライブラリです。小規模なデータを永続化し、アプリの再起動後でも簡単にアクセスできるため、設定情報やユーザープリファレンスなどを保存するのに最適です。本記事では、shared_preferencesを使用してデータの保存・読み取りを行う方法を具体例を交えて説明します。初めての方でもわかりやすく、手順を丁寧に解説しますので、Flutterでのデータ保存の基礎を学んでいきましょう。
shared_preferencesとは
 shared_preferencesは、Flutterでローカルデータを永続化するためのライブラリです。このパッケージを使うことで、プリミティブなデータ(数値、文字列、ブール値、リストなど)をキー・バリュー形式で簡単に保存・読み込みできます。これは、アプリの設定情報やユーザーの好み(テーマ、ログイン状態など)を保存する際に非常に便利です。
主な特徴
- データは非同期で読み書きできる。
 - プリミティブデータ型の保存が可能(文字列、整数、ブール値など)。
 - 小規模なデータの保存・永続化に最適。
 
shared_preferencesのセットアップ
pubspec.yamlに依存関係を追加
 まず、shared_preferencesパッケージをプロジェクトに追加する必要があります。プロジェクトのpubspec.yamlファイルに以下を追加してください。
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15その後、以下のコマンドでパッケージをインストールします。
flutter pub getパッケージをインポート
 Dartファイルにshared_preferencesをインポートして、すぐに使えるようにします。
import 'package:shared_preferences/shared_preferences.dart';データの保存方法
 次に、実際にデータを保存する方法を見ていきましょう。shared_preferencesは非同期処理を使うので、asyncとawaitを使ってデータを保存します。
ユーザー名を保存する
Future<void> saveUserName(String name) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('username', name);
} この例では、setStringを使って文字列データ(username)を保存しています。SharedPreferences.getInstance()を使って、共有プリファレンスにアクセスし、usernameというキーでユーザー名を保存しています。
保存できるデータの種類
setString(key, value):文字列を保存setInt(key, value):整数を保存setBool(key, value):ブール値を保存setDouble(key, value):小数点の数値を保存setStringList(key, value):文字列のリストを保存
データの読み取り方法
保存したデータを読み取る際も、非同期処理を使います。保存時に使用したキーを使ってデータを取得します。
ユーザー名を読み取る
Future<String?> getUserName() async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.getString('username');
} このコードでは、getStringを使って文字列データを読み取っています。キーが存在しない場合はnullが返されます。
読み取れるデータの種類
getString(key):文字列を読み取るgetInt(key):整数を読み取るgetBool(key):ブール値を読み取るgetDouble(key):小数点の数値を読み取るgetStringList(key):文字列のリストを読み取る
データの削除
 shared_preferencesから特定のデータを削除する場合、remove()メソッドを使用します。また、すべてのデータをクリアするためには、clear()メソッドを使用します。
特定のデータを削除
Future<void> removeUserName() async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.remove('username');
}全てのデータを削除
Future<void> clearAllPreferences() async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.clear();
}このコードでは、全ての保存データを削除します。
UIと連携した実装例
 ここでは、shared_preferencesを使ってテーマの選択(ライトモード/ダークモード)を保存し、アプリを再起動してもその設定が保持されるシンプルな例を紹介します。
テーマ設定を保存・読み取るアプリ
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  ThemeMode _themeMode = ThemeMode.light;
  @override
  void initState() {
    super.initState();
    _loadThemePreference();
  }
  Future<void> _loadThemePreference() async {
    final prefs = await SharedPreferences.getInstance();
    final isDarkMode = prefs.getBool('isDarkMode') ?? false;
    setState(() {
      _themeMode = isDarkMode ? ThemeMode.dark : ThemeMode.light;
    });
  }
  Future<void> _toggleTheme(bool isDark) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setBool('isDarkMode', isDark);
    setState(() {
      _themeMode = isDark ? ThemeMode.dark : ThemeMode.light;
    });
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      themeMode: _themeMode,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Shared Preferences Example'),
        ),
        body: Center(
          child: SwitchListTile(
            title: Text('ダークモード'),
            value: _themeMode == ThemeMode.dark,
            onChanged: (bool value) {
              _toggleTheme(value);
            },
          ),
        ),
      ),
    );
  }
} このアプリでは、ユーザーがスイッチを切り替えることで、テーマモード(ライト/ダーク)を変更でき、その設定がshared_preferencesに保存されます。アプリを再起動しても、選択されたテーマが保持されます。
まとめ
 shared_preferencesを使うことで、簡単にデータをローカルストレージに保存し、アプリが再起動した後もデータを保持することができます。今回は基本的なデータの保存・読み取り・削除の方法と、UIと連携したテーマ設定の例を紹介しました。ユーザーの設定や小規模なデータを保存する際にとても便利なライブラリですので、ぜひ自分のアプリで活用してみてください。

 


コメント