buildByMaterial method

  1. @override
Widget buildByMaterial(
  1. BuildContext context
)

build on material mode

Implementation

@override
Widget buildByMaterial(BuildContext context) {
  final VoidCallback? _onPressed = valueOf('onPressed', onPressed);
  final bool _adaptiveHaptics = valueOf('adaptiveHaptics', adaptiveHaptics);

  // Enhanced onPressed with haptic feedback
  VoidCallback? _enhancedOnPressed;
  if (_onPressed != null) {
    _enhancedOnPressed = () {
      if (_adaptiveHaptics) {
        HapticFeedback.selectionClick(); // Consistent with iOS
      }
      _onPressed();
    };
  }

  // Material 3 enhanced styling
  final ThemeData theme = Theme.of(context);
  final ColorScheme colorScheme = theme.colorScheme;

  // Enhanced icon color for Material 3
  Color? iconColor = valueOf('color', color);
  if (theme.useMaterial3 && iconColor == null) {
    iconColor = colorScheme.onSurface;
  }

  // Determine which icon to use (fallback logic for Material)
  IconData? iconData;
  final String? _symbol = valueOf('symbol', symbol);
  final IconData? _icon = valueOf('icon', icon);
  final IconData? _fallbackIcon = valueOf('fallbackIcon', fallbackIcon);

  if (_icon != null) {
    // Use provided icon
    iconData = _icon;
  } else if (_symbol != null && _fallbackIcon != null) {
    // Use fallback icon when symbol is provided on Android
    iconData = _fallbackIcon;
  } else if (_icon == null && _fallbackIcon == null) {
    // If symbol is provided but no fallback, use a default icon
    iconData = Icons.circle_outlined;
  }

  return IconButton(
    iconSize: valueOf('iconSize', iconSize),
    visualDensity: valueOf('visualDensity', visualDensity),
    padding: valueOf('padding', padding),
    alignment: valueOf('alignment', alignment),
    icon: Icon(iconData, color: iconColor),
    splashRadius: valueOf('splashRadius', splashRadius),
    color: iconColor,
    focusColor: valueOf('focusColor', focusColor) ?? (theme.useMaterial3 ? colorScheme.onSurface.withOpacity(0.12) : null),
    hoverColor: valueOf('hoverColor', hoverColor) ?? (theme.useMaterial3 ? colorScheme.onSurface.withOpacity(0.08) : null),
    highlightColor: valueOf('highlightColor', highlightColor) ?? (theme.useMaterial3 ? colorScheme.onSurface.withOpacity(0.12) : null),
    splashColor: valueOf('splashColor', splashColor) ?? (theme.useMaterial3 ? colorScheme.onSurface.withOpacity(0.12) : null),
    disabledColor: valueOf('disabledColor', disabledColor) ?? (theme.useMaterial3 ? colorScheme.onSurface.withOpacity(0.38) : null),
    onPressed: _enhancedOnPressed,
    mouseCursor: valueOf('mouseCursor', mouseCursor),
    focusNode: valueOf('focusNode', focusNode),
    autofocus: valueOf('autofocus', autofocus),
    tooltip: valueOf('tooltip', tooltip),
    enableFeedback: valueOf('enableFeedback', enableFeedback),
    constraints: valueOf('constraints', constraints),
  );
}