prf 2.2.3
prf: ^2.2.3 copied to clipboard
Easily save and load values locally. Effortless local persistence with type safety and zero boilerplate. Just get, set, and go. Drop-in replacement for raw SharedPreferences.
Changelog #
All notable changes to the prf package will be documented in this file.
2.2.3 #
- Fixed
Prf.value<T>()not being static as intended.
2.2.2 #
- Updated README
2.2.1 #
Added #
-
Instant Cached Access:
Introduced.cachedValuegetter forPrf<T>objects to access the last loaded value without async. -
Prf.value<T>()factory:
AddedPrf.value<T>()constructor that automatically loads the stored value into memory, making.cachedValueimmediately usable after initialization.Example:
final score = await Prf.value<int>('user_score'); print(score.cachedValue); // No async needed- After calling
Prf.value(), you can access.cachedValueinstantly. - If no value exists,
.cachedValuewill be thedefaultValueornull.
- After calling
Notes #
- This feature improves UI performance where fast access to settings or preferences is needed.
- Reminder:
Prf<T>is optimized for speed but not isolate-safe — usePrfy<T>when isolate safety is required.
2.2.0 #
Major Update #
-
Unified API:
Consolidated all legacyPrfXclasses (PrfBool,PrfInt,PrfDouble, etc.) into a single generic structure:Prf<T>— Cached, fast access (not isolate-safe by design).Prfy<T>— Isolate-safe, no internal caching, always reads from storage.
-
Adapter-Based Architecture:
Added modular adapter system (PrfAdapter<T>) with built-in adapters for:- Primitive types (
bool,int,double,String,List<String>) - Encoded types (
DateTime,Duration,BigInt,Uint8List, Enums, JSON)
- Primitive types (
-
Backward Compatibility:
LegacyPrfXclasses remain available, internally powered by the new adapter system. -
Extensibility:
Developers can register custom type adapters viaPrfAdapterMap.instance.register(). -
Internal Reorganization:
Major file structure improvements (core/,prf_types/,prfy_types/,services/) for better modularity and future expansion.
Fixed #
-
Isolate Safety Issue (Issue #3) (stuartmorgan-g):
Previously,prfincorrectly advertised full isolate safety while using internal caching.
This release properly separates behavior:Prfy<T>values are truly isolate-safe, always reading fromSharedPreferencesAsyncwithout cache.Prf<T>values use caching for performance, but are not isolate-safe across isolates (expected Dart behavior).- README and comparison tables have been updated to accurately reflect these distinctions and explain the cache behavior clearly.
-
Corrected claims about
shared_preferencescaching behavior — acknowledged thatSharedPreferencesWithCachedoes have Dart-side caching. -
Clarified that naive Dart caching, like in
Prf<T>, shares the same limitations asSharedPreferencesWithCacheregarding multi-isolate consistency.
Added #
PrfyJson<T>— Safe JSON object storage across isolates.PrfyEnum<T>— Safe enum storage across isolates.PrfJson<T>— Cached JSON object storage.PrfEnum<T>— Cached enum storage.DateTimeAdapter,DurationAdapter,BigIntAdapter,BytesAdapterfor encoded types.PrfCooldownandPrfRateLimiternow internally use the new types.
Changed #
-
Updated README to accurately describe:
- Isolate-safe usage patterns (
Prfy). - Cache-optimized usage patterns (
Prf). - Caching behavior and limitations compared to
shared_preferences.
- Isolate-safe usage patterns (
-
Improved internal documentation on the adapter registration system and best practices.
2.1.3 #
- Fixed issues related to pub.dev formatting
2.1.2 #
- Fixed problems with README formatting
2.1.1 #
- Shortened package description in pubspec.yaml to comply with pub.dev length requirements
2.1.0 #
Added #
PrfCooldownutility for managing persistent cooldown periods with built-in tracking and duration handlingPrfRateLimiterindustry-grade token bucket limiter usingprftypes for rolling-rate restrictions (e.g.1000 actions per 15 minutes)- New typed variables:
PrfTheme– store theme mode (light,dark,system)PrfDuration– storeDurationas microsecondsPrfBigInt– storeBigIntas a string
removeAll()method inPrfCooldownandPrfRateLimiterto clear all related sub-keysoverrideWith()andresetOverride()methods inPrfto inject customSharedPreferencesAsyncinstance for testing- Detailed migration documentation for:
- Migrating from
SharedPreferences - Migrating from
SharedPreferencesAsync - Migrating from legacy
prf
- Migrating from
- README coverage for isolate support and compatibility
Changed #
- Internal singleton of
Prfnow supports override injection for better testability - Updated comparison table in README to highlight isolate safety, caching, and type support
Fixed #
- Deprecated
Prf.clear(...)to discourage unintentional global wipes — usePrf.instance.clear()instead for clarity and safety
2.0.0 #
Internals migrated to SharedPreferencesAsync #
🚨 Behavioral Breaking Change (no API changes)
TL;DR — Do You Need to Do Anything? #
- ✅ No action needed if:
- Your app is new and doesn't rely on previously stored values, or
- You were already using
SharedPreferencesAsync— everything will continue to work seamlessly.
- 🔁 Run a migration if:
- Your app was using
prfprior to this version (pre-2.0.0) - You want to preserve previously stored values
- Your app was using
await PrfService.migrateFromLegacyPrefsIfNeeded();
🧠 Why this change? #
prf now uses SharedPreferencesAsync under the hood — the new, isolate-safe, officially recommended backend for shared preferences.
This change future-proofs prf and avoids issues caused by the old SharedPreferences API, which:
- Is being deprecated
- Is not isolate-safe
- Does not guarantee disk persistence on write (source)
🛠 Migration Instructions #
If your app used prf previously and stored data you want to keep:
await Prf.migrateFromLegacyPrefsIfNeeded();
This safely copies data from the legacy storage backend to the new one.
It's safe to run every time — the migration will only happen once.
✅ What's new in 2.0.0: #
- Internals now use
SharedPreferencesAsync - Full isolate-safety, suitable for background plugins like
firebase_messaging - Removed reliance on
getInstance()and internal platform-side caching prfnow fully controls its own cache- Public API is unchanged —
get(),set(),remove()all still work the same
🔁 Key Differences #
| Feature | Before (1.x) |
After (2.0.0) |
|---|---|---|
| Backend | SharedPreferences (legacy) | SharedPreferencesAsync |
| Android storage method | SharedPreferences XML | DataStore Preferences |
| Isolate-safe | ❌ No | ✅ Yes |
💬 Summary #
This is a critical under-the-hood upgrade to ensure prf is compatible with modern Flutter apps, isolate-safe, and ready for the future of shared preferences.
If your app is new, or you don't care about previously stored data — you're done ✅
If you're upgrading and need old values — migrate once as shown above.
1.3.8 #
- Added example file for pub.dev to showcase package usage.
1.3.7 #
- Finished setting up for publishing, this package was private for too long in my repositoriee, hope you enjoy it!
1.3.6 #
- Added omprehensive documentation comments for the entire library.
- Improved API reference with examples and usage notes.
- Enhanced dartdoc coverage for all public classes and methods.
- Better explanation of advanced features and type support.
1.3.5 #
- Improved
PrfDateTimeencoding reliability by enforcing endian order consistency. - Fixed internal handling of corrupted
base64data forPrfBytes.
1.3.4 #
PrfJson<T>class for storing JSON-serializable objects usingjsonEncode/jsonDecode.- Graceful fallback when decoding invalid JSON or mismatched types.
1.3.3 #
PrfDateTimeusing base64-encoded 64-bit integers to persistDateTimevalues with millisecond precision.- Integrated with
PrfEncodedto reduce redundant logic.
1.3.2 #
PrfEncoded<TSource, TStore>for reusable value transformation between domain objects and SharedPreferences-compatible types.- Supports encoding formats like JSON, binary, and base64.
1.3.1 #
- Added
_existscheck insidegetValue()to allow fallback todefaultValueif key is missing. - Improved caching logic to avoid unnecessary SharedPreferences reads.
1.3.0 #
1.2.1 #
- Minor internal refactor to prevent reinitializing
_initFutureinPrf.
1.2.0 #
Added #
PrfByteswith transparent base64 storage ofUint8List.- Full support for all native SharedPreferences types:
PrfIntPrfDoublePrfBoolPrfStringPrfStringList
Improved #
- Unified all variable types using delegate-based constructors.
- Internal logic now handles nullability consistently and efficiently.
1.1.0 #
- Added
typedefsupport forSharedPrefsGetter<T>andSharedPrefsSetter<T>. - Simplified
PrfVariable<T>constructor by using delegates instead of abstract getter/setter classes. - Removed old abstract classes
PrfGetterandPrfSetterin favor of inline functions.
1.0.2 #
- Updated internal caching system for better performance on repeated
.get()calls.
1.0.1 #
- Added
maybePrefsandisInitializedtoPrffor improved control over initialization state.
1.0.0 #
PrfVariable<T>base class with typed getter/setter support.- Manual
SharedPreferencesinjection. - Clean and extensible architecture for managing preference values.