@@ -496,3 +496,177 @@ class RestorableTextEditingController extends RestorableChangeNotifier<TextEditi
496
496
return value.text;
497
497
}
498
498
}
499
+
500
+ /// A [RestorableProperty] that knows how to store and restore a nullable [Enum]
501
+ /// type.
502
+ ///
503
+ /// {@macro flutter.widgets.RestorableNum}
504
+ ///
505
+ /// The values are serialized using the name of the enum, obtained using the
506
+ /// [EnumName.name] extension accessor.
507
+ ///
508
+ /// The represented value is accessible via the [value] getter. The set of
509
+ /// values in the enum are accessible via the [values] getter. Since
510
+ /// [RestorableEnumN] allows null, this set will include null.
511
+ ///
512
+ /// See also:
513
+ ///
514
+ /// * [RestorableEnum] , a class similar to this one that knows how to store and
515
+ /// restore non-nullable [Enum] types.
516
+ class RestorableEnumN <T extends Enum > extends RestorableValue <T ?> {
517
+ /// Creates a [RestorableEnumN] .
518
+ ///
519
+ /// {@macro flutter.widgets.RestorableNum.constructor}
520
+ RestorableEnumN (T ? defaultValue, { required Iterable <T > values })
521
+ : assert (defaultValue == null || values.contains (defaultValue),
522
+ 'Default value $defaultValue not found in $T values: $values ' ),
523
+ _defaultValue = defaultValue,
524
+ values = values.toSet ();
525
+
526
+ @override
527
+ T ? createDefaultValue () => _defaultValue;
528
+ final T ? _defaultValue;
529
+
530
+ @override
531
+ set value (T ? newValue) {
532
+ assert (newValue == null || values.contains (newValue),
533
+ 'Attempted to set an unknown enum value "$newValue " that is not null, or '
534
+ 'in the valid set of enum values for the $T type: '
535
+ '${values .map <String >((T value ) => value .name ).toSet ()}' );
536
+ super .value = newValue;
537
+ }
538
+
539
+ /// The set of non-null values that this [RestorableEnumN] may represent.
540
+ ///
541
+ /// This is a required field that supplies the enum values that are serialized
542
+ /// and restored.
543
+ ///
544
+ /// If a value is encountered that is not null or a value in this set,
545
+ /// [fromPrimitives] will assert when restoring.
546
+ ///
547
+ /// It is typically set to the `values` list of the enum type.
548
+ ///
549
+ /// In addition to this set, because [RestorableEnumN] allows nullable values,
550
+ /// null is also a valid value, even though it doesn't appear in this set.
551
+ ///
552
+ /// {@tool snippet} For example, to create a [RestorableEnumN] with an
553
+ /// [AxisDirection] enum value, with a default value of null, you would build
554
+ /// it like the code below:
555
+ ///
556
+ /// ```dart
557
+ /// RestorableEnumN<AxisDirection> axis = RestorableEnumN<AxisDirection>(null, values: AxisDirection.values);
558
+ /// ```
559
+ /// {@end-tool}
560
+ Set <T > values;
561
+
562
+ @override
563
+ void didUpdateValue (T ? oldValue) {
564
+ notifyListeners ();
565
+ }
566
+
567
+ @override
568
+ T ? fromPrimitives (Object ? data) {
569
+ if (data == null ) {
570
+ return null ;
571
+ }
572
+ if (data is String ) {
573
+ for (final T allowed in values) {
574
+ if (allowed.name == data) {
575
+ return allowed;
576
+ }
577
+ }
578
+ assert (false ,
579
+ 'Attempted to set an unknown enum value "$data " that is not null, or '
580
+ 'in the valid set of enum values for the $T type: '
581
+ '${values .map <String >((T value ) => value .name ).toSet ()}' );
582
+ }
583
+ return _defaultValue;
584
+ }
585
+
586
+ @override
587
+ Object ? toPrimitives () => value? .name;
588
+ }
589
+
590
+
591
+ /// A [RestorableProperty] that knows how to store and restore an [Enum]
592
+ /// type.
593
+ ///
594
+ /// {@macro flutter.widgets.RestorableNum}
595
+ ///
596
+ /// The values are serialized using the name of the enum, obtained using the
597
+ /// [EnumName.name] extension accessor.
598
+ ///
599
+ /// The represented value is accessible via the [value] getter.
600
+ ///
601
+ /// See also:
602
+ ///
603
+ /// * [RestorableEnumN] , a class similar to this one that knows how to store and
604
+ /// restore nullable [Enum] types.
605
+ class RestorableEnum <T extends Enum > extends RestorableValue <T > {
606
+ /// Creates a [RestorableEnum] .
607
+ ///
608
+ /// {@macro flutter.widgets.RestorableNum.constructor}
609
+ RestorableEnum (T defaultValue, { required Iterable <T > values })
610
+ : assert (values.contains (defaultValue),
611
+ 'Default value $defaultValue not found in $T values: $values ' ),
612
+ _defaultValue = defaultValue,
613
+ values = values.toSet ();
614
+
615
+ @override
616
+ T createDefaultValue () => _defaultValue;
617
+ final T _defaultValue;
618
+
619
+ @override
620
+ set value (T newValue) {
621
+ assert (values.contains (newValue),
622
+ 'Attempted to set an unknown enum value "$newValue " that is not in the '
623
+ 'valid set of enum values for the $T type: '
624
+ '${values .map <String >((T value ) => value .name ).toSet ()}' );
625
+
626
+ super .value = newValue;
627
+ }
628
+
629
+ /// The set of values that this [RestorableEnum] may represent.
630
+ ///
631
+ /// This is a required field that supplies the possible enum values that can
632
+ /// be serialized and restored.
633
+ ///
634
+ /// If a value is encountered that is not in this set, [fromPrimitives] will
635
+ /// assert when restoring.
636
+ ///
637
+ /// It is typically set to the `values` list of the enum type.
638
+ ///
639
+ /// {@tool snippet} For example, to create a [RestorableEnum] with an
640
+ /// [AxisDirection] enum value, with a default value of [AxisDirection.up] ,
641
+ /// you would build it like the code below:
642
+ ///
643
+ /// ```dart
644
+ /// RestorableEnum<AxisDirection> axis = RestorableEnum<AxisDirection>(AxisDirection.up, values: AxisDirection.values);
645
+ /// ```
646
+ /// {@end-tool}
647
+ Set <T > values;
648
+
649
+ @override
650
+ void didUpdateValue (T ? oldValue) {
651
+ notifyListeners ();
652
+ }
653
+
654
+ @override
655
+ T fromPrimitives (Object ? data) {
656
+ if (data != null && data is String ) {
657
+ for (final T allowed in values) {
658
+ if (allowed.name == data) {
659
+ return allowed;
660
+ }
661
+ }
662
+ assert (false ,
663
+ 'Attempted to restore an unknown enum value "$data " that is not in the '
664
+ 'valid set of enum values for the $T type: '
665
+ '${values .map <String >((T value ) => value .name ).toSet ()}' );
666
+ }
667
+ return _defaultValue;
668
+ }
669
+
670
+ @override
671
+ Object toPrimitives () => value.name;
672
+ }
0 commit comments