Skip to content

Commit 60be60d

Browse files
committed
[#11] Implement local secure storage
1 parent 3a1cc91 commit 60be60d

File tree

5 files changed

+132
-0
lines changed

5 files changed

+132
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
2+
3+
class FlutterSecureStorageProvider {
4+
FlutterSecureStorage? _storage;
5+
6+
FlutterSecureStorage getStorage() {
7+
_storage ??= _createStorage();
8+
return _storage!;
9+
}
10+
11+
FlutterSecureStorage _createStorage() {
12+
return const FlutterSecureStorage(
13+
aOptions: AndroidOptions(
14+
encryptedSharedPreferences: true,
15+
),
16+
);
17+
}
18+
}

lib/storage/secure_storage.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
enum SecureStorageKey {
2+
apiToken,
3+
}
4+
5+
extension SecureStorageKeyExt on SecureStorageKey {
6+
String get string {
7+
switch (this) {
8+
case SecureStorageKey.apiToken:
9+
return 'API_TOKEN_KEY';
10+
}
11+
}
12+
}
13+
14+
abstract class SecureStorageModel {}
15+
16+
enum SecureStorageError {
17+
failToRead,
18+
failToParse,
19+
}
20+
21+
abstract class SecureStorage {
22+
Future<void> save<M extends SecureStorageModel>(
23+
{required M value, required SecureStorageKey key});
24+
Future<M> get<M extends SecureStorageModel>(
25+
{required String value, required SecureStorageKey key});
26+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import 'dart:convert';
2+
3+
import 'package:flutter_riverpod/flutter_riverpod.dart';
4+
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
5+
import 'package:survey_flutter/storage/secure_storage.dart';
6+
7+
import '../di/provider/flutter_secure_storage.dart';
8+
9+
final secureStorageProvider = Provider<SecureStorage>((_) {
10+
return SecureStorageImpl(FlutterSecureStorageProvider().getStorage());
11+
});
12+
13+
class SecureStorageImpl extends SecureStorage {
14+
final FlutterSecureStorage _storage;
15+
SecureStorageImpl(this._storage);
16+
17+
@override
18+
Future<M> get<M extends SecureStorageModel>(
19+
{required String value, required SecureStorageKey key}) async {
20+
final rawValue = await _storage.read(key: key.string);
21+
if (rawValue == null) {
22+
throw SecureStorageError.failToRead;
23+
}
24+
25+
final decodedValue = await jsonDecode(rawValue);
26+
if (decodedValue == null) {
27+
throw SecureStorageError.failToParse;
28+
}
29+
30+
return decodedValue;
31+
}
32+
33+
@override
34+
Future<void> save<M extends SecureStorageModel>(
35+
{required M value, required SecureStorageKey key}) async {
36+
final encodedValue = jsonEncode(value);
37+
await _storage.write(key: key.string, value: encodedValue);
38+
}
39+
}

pubspec.lock

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,54 @@ packages:
288288
url: "https://pub.dev"
289289
source: hosted
290290
version: "2.3.6"
291+
flutter_secure_storage:
292+
dependency: "direct main"
293+
description:
294+
name: flutter_secure_storage
295+
sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5"
296+
url: "https://pub.dev"
297+
source: hosted
298+
version: "8.0.0"
299+
flutter_secure_storage_linux:
300+
dependency: transitive
301+
description:
302+
name: flutter_secure_storage_linux
303+
sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3"
304+
url: "https://pub.dev"
305+
source: hosted
306+
version: "1.1.3"
307+
flutter_secure_storage_macos:
308+
dependency: transitive
309+
description:
310+
name: flutter_secure_storage_macos
311+
sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50"
312+
url: "https://pub.dev"
313+
source: hosted
314+
version: "3.0.0"
315+
flutter_secure_storage_platform_interface:
316+
dependency: transitive
317+
description:
318+
name: flutter_secure_storage_platform_interface
319+
sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b
320+
url: "https://pub.dev"
321+
source: hosted
322+
version: "1.0.1"
323+
flutter_secure_storage_web:
324+
dependency: transitive
325+
description:
326+
name: flutter_secure_storage_web
327+
sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe"
328+
url: "https://pub.dev"
329+
source: hosted
330+
version: "1.1.1"
331+
flutter_secure_storage_windows:
332+
dependency: transitive
333+
description:
334+
name: flutter_secure_storage_windows
335+
sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee
336+
url: "https://pub.dev"
337+
source: hosted
338+
version: "2.0.0"
291339
flutter_svg:
292340
dependency: "direct main"
293341
description:

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ dependencies:
4747
equatable: ^2.0.0
4848
internet_connection_checker: ^1.0.0+1
4949
page_view_dot_indicator: ^2.1.0
50+
flutter_secure_storage: ^8.0.0
5051

5152
dev_dependencies:
5253
build_runner: ^2.4.4

0 commit comments

Comments
 (0)