[State Restoration] RestorableBoolN (#71653)
This commit is contained in:
parent
824c8cd08d
commit
2eee5ae949
@ -143,19 +143,11 @@ abstract class RestorableValue<T> extends RestorableProperty<T> {
|
|||||||
void didUpdateValue(T? oldValue);
|
void didUpdateValue(T? oldValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// _RestorablePrimitiveValue and its subclasses do not allow null values in
|
// _RestorablePrimitiveValueN and its subclasses allows for null values.
|
||||||
// anticipation of NNBD (non-nullability by default).
|
// See [_RestorablePrimitiveValue] for the non-nullable version of this class.
|
||||||
//
|
class _RestorablePrimitiveValueN<T extends Object?> extends RestorableValue<T> {
|
||||||
// If necessary, we can in the future define a new subclass hierarchy that
|
_RestorablePrimitiveValueN(this._defaultValue)
|
||||||
// does allow null values for primitive types. Borrowing from lisp where
|
: assert(debugIsSerializableForRestoration(_defaultValue)),
|
||||||
// functions that returned a bool ended in 'p', a suggested naming scheme for
|
|
||||||
// these new subclasses could be to add 'N' (for nullable) to the end of a
|
|
||||||
// class name (e.g. RestorableIntN, RestorableStringN, etc.) to distinguish them
|
|
||||||
// from their non-nullable friends.
|
|
||||||
class _RestorablePrimitiveValue<T extends Object> extends RestorableValue<T> {
|
|
||||||
_RestorablePrimitiveValue(this._defaultValue)
|
|
||||||
: assert(_defaultValue != null),
|
|
||||||
assert(debugIsSerializableForRestoration(_defaultValue)),
|
|
||||||
super();
|
super();
|
||||||
|
|
||||||
final T _defaultValue;
|
final T _defaultValue;
|
||||||
@ -163,28 +155,43 @@ class _RestorablePrimitiveValue<T extends Object> extends RestorableValue<T> {
|
|||||||
@override
|
@override
|
||||||
T createDefaultValue() => _defaultValue;
|
T createDefaultValue() => _defaultValue;
|
||||||
|
|
||||||
@override
|
|
||||||
set value(T value) {
|
|
||||||
assert(value != null);
|
|
||||||
super.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didUpdateValue(T? oldValue) {
|
void didUpdateValue(T? oldValue) {
|
||||||
assert(debugIsSerializableForRestoration(value));
|
assert(debugIsSerializableForRestoration(value));
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
T fromPrimitives(Object? serialized) => serialized as T;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Object? toPrimitives() => value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// _RestorablePrimitiveValue and its subclasses are non-nullable.
|
||||||
|
// See [_RestorablePrimitiveValueN] for the nullable version of this class.
|
||||||
|
class _RestorablePrimitiveValue<T extends Object> extends _RestorablePrimitiveValueN<T> {
|
||||||
|
_RestorablePrimitiveValue(T _defaultValue)
|
||||||
|
: assert(_defaultValue != null),
|
||||||
|
assert(debugIsSerializableForRestoration(_defaultValue)),
|
||||||
|
super(_defaultValue);
|
||||||
|
|
||||||
|
@override
|
||||||
|
set value(T value) {
|
||||||
|
assert(value != null);
|
||||||
|
super.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
T fromPrimitives(Object? serialized) {
|
T fromPrimitives(Object? serialized) {
|
||||||
assert(serialized != null);
|
assert(serialized != null);
|
||||||
return serialized! as T;
|
return super.fromPrimitives(serialized);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Object toPrimitives() {
|
Object toPrimitives() {
|
||||||
assert(value != null);
|
assert(value != null);
|
||||||
return value;
|
return super.toPrimitives()!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,9 +256,28 @@ class RestorableBool extends _RestorablePrimitiveValue<bool> {
|
|||||||
/// Creates a [RestorableBool].
|
/// Creates a [RestorableBool].
|
||||||
///
|
///
|
||||||
/// {@macro flutter.widgets.RestorableNum.constructor}
|
/// {@macro flutter.widgets.RestorableNum.constructor}
|
||||||
|
///
|
||||||
|
/// See also:
|
||||||
|
///
|
||||||
|
/// * [RestorableBoolN] for the nullable version of this class.
|
||||||
RestorableBool(bool defaultValue) : assert(defaultValue != null), super(defaultValue);
|
RestorableBool(bool defaultValue) : assert(defaultValue != null), super(defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A [RestorableProperty] that knows how to store and restore a [bool] that is
|
||||||
|
/// nullable.
|
||||||
|
///
|
||||||
|
/// {@macro flutter.widgets.RestorableNum}
|
||||||
|
class RestorableBoolN extends _RestorablePrimitiveValueN<bool?> {
|
||||||
|
/// Creates a [RestorableBoolN].
|
||||||
|
///
|
||||||
|
/// {@macro flutter.widgets.RestorableNum.constructor}
|
||||||
|
///
|
||||||
|
/// See also:
|
||||||
|
///
|
||||||
|
/// * [RestorableBool] for the non-nullable version of this class.
|
||||||
|
RestorableBoolN(bool? defaultValue) : super(defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
/// A base class for creating a [RestorableProperty] that stores and restores a
|
/// A base class for creating a [RestorableProperty] that stores and restores a
|
||||||
/// [Listenable].
|
/// [Listenable].
|
||||||
///
|
///
|
||||||
@ -313,17 +339,17 @@ abstract class RestorableListenable<T extends Listenable> extends RestorableProp
|
|||||||
abstract class RestorableChangeNotifier<T extends ChangeNotifier> extends RestorableListenable<T> {
|
abstract class RestorableChangeNotifier<T extends ChangeNotifier> extends RestorableListenable<T> {
|
||||||
@override
|
@override
|
||||||
void initWithValue(T value) {
|
void initWithValue(T value) {
|
||||||
_diposeOldValue();
|
_disposeOldValue();
|
||||||
super.initWithValue(value);
|
super.initWithValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_diposeOldValue();
|
_disposeOldValue();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _diposeOldValue() {
|
void _disposeOldValue() {
|
||||||
if (_value != null) {
|
if (_value != null) {
|
||||||
// Scheduling a microtask for dispose to give other entities a chance
|
// Scheduling a microtask for dispose to give other entities a chance
|
||||||
// to remove their listeners first.
|
// to remove their listeners first.
|
||||||
|
@ -13,6 +13,7 @@ void main() {
|
|||||||
expect(() => RestorableInt(1).value, throwsAssertionError);
|
expect(() => RestorableInt(1).value, throwsAssertionError);
|
||||||
expect(() => RestorableString('hello').value, throwsAssertionError);
|
expect(() => RestorableString('hello').value, throwsAssertionError);
|
||||||
expect(() => RestorableBool(true).value, throwsAssertionError);
|
expect(() => RestorableBool(true).value, throwsAssertionError);
|
||||||
|
expect(() => RestorableBoolN(true).value, throwsAssertionError);
|
||||||
expect(() => RestorableTextEditingController().value, throwsAssertionError);
|
expect(() => RestorableTextEditingController().value, throwsAssertionError);
|
||||||
expect(() => _TestRestorableValue().value, throwsAssertionError);
|
expect(() => _TestRestorableValue().value, throwsAssertionError);
|
||||||
});
|
});
|
||||||
@ -125,6 +126,7 @@ void main() {
|
|||||||
state.intValue.value = 10;
|
state.intValue.value = 10;
|
||||||
state.stringValue.value = 'guten tag';
|
state.stringValue.value = 'guten tag';
|
||||||
state.boolValue.value = true;
|
state.boolValue.value = true;
|
||||||
|
state.nullableBoolValue.value = false;
|
||||||
state.controllerValue.value.text = 'blabla';
|
state.controllerValue.value.text = 'blabla';
|
||||||
state.objectValue.value = 53;
|
state.objectValue.value = 53;
|
||||||
});
|
});
|
||||||
@ -140,6 +142,7 @@ void main() {
|
|||||||
state.intValue.value = 20;
|
state.intValue.value = 20;
|
||||||
state.stringValue.value = 'ciao';
|
state.stringValue.value = 'ciao';
|
||||||
state.boolValue.value = false;
|
state.boolValue.value = false;
|
||||||
|
state.nullableBoolValue.value = null;
|
||||||
state.controllerValue.value.text = 'blub';
|
state.controllerValue.value.text = 'blub';
|
||||||
state.objectValue.value = 20;
|
state.objectValue.value = 20;
|
||||||
});
|
});
|
||||||
@ -154,6 +157,7 @@ void main() {
|
|||||||
expect(state.intValue.value, 10);
|
expect(state.intValue.value, 10);
|
||||||
expect(state.stringValue.value, 'guten tag');
|
expect(state.stringValue.value, 'guten tag');
|
||||||
expect(state.boolValue.value, true);
|
expect(state.boolValue.value, true);
|
||||||
|
expect(state.nullableBoolValue.value, false);
|
||||||
expect(state.controllerValue.value.text, 'blabla');
|
expect(state.controllerValue.value.text, 'blabla');
|
||||||
expect(state.objectValue.value, 53);
|
expect(state.objectValue.value, 53);
|
||||||
expect(find.text('guten tag'), findsOneWidget);
|
expect(find.text('guten tag'), findsOneWidget);
|
||||||
@ -166,6 +170,7 @@ void main() {
|
|||||||
expect(state.intValue.value, 42);
|
expect(state.intValue.value, 42);
|
||||||
expect(state.stringValue.value, 'hello world');
|
expect(state.stringValue.value, 'hello world');
|
||||||
expect(state.boolValue.value, false);
|
expect(state.boolValue.value, false);
|
||||||
|
expect(state.nullableBoolValue.value, null);
|
||||||
expect(state.controllerValue.value.text, 'FooBar');
|
expect(state.controllerValue.value.text, 'FooBar');
|
||||||
expect(state.objectValue.value, 55);
|
expect(state.objectValue.value, 55);
|
||||||
expect(find.text('hello world'), findsOneWidget);
|
expect(find.text('hello world'), findsOneWidget);
|
||||||
@ -323,6 +328,7 @@ class _RestorableWidgetState extends State<_RestorableWidget> with RestorationMi
|
|||||||
final RestorableInt intValue = RestorableInt(42);
|
final RestorableInt intValue = RestorableInt(42);
|
||||||
final RestorableString stringValue = RestorableString('hello world');
|
final RestorableString stringValue = RestorableString('hello world');
|
||||||
final RestorableBool boolValue = RestorableBool(false);
|
final RestorableBool boolValue = RestorableBool(false);
|
||||||
|
final RestorableBoolN nullableBoolValue = RestorableBoolN(null);
|
||||||
final RestorableTextEditingController controllerValue = RestorableTextEditingController(text: 'FooBar');
|
final RestorableTextEditingController controllerValue = RestorableTextEditingController(text: 'FooBar');
|
||||||
final _TestRestorableValue objectValue = _TestRestorableValue();
|
final _TestRestorableValue objectValue = _TestRestorableValue();
|
||||||
|
|
||||||
@ -332,7 +338,8 @@ class _RestorableWidgetState extends State<_RestorableWidget> with RestorationMi
|
|||||||
registerForRestoration(doubleValue, 'double');
|
registerForRestoration(doubleValue, 'double');
|
||||||
registerForRestoration(intValue, 'int');
|
registerForRestoration(intValue, 'int');
|
||||||
registerForRestoration(stringValue, 'string');
|
registerForRestoration(stringValue, 'string');
|
||||||
registerForRestoration(boolValue,'bool');
|
registerForRestoration(boolValue, 'bool');
|
||||||
|
registerForRestoration(nullableBoolValue, 'nullableBool');
|
||||||
registerForRestoration(controllerValue, 'controller');
|
registerForRestoration(controllerValue, 'controller');
|
||||||
registerForRestoration(objectValue, 'object');
|
registerForRestoration(objectValue, 'object');
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user