Flutterでshared_preferencesを使ったローカルストレージの基本

Flutterアプリケーション開発において、ユーザーの設定や一時的なデータを保存するためにローカルストレージが必要となる場面は多々あります。今回は、そのようなニーズに応えるためのパッケージ、shared_preferencesの使い方について詳しく解説します。これをマスターすれば、アプリのユーザビリティを大幅に向上させることが可能となります。

目次

shared_preferencesについて

shared_preferencesとは?

shared_preferencesは、Flutterで使用できるキーと値のペアを保存するための永続的なストレージを提供するパッケージです。このパッケージは、AndroidのSharedPreferencesとiOSのNSUserDefaultsに対するラッパーとして機能します。

shared_preferencesは、小さなデータ(主にユーザー設定など)をデバイスに保存するための簡単な方法を提供します。保存できるデータ型は、bool、double、int、String、およびStringListです。

このパッケージを使用すると、アプリケーションが閉じられてもデータが保持され、再度アプリケーションを開いたときにデータを取り出すことができます。これにより、ユーザーの設定、最後のゲームのスコア、またはユーザーが最後に読んだ記事など、アプリケーション間で保持したい小さな量のデータを保存することができます。

ただし、shared_preferencesは大量のデータや複雑なデータ構造を保存するためのものではありません。そのような場合は、データベースシステムを使用することを検討する必要があります。

shared_preferencesを使ったローカルストレージの基本

shared_preferencesの導入方法

pubspec.yamlへの追加

Flutterプロジェクトでshared_preferencesパッケージを使用するためには、まずpubspec.yamlファイルに依存関係を追加する必要があります。pubspec.yamlファイルは、Flutterプロジェクトのルートディレクトリに位置しています。

以下のように、dependenciesセクションにshared_preferencesを追加します。

dependencies:
  flutter:
    sdk: flutter

  # 追加するパッケージ
  shared_preferences: ^latest_version

ここで、latest_versionはshared_preferencesの最新バージョンを指します。最新バージョンの番号は、pub.devのshared_preferencesページで確認できます。

パッケージのインストール

Flutterプロジェクトにshared_preferencesパッケージをインストールするには、先ほど追加した依存関係を取得する必要があります。これは、プロジェクトのルートディレクトリで以下のコマンドを実行することで行えます。

flutter pub get

このコマンドは、pubspec.yamlファイルにリストされたすべての依存関係を取得し、プロジェクトにインストールします。shared_preferencesパッケージが正しくインストールされたことを確認するには、コマンドの出力を確認します。エラーがなければ、パッケージは正常にインストールされています。

これで、shared_preferencesパッケージの全てのクラスと関数がプロジェクトで利用可能になりました。パッケージを使用するには、対象のDartファイルで以下のようにインポートします。

import 'package:shared_preferences/shared_preferences.dart';

これで、shared_preferencesパッケージを使用してデータをローカルに保存する準備が整いました。

shared_preferencesを使ったデータの保存

shared_preferencesパッケージを使用してデータを保存するには、まずSharedPreferencesインスタンスを取得する必要があります。これは非同期操作なので、asyncawaitキーワードを使用します。

SharedPreferences prefs = await SharedPreferences.getInstance();

次に、保存したいデータ型に応じて適切なメソッドを選択します。以下に各データ型の保存方法を示します。

整数値を保存する。

await prefs.setInt('my_int_key', 10);

浮動小数点数を保存する。

await prefs.setDouble('my_double_key', 10.0);

文字列を保存する。

await prefs.setString('my_string_key', 'Hello, World!');

ブール値を保存する。

await prefs.setBool('my_bool_key', true);

文字列のリストを保存する。

await prefs.setStringList('my_string_list_key', ['a', 'b', 'c']);

これで、shared_preferencesを使用してデータをローカルに保存する方法を理解しました。次に、これらのデータを読み込む方法を見ていきましょう。

shared_preferencesを使ったデータの読み込み

shared_preferencesパッケージを使用して保存したデータを読み込むには、まずSharedPreferencesインスタンスを取得します。

SharedPreferences prefs = await SharedPreferences.getInstance();

保存したデータ型に応じて適切なメソッドを使用します。

整数値を読み込む。

final int myIntValue = prefs.getInt('my_int_key') ?? 0;

浮動小数点数を読み込む。

final double myDoubleValue = prefs.getDouble('my_double_key') ?? 0.0;

文字列を読み込む。

final String myStringValue = prefs.getString('my_string_key') ?? '';

ブール値を読み込む。

final bool myBoolValue = prefs.getBool('my_bool_key') ?? false;

文字列のリストを読み込む。

final List<String> myStringListValue = prefs.getStringList('my_string_list_key') ?? [];

これらのメソッドはすべて非同期ではないため、awaitキーワードは必要ありません。また、これらのメソッドはすべてnullを返す可能性があります。これは、指定したキーでデータが見つからなかった場合に発生します。そのため、null許容型(??演算子を使用)を使用してデフォルト値を提供することが推奨されます。

