@@ -11,6 +11,7 @@ import 'dart:convert';
1111import 'package:meta/meta.dart' ;
1212
1313import '../hyper_storage.dart' ;
14+ import 'utils.dart' ;
1415
1516/// Function type definition for getting an item from the storage backend.
1617typedef ItemGetter <E extends Object > = Future <E ?> Function (StorageBackend backend, String key);
@@ -31,6 +32,8 @@ class ItemHolder<E extends Object> with Stream<E?> implements BaseListenable, It
3132
3233 bool _isClosed = false ;
3334
35+ final List <Enum >? _enumValues;
36+
3437 /// The key associated with this item holder.
3538 @internal
3639 bool get isClosed => _isClosed;
@@ -56,7 +59,13 @@ class ItemHolder<E extends Object> with Stream<E?> implements BaseListenable, It
5659 final StreamController <E ?> _streamController = StreamController <E ?>.broadcast ();
5760
5861 /// Creates a new [ItemHolder] instance.
59- ItemHolder (BaseStorage this ._parent, this ._key, {this .getter, this .setter});
62+ ItemHolder (
63+ BaseStorage this ._parent,
64+ this ._key, {
65+ this .getter,
66+ this .setter,
67+ List <Enum >? enumValues,
68+ }) : _enumValues = enumValues;
6069
6170 @override
6271 Future <bool > get exists => _parent? .backend.containsKey (_key) ?? Future .value (false );
@@ -65,7 +74,7 @@ class ItemHolder<E extends Object> with Stream<E?> implements BaseListenable, It
6574 Future <E ?> get () async {
6675 if (_parent case BaseStorage (: final backend)) {
6776 if (getter case var getter? ) return getter (backend, _key);
68- final E ? value = await backend.get (_key);
77+ final E ? value = await backend.get < E > (_key, enumValues : _enumValues );
6978 return value;
7079 }
7180 return Future .value (null );
@@ -399,6 +408,7 @@ mixin ItemHolderMixin on BaseStorage {
399408 /// - List of String
400409 /// - JSON Map
401410 /// - List of JSON Maps
411+ /// - Enum (requires providing [enumValues] unless custom getter/setter supplied)
402412 ///
403413 /// Parameters:
404414 /// - [key] : The key under which to store the item. Must be non-empty and not only whitespace.
@@ -407,6 +417,8 @@ mixin ItemHolderMixin on BaseStorage {
407417 /// to retrieve the item instead of the default backend method.
408418 /// - [set] : Optional custom setter function. If provided, this function will be used
409419 /// to store the item instead of the default backend method.
420+ /// - [enumValues] : Optional list of all enum values when using an enum type with the
421+ /// default getter/setter. Required if [E] is an enum and you are not supplying custom accessors.
410422 ///
411423 /// Returns:
412424 /// A [ItemHolder] configured to manage the item at the specified key.
@@ -417,13 +429,25 @@ mixin ItemHolderMixin on BaseStorage {
417429 /// See also:
418430 /// - [jsonItemHolder] for JSON-specific serialization.
419431 /// - [serializableItemHolder] for generic/other serialization.
420- ItemHolder <E > itemHolder <E extends Object >(String key, {ItemGetter <E >? get , ItemSetter <E >? set }) {
432+ ItemHolder <E > itemHolder <E extends Object >(
433+ String key, {
434+ ItemGetter <E >? get ,
435+ ItemSetter <E >? set ,
436+ List <Enum >? enumValues,
437+ }) {
421438 validateKey (key);
422439 if ((get == null && set != null ) || (get != null && set == null )) {
423440 throw ArgumentError ('Both getter and setter must be provided together, or neither.' );
424441 }
425442 // Only run generic type validation if custom getter/setter are not provided.
426- if (set == null || get == null ) _validateGenericType <E >();
443+ final hasCustomAccessors = get != null && set != null ;
444+ if (! hasCustomAccessors) {
445+ if (enumValues == null ) {
446+ _validateGenericType <E >();
447+ } else {
448+ checkEnumType <E >(enumValues);
449+ }
450+ }
427451 var existing = _holders[key];
428452 if (existing != null && existing.isClosed) {
429453 _holders.remove (key);
@@ -439,7 +463,13 @@ mixin ItemHolderMixin on BaseStorage {
439463 }
440464 }
441465
442- final holder = ItemHolder <E >(this , encodeKey (key), setter: set , getter: get );
466+ final holder = ItemHolder <E >(
467+ this ,
468+ encodeKey (key),
469+ setter: set ,
470+ getter: get ,
471+ enumValues: enumValues,
472+ );
443473 _holders[key] = holder;
444474 return holder;
445475 }
0 commit comments