import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:flutter/material.dart'; class CustomDropdownButton2 extends StatelessWidget { final String hint; final String? value; final List dropdownItems; final ValueChanged? onChanged; final DropdownButtonBuilder? selectedItemBuilder; final Alignment? hintAlignment; final Alignment? valueAlignment; final double? buttonHeight, buttonWidth; final EdgeInsetsGeometry? buttonPadding; final BoxDecoration? buttonDecoration; final int? buttonElevation; final Widget? icon; final double? iconSize; final Color? iconEnabledColor; final Color? iconDisabledColor; final double? itemHeight; final EdgeInsetsGeometry? itemPadding; final double? dropdownHeight, dropdownWidth; final EdgeInsetsGeometry? dropdownPadding; final BoxDecoration? dropdownDecoration; final int? dropdownElevation; final Radius? scrollbarRadius; final double? scrollbarThickness; final bool? scrollbarAlwaysShow; final Offset offset; const CustomDropdownButton2({ required this.hint, required this.value, required this.dropdownItems, required this.onChanged, this.selectedItemBuilder, this.hintAlignment, this.valueAlignment, this.buttonHeight, this.buttonWidth, this.buttonPadding, this.buttonDecoration, this.buttonElevation, this.icon, this.iconSize, this.iconEnabledColor, this.iconDisabledColor, this.itemHeight, this.itemPadding, this.dropdownHeight, this.dropdownWidth, this.dropdownPadding, this.dropdownDecoration, this.dropdownElevation, this.scrollbarRadius, this.scrollbarThickness, this.scrollbarAlwaysShow, this.offset = const Offset(0, 0), Key? key, }) : super(key: key); @override Widget build(BuildContext context) { return DropdownButtonHideUnderline( child: DropdownButton2( //To avoid long text overflowing. isExpanded: true, hint: Container( alignment: hintAlignment, child: Text( hint, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( fontSize: 14, color: Theme.of(context).hintColor, ), ), ), value: value, items: dropdownItems .map((item) => DropdownMenuItem( value: item, child: Container( alignment: valueAlignment, child: Text( item, overflow: TextOverflow.ellipsis, maxLines: 1, style: const TextStyle( fontSize: 14, ), ), ), )) .toList(), onChanged: onChanged, selectedItemBuilder: selectedItemBuilder, buttonStyleData: ButtonStyleData( height: buttonHeight ?? 40, width: buttonWidth ?? 140, padding: buttonPadding ?? const EdgeInsets.only(left: 14, right: 14), decoration: buttonDecoration ?? BoxDecoration( borderRadius: BorderRadius.circular(14), border: Border.all( color: Colors.black45, ), ), elevation: buttonElevation, ), iconStyleData: IconStyleData( icon: icon ?? const Icon(Icons.arrow_forward_ios_outlined), iconSize: iconSize ?? 12, iconEnabledColor: iconEnabledColor, iconDisabledColor: iconDisabledColor, ), dropdownStyleData: DropdownStyleData( //Max height for the dropdown menu & becoming scrollable if there are more items. If you pass Null it will take max height possible for the items. maxHeight: dropdownHeight ?? 200, width: dropdownWidth ?? 140, padding: dropdownPadding, decoration: dropdownDecoration ?? BoxDecoration( borderRadius: BorderRadius.circular(14), ), elevation: dropdownElevation ?? 8, //Null or Offset(0, 0) will open just under the button. You can edit as you want. offset: offset, //Default is false to show menu below button isOverButton: false, scrollbarTheme: ScrollbarThemeData( radius: scrollbarRadius ?? const Radius.circular(40), thickness: scrollbarThickness != null ? MaterialStateProperty.all(scrollbarThickness!) : null, thumbVisibility: scrollbarAlwaysShow != null ? MaterialStateProperty.all(scrollbarAlwaysShow!) : null, ), ), menuItemStyleData: MenuItemStyleData( height: itemHeight ?? 40, padding: itemPadding ?? const EdgeInsets.only(left: 14, right: 14), ), ), ); } }