checkboxTheme static method

CheckboxThemeData checkboxTheme({
  1. required ColorScheme colorScheme,
  2. SchemeColor? baseSchemeColor,
  3. double? splashRadius,
  4. bool? unselectedIsColored,
  5. bool? useTintedInteraction,
  6. bool? useTintedDisable,
  7. 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;
      },
    ),
  );
}