これで、shared_preferencesを使用してデータをローカルに読み込む方法を理解しました。

shared_preferencesを使ったローカルストレージの応用

ユーザー設定の保存と読み込み

Flutterアプリケーションでユーザー設定を保存し、後で読み込むためには、shared_preferencesパッケージが非常に便利です。以下に、ユーザー設定の保存と読み込みの基本的な手順を示します。

まず、保存したい設定項目を決定します。例えば、ユーザーのテーマ設定(ライトモードまたはダークモード)を保存するとします。

設定の保存

SharedPreferences prefs = await SharedPreferences.getInstance();
// ユーザーがダークモードを選択したとします。
bool isDarkMode = true;
await prefs.setBool('theme_mode', isDarkMode);

上記のコードでは、setBoolメソッドを使用して、ユーザーのテーマ設定を保存しています。キーはtheme_modeとし、値はisDarkMode変数(ブール値)としています。

設定の読み込み

SharedPreferences prefs = await SharedPreferences.getInstance();
bool isDarkMode = prefs.getBool('theme_mode') ?? false;

上記のコードでは、getBoolメソッドを使用して、保存したテーマ設定を読み込んでいます。キーは保存時と同じtheme_modeを指定します。もし何らかの理由で値がnullの場合、デフォルト値としてfalseを返します。

これで、ユーザーのテーマ設定がアプリケーションの起動時に読み込まれ、ユーザーが設定を変更したときに保存されるようになりました。これにより、ユーザーはアプリケーションを再起動しても自分の設定が保持され、一貫したユーザーエクスペリエンスを提供できます。

データの削除

shared_preferencesパッケージを使用して保存したデータを削除するには、removeメソッドを使用します。このメソッドは、指定したキーに関連付けられたデータを削除します。

SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.remove('my_key');

上記のコードでは、’my_key’というキーで保存されたデータを削除しています。

Flutterアプリケーションのローカルストレージからデータを削除することができます。ただし、削除操作は取り消すことができないため、データを削除する前には十分に注意が必要です。

shared_preferencesのベストプラクティス

キーの管理

キーは一意である必要があります。また、キーの命名は明確で一貫したものにすると、後でデータを取り出す際に混乱を避けることができます。

デフォルト値の使用

getメソッドは、指定したキーのデータが存在しない場合にnullを返します。そのため、null許容型を使用してデフォルト値を提供することが推奨されます。

データのセキュリティ

shared_preferencesはデータを平文で保存します。そのため、パスワードや個人情報などのセンシティブな情報を保存するのには適していません。このような情報を保存する場合は、適切な暗号化を行うか、セキュアなストレージオプションを検討する必要があります。

データの削除

必要なくなったデータは適切に削除することが重要です。これにより、デバイスのストレージを無駄に消費することを避けることができます。

これらのベストプラクティスを守ることで、shared_preferencesを効果的に使用し、アプリケーションのパフォーマンスとユーザーエクスペリエンスを向上させることができます。

shared_preferencesの注意点とトラブルシューティング

データ保存の上限

Flutterのshared_preferencesパッケージは、小さなデータの保存に適しています。これは、キーと値のペアを使用してデータを保存するため、大量のデータを保存するのには適していません。具体的な上限は、使用しているプラットフォームとデバイスのストレージ容量によりますが、一般的には数メガバイト程度と考えられます。

また、shared_preferencesは内部的にはAndroidのSharedPreferencesとiOSのNSUserDefaultsを使用しており、これらはそれぞれのプラットフォームで設定や状態の保存に使われるものです。これらのシステムは大量のデータを保存するために設計されていないため、大量のデータを保存しようとするとパフォーマンスに影響を及ぼす可能性があります。

したがって、大量のデータや複雑なデータ構造を保存する必要がある場合は、データベースシステム(例えばSQLite)やファイルシステムを使用することを検討するべきです。これらのシステムは大量のデータを効率的に保存し、検索するために設計されています。

また、セキュリティが重要な情報(例えばパスワードや個人情報)を保存する場合は、暗号化されたストレージを使用することが推奨されます。これにより、データが不正にアクセスされるリスクを軽減することができます。

エラーハンドリング

Flutterのshared_preferencesパッケージを使用する際には、エラーハンドリングも重要な考慮事項となります。データの読み書きは非同期で行われ、エラーが発生する可能性があります。例えば、デバイスのストレージがフルである場合や、読み書きの権限がない場合などです。

try {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setString('my_key', 'my_value');
} catch (e) {
  // エラーが発生した場合の処理
  print('Failed to write data: $e');
}

このコードでは、tryブロック内の非同期処理がエラーをスローした場合、catchブロックが実行されます。エラーオブジェクトeは、発生したエラーの詳細情報を含みます。

エラーハンドリングを適切に行うことで、予期しないエラーがアプリケーションの動作を妨げることを防ぎ、より堅牢なアプリケーションを作成することができます。

プログラミングスクールをお探しの方はこちら

フリーランス案件をお探しの方はこちら

エンジニア転職サイトをお探しの方はこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次