checkboxTheme static method
CheckboxThemeData
checkboxTheme({
- required ColorScheme colorScheme,
- SchemeColor? baseSchemeColor,
- double? splashRadius,
- bool? unselectedIsColored,
- bool? useTintedInteraction,
- bool? useTintedDisable,
- bool? useMaterial3,
An opinionated CheckboxThemeData theme.
Requires a ColorScheme in colorscheme
. The color scheme would
typically be equal the color scheme also used to define the color scheme
for your app theme.
The splashRadius is not used by FlexColorScheme sub-themes.
Implementation
static CheckboxThemeData checkboxTheme({
/// Typically the same `ColorScheme` that is also used for your `ThemeData`.
required final ColorScheme colorScheme,
/// Selects which color from the passed in colorScheme to use as the main
/// color for the checkbox.
///
/// All colors in the color scheme are not good choices, but some work well.
///
/// If not defined, [colorScheme.primary] will be used. This is more in-line
/// with M3 design, but applied to M2 switch. The M3 color design
/// specification for the secondary color, is a poor choice for toggles and
/// switches, primary color works better.
final SchemeColor? baseSchemeColor,
/// The splash radius of the circular Material ink response.
///
/// Defaults to kRadialReactionRadius = 20.
final double? splashRadius,
/// Defines if unselected [Checkbox] is also themed to be [baseSchemeColor].
///
/// If false, it is grey like in Flutter SDK.
///
/// If undefined, defaults to false.
final bool? unselectedIsColored,
/// Defines if the theme uses tinted interaction effects.
///
/// If undefined, defaults to false.
final bool? useTintedInteraction,
/// Defines if the theme uses tinted disabled color.
///
/// If undefined, defaults to false.
final bool? useTintedDisable,
/// A temporary flag used to opt-in to Material 3 features.
///
/// If set to true, the theme will use Material3 default styles when
/// properties are undefined, if false defaults will use FlexColorScheme's
/// own opinionated default values.
///
/// The M2/M3 defaults will only be used for properties that are not
/// defined, if defined they keep their defined values.
///
/// If undefined, defaults to false.
final bool? useMaterial3,
}) {
final bool useM3 = useMaterial3 ?? false;
final bool isBaseColor = unselectedIsColored ?? false;
final bool tintInteract = useTintedInteraction ?? false;
final bool tintDisable = useTintedDisable ?? false;
// Get selected color, defaults to primary.
final SchemeColor baseScheme = baseSchemeColor ?? SchemeColor.primary;
final Color baseColor = schemeColor(baseScheme, colorScheme);
final Color onBaseColor = schemeColorPair(baseScheme, colorScheme);
final bool isLight = colorScheme.brightness == Brightness.light;
// Using these tinted overlay variable in all themes for ease of
// reasoning and duplication.
final Color overlay = colorScheme.surface;
final Color tint = baseColor;
final double factor = _tintAlphaFactor(tint, colorScheme.brightness, true);
return CheckboxThemeData(
splashRadius: splashRadius,
side: MaterialStateBorderSide.resolveWith((Set<MaterialState> states) {
if (useM3) {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: 2.0, color: Colors.transparent);
}
if (tintDisable) {
return BorderSide(
width: 2.0,
color: tintedDisable(colorScheme.onSurface, baseColor));
}
return BorderSide(
width: 2.0,
color: colorScheme.onSurface.withAlpha(kAlphaDisabled));
}
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: 0.0, color: Colors.transparent);
}
if (states.contains(MaterialState.error)) {
return BorderSide(width: 2.0, color: colorScheme.error);
}
if (states.contains(MaterialState.pressed)) {
if (isBaseColor) return BorderSide(width: 2.0, color: baseColor);
return BorderSide(width: 2.0, color: colorScheme.onSurface);
}
if (states.contains(MaterialState.hovered)) {
if (isBaseColor) return BorderSide(width: 2.0, color: baseColor);
return BorderSide(width: 2.0, color: colorScheme.onSurface);
}
if (states.contains(MaterialState.focused)) {
if (isBaseColor) return BorderSide(width: 2.0, color: baseColor);
return BorderSide(width: 2.0, color: colorScheme.onSurface);
}
if (isBaseColor) return BorderSide(width: 2.0, color: baseColor);
return BorderSide(width: 2.0, color: colorScheme.onSurfaceVariant);
}
// M2 version
else {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: 2.0, color: Colors.transparent);
}
if (tintDisable) {
return BorderSide(
width: 2.0,
color: tintedDisable(colorScheme.onSurface, baseColor),
);
}
return BorderSide(
width: 2.0,
color: colorScheme.onSurface.withAlpha(kAlphaDisabled),
);
}
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: 2.0, color: Colors.transparent);
}
if (isBaseColor) return BorderSide(width: 2.0, color: baseColor);
// This is M2 SDK default.
return BorderSide(
width: 2.0, color: isLight ? Colors.black54 : Colors.white70);
}
}),
fillColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
if (useM3) {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
if (tintDisable) {
return tintedDisable(colorScheme.onSurface, baseColor);
}
return colorScheme.onSurface.withAlpha(kAlphaDisabled);
}
return Colors.transparent;
}
if (states.contains(MaterialState.selected)) {
if (states.contains(MaterialState.error)) {
return colorScheme.error;
}
return baseColor;
}
return Colors.transparent;
}
// M2 version
else {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
if (tintDisable) {
return tintedDisable(colorScheme.onSurface, baseColor);
}
return isLight ? Colors.grey.shade400 : Colors.grey.shade800;
}
return Colors.transparent;
}
if (states.contains(MaterialState.selected)) {
return baseColor;
}
return Colors.transparent;
}
},
),
checkColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
if (useM3) {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
return colorScheme.surface;
}
return Colors.transparent;
}
if (states.contains(MaterialState.selected)) {
if (states.contains(MaterialState.error)) {
return colorScheme.onError;
}
return onBaseColor;
}
return Colors.transparent;
}
// M2 version
else {
if (states.contains(MaterialState.disabled)) {
return isLight ? Colors.grey.shade200 : Colors.grey.shade900;
}
if (states.contains(MaterialState.selected)) {
return onBaseColor;
}
return isLight ? Colors.grey.shade50 : Colors.grey.shade400;
}
},
),
overlayColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
// Error state only exists in M3 mode.
if (states.contains(MaterialState.error) && useM3) {
if (states.contains(MaterialState.pressed)) {
return colorScheme.error.withAlpha(kAlphaPressed);
}
if (states.contains(MaterialState.hovered)) {
return colorScheme.error.withAlpha(kAlphaHovered);
}
if (states.contains(MaterialState.focused)) {
return colorScheme.error.withAlpha(kAlphaFocused);
}
}
if (states.contains(MaterialState.selected)) {
if (states.contains(MaterialState.pressed)) {
if (tintInteract) return tintedPressed(overlay, tint, factor);
return colorScheme.onSurface.withAlpha(kAlphaPressed);
}
if (states.contains(MaterialState.hovered)) {
if (tintInteract) return tintedHovered(overlay, tint, factor);
return baseColor.withAlpha(kAlphaHovered);
}
if (states.contains(MaterialState.focused)) {
if (tintInteract) return tintedFocused(overlay, tint, factor);
return baseColor.withAlpha(kAlphaFocused);
}
return Colors.transparent;
}
if (states.contains(MaterialState.pressed)) {
if (tintInteract) return tintedPressed(overlay, tint, factor);
return baseColor.withAlpha(kAlphaPressed);
}
if (states.contains(MaterialState.hovered)) {
if (tintInteract) return tintedHovered(overlay, tint, factor);
return colorScheme.onSurface.withAlpha(kAlphaHovered);
}
if (states.contains(MaterialState.focused)) {
if (tintInteract) return tintedFocused(overlay, tint, factor);
return colorScheme.onSurface.withAlpha(kAlphaFocused);
}
return Colors.transparent;
},
),
);
}