WidgetStateProperty<T>.fromMap constructor
- WidgetStateMap<
T> map
Creates a property that resolves using a WidgetStateMap.
This constructor's resolve method finds the first MapEntry whose key is satisfied by the set of states, and returns its associated value.
Resolves to null
if no keys match, or if T
is non-nullable,
the method throws an ArgumentError.
To prevent a situation where each WidgetStatesConstraint
isn't satisfied by the given set of states, consider adding
WidgetState.any as the final WidgetStateMap key.
Example:
// This WidgetStateMap<Color?> resolves to null if no keys match.
WidgetStateProperty<Color?>.fromMap(<WidgetStatesConstraint, Color?>{
WidgetState.error: Colors.red,
WidgetState.hovered & WidgetState.focused: Colors.blueAccent,
WidgetState.focused: Colors.blue,
~WidgetState.disabled: Colors.black,
});
// The same can be accomplished with a WidgetPropertyResolver,
// but it's more verbose:
WidgetStateProperty.resolveWith<Color?>((Set<WidgetState> states) {
if (states.contains(WidgetState.error)) {
return Colors.red;
} else if (states.contains(WidgetState.hovered) && states.contains(WidgetState.focused)) {
return Colors.blueAccent;
} else if (states.contains(WidgetState.focused)) {
return Colors.blue;
} else if (!states.contains(WidgetState.disabled)) {
return Colors.black;
}
return null;
});
A widget state combination can be stored in a variable, and WidgetState.any can be used for non-nullable types to ensure that there's a match:
final WidgetStatesConstraint selectedError = WidgetState.selected & WidgetState.error;
final WidgetStateProperty<Color> color = WidgetStateProperty<Color>.fromMap(
<WidgetStatesConstraint, Color>{
selectedError & WidgetState.hovered: Colors.redAccent,
selectedError: Colors.red,
WidgetState.any: Colors.black,
},
);
// The (more verbose) WidgetPropertyResolver implementation:
final WidgetStateProperty<Color> colorResolveWith = WidgetStateProperty.resolveWith<Color>(
(Set<WidgetState> states) {
if (states.containsAll(<WidgetState>{WidgetState.selected, WidgetState.error})) {
if (states.contains(WidgetState.hovered)) {
return Colors.redAccent;
}
return Colors.red;
}
return Colors.black;
},
);
Implementation
const factory WidgetStateProperty.fromMap(WidgetStateMap<T> map) = WidgetStateMapper<T>;