buildByMaterial method

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

build on material mode

Implementation

@override
Widget buildByMaterial(BuildContext context) {
  // Build menu items with submenu support for Material fallback
  final menuItemIndex = _MenuItemIndexCounter();
  final menuItems = _buildMaterialMenuItems(context, items, menuItemIndex);
  final theme = Theme.of(context);
  final colorScheme = theme.colorScheme;

  if (_isIconButton && buttonIcon != null) {
    return PopupMenuButton<int>(
      itemBuilder: (context) => menuItems,
      onSelected: (index) => onSelected?.call(index),
      enabled: enabled,
      icon: Icon(
        _getIconData(buttonIcon!.name),
        size: size * 0.5,
        color: colorScheme.onSurfaceVariant,
      ),
      // Material 3 styling
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(12),
      ),
      elevation: 3,
      surfaceTintColor: colorScheme.surfaceTint,
    );
  } else if (buttonLabel != null) {
    return PopupMenuButton<int>(
      itemBuilder: (context) => menuItems,
      onSelected: (index) => onSelected?.call(index),
      enabled: enabled,
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
        child: Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              buttonLabel!,
              style: theme.textTheme.labelLarge?.copyWith(
                color: colorScheme.onSurface,
              ),
            ),
            const SizedBox(width: 4),
            Icon(
              Icons.arrow_drop_down,
              size: 20,
              color: colorScheme.onSurfaceVariant,
            ),
          ],
        ),
      ),
      // Material 3 styling
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(12),
      ),
      elevation: 3,
      surfaceTintColor: colorScheme.surfaceTint,
    );
  }
  return const SizedBox.shrink();
}