buildByMaterial method
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),
);
}