概要
スマホアプリで、いわゆる「設定画面」等を開発する際に、
- アプリを再起動したら、設定画面等で設定した値がデフォルトに戻ってしまって困る。
- アプリ内の各種設定値は、アプリを終了しても保持できるようにしたい。
- そして、それはサーバやクラウドの DB とかじゃなくて、スマホのローカルのどこかに保存して、次回アプリ起動時に設定した値を呼び戻すようにしたい。
そんな人のための備忘録。
設定の基本的な保存場所を提供するのは、iOS なら「UserDefaults」クラス, Android なら「SharedPreferences」などを使用します。
Flutter のパッケージには、この両方をラップしたような「shared_preferences」という公式プラグインがあり、これを使用すれば、簡単に設定保存を実装できます。
導入
ルートディレクトリでインストールコマンド実行し、最新のパッケージを導入
# インストールコマンド
flutter pub add shared_preferences
pubspec.yaml
でインストール完了とバージョンを確認しとく。
使い方
設定を扱う .dart ファイルに以下のインポート文を追記
import 'package:shared_preferences/shared_preferences.dart';
.getXxx()
, .setXxx()
を使用して、どこかで以下のような処理を追加する ("Xxx" は変数型によって様々。詳細は公式の仕様を参照)
尚、以下のメソッド名はテキトーです。
// 設定値を取得
void _readSetting() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int counter = (prefs.getInt('counter') ?? 0) + 1;
String name = prefs.getString('name') ?? '';
bool isSelected = prefs.getBool('isSelected') ?? false;
}
// 設定値を保存
void _saveSetting() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setInt('counter', 777);
await prefs.setString('name', 'Yamada');
await prefs.setBool('isSelected', true);
}
// 設定値を削除
void _deleteSetting() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// 型に関係なくキー名を指定するだけ
await prefs.remove('counter');
await prefs.remove('name');
await prefs.remove('isSelected');
}
.getXxx()
は、設定値が存在しない場合は Null を返す可能性があるため、 ??
演算子を用いて右項に初期値を設定
補足:テストをする際は
(※テストコードを書いてテストしてない人は、参照不要です)
以下の処理で、テスト用の設定値を与えることができます。
SharedPreferences.setMockInitialValues(Map<String, dynamic> values);
values
に初期値を与えることで、その状態での単体テストが可能です。
ちょっと気をつけた方が良いこと
「ローカル」内にファイルや何かデータを作成するということは、一度作ったらユーザの端末にデータが残り続けやすいということになります。
なので、安易に不要な保存処理をボコボコ量産すると、不要なパラメータを削除メソッドでうまく削除するロジックにしたり、根本的な解消を行うバージョンアップを行うまでは、長期間にわたってユーザの端末内にゴミデータが残り続ける可能性があるということも考えておく必要があります。
つまり、「どのような設定内容を、どのように保持するのか」の設計は、少し慎重に行った方が良いかと個人的には思います。