flutter_secure_storage: 導入 使い方 - Ki-Kobayashi/flutter_wiki GitHub Wiki

🟩 公式から、パッケージをインストール

https://pub.dev/packages/flutter_secure_storage

flutter_secure_storageは安全にデータを保存することができます。
iOSの場合は、キーチェーンを使用してデータを保存し、Androidの場合は、AES暗号化が使用されキースト アに保存されます。
iOSの場合は、キーチェーンを使用しているため、アプリを削除してもデータが残ります。
Androidの場合は、アプリを削除するとデータも削除されるためshared_preferencesと同じ挙動になります。

.

🟩事前設定

[project]/android/app/build.gradle set minSdkVersion to >= 18. 👈これ以上にする

🟡 AndroidManifest

https://github.com/mogol/flutter_secure_storage/issues/43

        <application
        ...
            android:allowBackup="false"
            android:fullBackupContent="false" 👈以下かいずれかを設定
      android:fullBackupContent="@xml/backup_rules"> 👈使用経験ではこちらを設定していた

.

🟡 android/../main/res/xml/backup_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="sharedpref" path="FlutterSecureStorage"/>
</full-backup-content>

.

🟩 Providerの作成と上書き

🟡app_provider.dart

part 'app_providers.g.dart';

@Riverpod(keepAlive: true)
FlutterSecureStorage flutterSecureStorage(FlutterSecureStorageRef ref) {
  throw UnimplementedError();
}

.

🟡main.dart

Future<void> main() async {

  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    ProviderScope(
      overrides: [
        sharedPreferencesProvider.overrideWithValue(
          await SharedPreferences.getInstance(),
        ),
        flutterSecureStorageProvider.overrideWithValue(
          const FlutterSecureStorage(),
        ),

.

🟩 repositoryの作成

part 'secure_storage_repository.g.dart';

@riverpod
SecureStorageRepository secureStorageRepository(
  SecureStorageRepositoryRef ref,
) {
  return SecureStorageRepository(
    secureStorage: ref.read(flutterSecureStorageProvider),
  );
}

class SecureStorageRepository {
  SecureStorageRepository({
    required FlutterSecureStorage secureStorage,
  }) : _secureStorage = secureStorage;

  final FlutterSecureStorage _secureStorage;

  /// 書き込み
  Future<void> writeParam1({
    required String param,
  }) async {
    await _secureStorage.write(
      key: ConstSharedPrefKeys.param1Key,
      value: param,
      aOptions: _getAndroidOptions(),
    );
  }

  /// 読み出し
  Future<String?> readParam1() async {
    return await _secureStorage.read(
      key: ConstSharedPrefKeys.param1Key,
      aOptions: _getAndroidOptions(),
    );
  }

  /// 削除
  Future<void> deleteParam1() async {
    await _secureStorage.delete(
      key: ConstSharedPrefKeys.param1Key,
      aOptions: _getAndroidOptions(),
    );
  }

  /// Keyがセキュアストレージに存在するか
  Future<bool> containsKeyInSecureStorage(String key) async {
    var containsKey = await _secureStorage.containsKey(
      key: key,
      aOptions: _getAndroidOptions(),
    );
    return containsKey;
  }

  AndroidOptions _getAndroidOptions() => const AndroidOptions(
        encryptedSharedPreferences: true,
      );
 // 👇以下は必要があれば(first_unlockまたはfirst_unlock_this_deviceを指定することで、安全な値を取得できます。指定しない場合のデフォルトはロック解除)
  // https://pub.dev/packages/flutter_secure_storage#getting-started
 IOSOptions _getAndroidOptions() => const IOSOptions(
        accessibility: IOSAccessibility.first_unlock,
      );
}

.

🟩 使い方

// 保存
Future<void> _saveParam1(WidgetRef ref, String param1) async {
  final secureStorageRepository = ref.read(secureStorageRepositoryProvider);
  if (await secureStorageRepository
      .containsKeyInSecureStorage(ConstSharedPrefKeys.param1Key)) {
    await secureStorageRepository.deleteParam1();
  }
  await secureStorageRepository.writeParam1(param: param1);
  // 👇確認したければ以下
  final savedParam1 = await secureStorageRepository.readParam1();
}

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

⚠️ **GitHub.com Fallback** ⚠️