resolveItemStyle method

ButtonStyle resolveItemStyle({
  1. required bool isGroupingTitle,
  2. required bool isSelected,
  3. required bool isMobile,
  4. ButtonStyle? selectedItemButtonStyle,
  5. bool mergeSelectedStyle = false,
  6. ButtonStyle? buttonStyle,
  7. ItemColor? itemColor,
})

Resolves which ButtonStyle to apply to a menu item.

When mergeSelectedStyle is false (default):

  1. selectedItemButtonStyle replaces entirely if the item is selected
  2. buttonStyle — user-provided global style for all items
  3. Default built-in style

When mergeSelectedStyle is true:

  1. Resolves the base style (buttonStyle or default)
  2. Merges selectedItemButtonStyle on top — only the properties defined in selectedItemButtonStyle override the base, the rest are preserved from the current style.

Implementation

ButtonStyle resolveItemStyle({
  required bool isGroupingTitle,
  required bool isSelected,
  required bool isMobile,
  ButtonStyle? selectedItemButtonStyle,
  bool mergeSelectedStyle = false,
  ButtonStyle? buttonStyle,
  ItemColor? itemColor,
}) {
  final baseStyle =
      buttonStyle ??
      ButtonStyle(
        alignment: Alignment.centerLeft,
        elevation: const WidgetStatePropertyAll<double>(7.5),
        overlayColor: const WidgetStatePropertyAll(Colors.transparent),
        backgroundColor: WidgetStateProperty.resolveWith((state) {
          return resolveItemBackgroundColor(
            widgetState: state,
            isGroupingTitle: isGroupingTitle,
            isSelected: isSelected,
            isMobile: isMobile,
            itemColor: itemColor,
          );
        }),
      );

  final isItemSelected = isSelected && !isGroupingTitle;

  return switch ((
    isItemSelected,
    selectedItemButtonStyle,
    mergeSelectedStyle,
  )) {
    (true, final selected?, true) => baseStyle.merge(selected),
    (true, final selected?, false) => selected,
    _ => baseStyle,
  };
}