diff --git a/packages/supabase_flutter/lib/src/local_storage.dart b/packages/supabase_flutter/lib/src/local_storage.dart index d3622ea2..70f0de46 100644 --- a/packages/supabase_flutter/lib/src/local_storage.dart +++ b/packages/supabase_flutter/lib/src/local_storage.dart @@ -64,11 +64,19 @@ class EmptyLocalStorage extends LocalStorage { /// A [LocalStorage] implementation that implements SharedPreferences as the /// storage method. class SharedPreferencesLocalStorage extends LocalStorage { - late final SharedPreferences _prefs; + late final SharedPreferences _syncPrefs; + + late final SharedPreferencesAsync _asyncPrefs; - SharedPreferencesLocalStorage({required this.persistSessionKey}); + SharedPreferencesLocalStorage({ + required this.persistSessionKey, + this.useSharedPreferencesAsync = false, + }); final String persistSessionKey; + + final bool useSharedPreferencesAsync; + static const _useWebLocalStorage = kIsWeb && bool.fromEnvironment("dart.library.js_interop"); @@ -76,7 +84,12 @@ class SharedPreferencesLocalStorage extends LocalStorage { Future initialize() async { if (!_useWebLocalStorage) { WidgetsFlutterBinding.ensureInitialized(); - _prefs = await SharedPreferences.getInstance(); + + if (useSharedPreferencesAsync) { + _asyncPrefs = SharedPreferencesAsync(); + } else { + _syncPrefs = await SharedPreferences.getInstance(); + } } } @@ -85,7 +98,11 @@ class SharedPreferencesLocalStorage extends LocalStorage { if (_useWebLocalStorage) { return web.hasAccessToken(persistSessionKey); } - return _prefs.containsKey(persistSessionKey); + + return switch (useSharedPreferencesAsync) { + true => _asyncPrefs.containsKey(persistSessionKey), + false => Future.value(_syncPrefs.containsKey(persistSessionKey)), + }; } @override @@ -93,7 +110,11 @@ class SharedPreferencesLocalStorage extends LocalStorage { if (_useWebLocalStorage) { return web.accessToken(persistSessionKey); } - return _prefs.getString(persistSessionKey); + + return switch (useSharedPreferencesAsync) { + true => _asyncPrefs.getString(persistSessionKey), + false => Future.value(_syncPrefs.getString(persistSessionKey)), + }; } @override @@ -101,7 +122,12 @@ class SharedPreferencesLocalStorage extends LocalStorage { if (_useWebLocalStorage) { web.removePersistedSession(persistSessionKey); } else { - await _prefs.remove(persistSessionKey); + switch (useSharedPreferencesAsync) { + case true: + await _asyncPrefs.remove(persistSessionKey); + case false: + await _syncPrefs.remove(persistSessionKey); + } } } @@ -110,7 +136,10 @@ class SharedPreferencesLocalStorage extends LocalStorage { if (_useWebLocalStorage) { return web.persistSession(persistSessionKey, persistSessionString); } - return _prefs.setString(persistSessionKey, persistSessionString); + return switch (useSharedPreferencesAsync) { + true => _asyncPrefs.setString(persistSessionKey, persistSessionString), + false => _syncPrefs.setString(persistSessionKey, persistSessionString), + }; } }