すらぼうの開発ノート

flutterエンジニアのメモ

【Flutter】shared_preferencesを用いてデータの保存・読み取りをする

本エントリでは以下の流れでshared_preferencesの使い方を説明する。



shared_preferencesとは

shared_preferencesとはデータをローカルに保存するためのパッケージ。

以下の特徴がある。

  • キーバリュー形式で保存する
  • 特別な準備がなく使用できる
  • Android, iOS, web, macOS, Windows, Linuxで使用できる
  • アプリをインストールするとデータは削除される

またshared_preferencesは以下の様なケースでよく使用される。

  • ユーザーが検索したキーワードのキャッシュ
  • 表示しているタブのインデックス保存

共通点は「サイズは小さいが保存しておきたいデータ」であること。

使用する際の注意事項として、アンインストールするとデータは消えてしまうので、ユーザー登録情報などの重要度の高いデータは保存しない方が良い

shared_preferencesの詳細は公式ページを参照のこと。

pub.dev


shared_preferencesの使い方

準備

インストール

shared_preferencesはサードパーティのパッケージであるので、プロジェクトにあるpubspec.yamlに以下の記述を追記する。

dependencies:
  shared_preferences: ^2.0.15

バージョンは更新されている可能性があるため、以下のインストールページをチェックしておくこと。

pub.dev

インスタンスの作成

データを操作する際にはまずSharedPreferences.getInstance()メソッドを用いてインスタンスを作成する必要がある。 注意点は非同期処理なのでawaitキーワードが必要になる。

final prefs = await SharedPreferences.getInstance();

本エントリではprefsインスタンスを用いて各データ型ごとに保存・読み取りの説明をする。

データ保存・読み取り

キーについて

shared_preferencesはキーバリュー形式でデータを管理している。 そのため開発者は各データごとにユニークなキーを指定する必要がある。

実際のプロジェクトでは、以降の説明コードでキー名称と記載されている部分にユニークなキーが入ると想定している。

int型(整数)のデータ

保存方法

setInt()で値を保存することができる。

prefs.setInt(キー名称, 値);

第二引数に保存したいint型の値を指定する。 データ型に合わない値は保存することができずエラーになる。

読み取り方法

getInt()で保存されている値を取得することができる。

prefs.getInt(キー名称);

キー名称にユニークな文字列を引数に指定する。 もし該当するキー名称が存在しない場合、nullが返される。

double型(実数、小数)のデータ

保存方法

setDouble()で値を保存することができる。

prefs.setDouble(キー名称, 値);

第二引数に保存したいdouble型の値を指定する。 データ型に合わない値は保存することができずエラーになる。

読み取り方法

getDouble()で保存されている値を取得することができる。

prefs.getDouble(キー名称);

キー名称にユニークな文字列を引数に指定する。 もし該当するキー名称が存在しない場合、nullが返される。

String型(文字列)のデータ

保存方法

setString()で値を保存することができる。

prefs.setString(キー名称, 値);

第二引数に保存したいstring型の値を指定する。 データ型に合わない値は保存することができずエラーになる。

読み取り方法

getString()で保存されている値を取得することができる。

prefs.getString(キー名称);

キー名称にユニークな文字列を引数に指定する。 もし該当するキー名称が存在しない場合、nullが返される。

List<String>(文字列のリスト)のデータ

保存方法

setStringList()で値を保存することができる。

prefs.setStringList(キー名称, 値);

第二引数に保存したいList<string>型の値を指定する。 データ型に合わない値は保存することができずエラーになる。

読み取り方法

getStringList()で保存されている値を取得することができる。

prefs.getStringList(キー名称);

キー名称にユニークな文字列を引数に指定する。 もし該当するキー名称が存在しない場合、nullが返される。

bool型(ブール)のデータ

保存方法

setBool()で値を保存することができる。

prefs.setBool(キー名称, 値);

第二引数に保存したいbool型の値を指定する。 データ型に合わない値は保存することができずエラーになる。

読み取り方法

getBool()で保存されている値を取得することができる。

prefs.getBool(キー名称);

キー名称にユニークな文字列を引数に指定する。 もし該当するキー名称が存在しない場合、nullが返される。

データの削除方法

データを削除する場合remove()メソッドを用いる。 非同期処理なのでawaitが必要。削除が成功するとtrueが返される。

await prefs.remove(キー名称);

shared_preferencesを用いたサンプルアプリ

カウンターアプリ(int型データの保存・読み取り例)

動作画像

カウンターアプリ動作

コード

解説

int型データ_counterの管理にshared_preferencesを用いたサンプル。 キー名称は「counter」としている。

initStateにて保存されている状態を読み取るため_initSharedPreferencesData()というメソッドを用意している。

メソッド内でprefs.containsKey(_counterKeyName)を用いて既に保存されている値が存在するかを確認。 存在する場合はgetInt()で値を読み取り、プライベート変数の_counterに値を渡してsetState()を実行することで数値を表示している。

_counterの更新処理には以下の3つのメソッドを用意した。

// _counterを1増やす
 void _incrementCounter() async {
    final prefs = await SharedPreferences.getInstance();

    setState(() {
      _counter++;
    });

    prefs.setInt(_counterKeyName, _counter);
  }

// _counterを1減らす
  void _decrementCounter() async {
    final prefs = await SharedPreferences.getInstance();

    setState(() {
      _counter--;
    });

    prefs.setInt(_counterKeyName, _counter);
  }

// _counterを0にする
  void _resetCounter() async {
    final prefs = await SharedPreferences.getInstance();

    setState(() {
      _counter = 0;
    });

    prefs.setInt(_counterKeyName, _counter);
  }

まずprefsインスタンスを作成し、その後_counterを更新してその値を"counter"キーのバリューに保存している。