SDropdown class

A fully custom dropdown widget built from scratch for String items with complete control over dimensions and behavior. This widget provides a native Flutter dropdown implementation with:

  • Full control over widget width and height
  • Simplified API focused on String items only
  • Custom overlay system using CompositedTransformTarget/Follower
  • Minimal external dependencies: uses a small set of helper packages for responsive sizing, indexed lists, and animation helpers
  • Comprehensive styling through SDropdownDecoration
  • Support for item-specific text styles
  • Scroll controller support for precise positioning
  • Native Flutter performance and behavior
  • Smooth roll-up/down animations with fade effects
Inheritance
Available extensions

Constructors

SDropdown({Key? key, required List<String> items, List<String> customItemsNamesDisplayed = const [], double? width, double? height, double? overlayHeight, double? overlayWidth, double? scale, String? selectedItem, String? initialItem, String? hintText, dynamic onChanged(String?)?, TextStyle? itemTextStyle, TextStyle? headerTextStyle, TextStyle? hintTextStyle, Map<String, TextStyle>? itemSpecificStyles, Color? closedFillColor, Color? expandedFillColor, Border? closedBorder, Border? expandedBorder, BorderRadius? closedBorderRadius, BorderRadius? expandedBorderRadius, EdgeInsets? closedHeaderPadding, EdgeInsets? expandedHeaderPadding, EdgeInsets? itemsListPadding, EdgeInsets? listItemPadding, ScrollController? itemsScrollController, bool excludeSelected = true, bool canCloseOutsideBounds = true, bool enabled = true, AlignmentGeometry? alignment, int maxLines = 1, Widget? suffixIcon, Widget? prefixIcon, String? validator(String?)?, bool validateOnChange = true, SDropdownDecoration? decoration, Color? headerExpandedColor, String? selectedItemText, SDropdownController? controller, int? autoScrollMaxFrameDelay, int? autoScrollEndOfFrameDelay, bool useKeyboardNavigation = true, FocusNode? focusNode, bool requestFocusOnInit = false})
const

Properties

alignment AlignmentGeometry?
Alignment of the widget within its parent
final
autoScrollEndOfFrameDelay int?
final
autoScrollMaxFrameDelay int?
final
canCloseOutsideBounds bool
Whether the dropdown can be closed by tapping outside
final
closedBorder Border?
Border for the closed dropdown
final
closedBorderRadius BorderRadius?
Border radius for the closed dropdown
final
closedFillColor Color?
Background color of the closed dropdown
final
closedHeaderPadding EdgeInsets?
Padding for the closed header
final
controller SDropdownController?
Controller used to manage the dropdown programmatically
final
customItemsNamesDisplayed List<String>
The list of string items to display
final
decoration SDropdownDecoration?
Custom decoration for the dropdown
final
enabled bool
Whether the dropdown is enabled
final
excludeSelected bool
Whether to exclude the selected item from the dropdown list
final
expandedBorder Border?
Border for the expanded dropdown overlay
final
expandedBorderRadius BorderRadius?
Border radius for the expanded dropdown overlay
final
expandedFillColor Color?
Background color of the expanded dropdown overlay
final
expandedHeaderPadding EdgeInsets?
Padding for the expanded header
final
focusNode FocusNode?
Optional FocusNode for keyboard navigation. If not provided and useKeyboardNavigation is true, an internal FocusNode will be created.
final
hashCode int
The hash code for this object.
no setterinherited
headerExpandedColor Color?
Color for the header when expanded
final
headerTextStyle TextStyle?
Text style for the header (selected item)
final
height double?
The height of the dropdown widget
final
hintText String?
Hint text to display when no item is selected
final
hintTextStyle TextStyle?
Text style for the hint text
final
initialItem String?
Initial selected item (if no controller is used)
final
items List<String>
The list of string items to display
final
itemsListPadding EdgeInsets?
Padding for the items list
final
itemSpecificStyles Map<String, TextStyle>?
Map of item-specific text styles
final
itemsScrollController ScrollController?
Scroll controller for the items list (wrapped internally by an IndexedScrollController)
final
itemTextStyle TextStyle?
Text style for dropdown items
final
key Key?
Controls how one widget replaces another widget in the tree.
finalinherited
listItemPadding EdgeInsets?
Padding for each list item
final
makeRefreshable Widget

Available on Widget?, provided by the WidgetExtension extension

Make your any widget refreshable with RefreshIndicator on top
no setter
maxLines int
Maximum lines for text display
final
onChanged → dynamic Function(String?)?
Callback when selection changes
final
overlayHeight double?
The height of the dropdown overlay when expanded
final
overlayWidth double?
The width of the dropdown overlay when expanded
final
prefixIcon Widget?
Prefix icon for the closed dropdown
final
requestFocusOnInit bool
Whether to request focus on initialization when useKeyboardNavigation is true
final
runtimeType Type
A representation of the runtime type of the object.
no setterinherited
scale double?
Scale factor for the entire widget
final
selectedItem String?
The currently selected item
final
selectedItemText String?
The currently selected item
final
suffixIcon Widget?
Suffix icon for the closed dropdown
final
useKeyboardNavigation bool
Whether to enable keyboard navigation (arrow keys, enter, escape)
final
validateOnChange bool
Whether to validate on change
final
validator String? Function(String?)?
Validator function
final
width double?
The width of the dropdown widget
final

Methods

addMaterialWidget() Material

Available on Widget, provided by the GenericExtensions extension

addTooltipWidget(String toolTip) Tooltip

Available on Widget, provided by the GenericExtensions extension

animate({Key? key, List<Effect>? effects, AnimateCallback? onInit, AnimateCallback? onPlay, AnimateCallback? onComplete, bool? autoPlay, Duration? delay, AnimationController? controller, Adapter? adapter, double? target, double? value}) Animate

Available on Widget, provided by the AnimateWidgetExtensions extension

Wraps the target Widget in an Animate instance, and returns the instance for chaining calls. Ex. myWidget.animate() is equivalent to Animate(child: myWidget).
borderRadius([BorderRadiusGeometry? borderRadius]) Widget

Available on Widget, provided by the GenericExtensions extension

boxDecoration([BoxDecoration? boxDecoration]) Widget

Available on Widget, provided by the GenericExtensions extension

center({double? heightFactor, double? widthFactor}) Widget

Available on Widget?, provided by the WidgetExtension extension

set parent widget in center
colorFilter([ColorFilter? colorFilter]) Widget

Available on Widget, provided by the GenericExtensions extension

set parent widget in center
copyWith({double? width, double? height, double? overlayHeight, double? overlayWidth, double? scale, List<String>? items, String? selectedItem, String? initialItem, String? hintText, dynamic onChanged(String?)?, TextStyle? itemTextStyle, TextStyle? headerTextStyle, TextStyle? hintTextStyle, Map<String, TextStyle>? itemSpecificStyles, Color? closedFillColor, Color? expandedFillColor, Border? closedBorder, Border? expandedBorder, BorderRadius? closedBorderRadius, BorderRadius? expandedBorderRadius, EdgeInsets? closedHeaderPadding, EdgeInsets? expandedHeaderPadding, EdgeInsets? itemsListPadding, EdgeInsets? listItemPadding, ScrollController? itemsScrollController, bool? excludeSelected, bool? canCloseOutsideBounds, bool? enabled, AlignmentGeometry? alignment, int? maxLines, Widget? suffixIcon, Widget? prefixIcon, String? validator(String?)?, bool? validateOnChange, SDropdownDecoration? decoration, SDropdownController? controller, bool? useKeyboardNavigation, FocusNode? focusNode, bool? requestFocusOnInit}) SDropdown

Available on SDropdown, provided by the SDropdownExtension extension

Creates a copy of this dropdown with modified properties
cornerRadiusWithClipRRect(double radius) ClipRRect

Available on Widget?, provided by the WidgetExtension extension

add corner radius
cornerRadiusWithClipRRectOnly({int bottomLeft = 0, int bottomRight = 0, int topLeft = 0, int topRight = 0}) ClipRRect

Available on Widget?, provided by the WidgetExtension extension

add custom corner radius each side
createElement() StatefulElement
Creates a StatefulElement to manage this widget's location in the tree.
inherited
createState() State<SDropdown>
Creates the mutable state for this widget at a given location in the tree.
override
debugDescribeChildren() List<DiagnosticsNode>
Returns a list of DiagnosticsNode objects describing this node's children.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
Add additional properties associated with the node.
inherited
expand({int flex = 1}) Widget

Available on Widget?, provided by the WidgetExtension extension

add Expanded to parent widget
fit({BoxFit? fit, AlignmentGeometry? alignment}) Widget

Available on Widget?, provided by the WidgetExtension extension

add FittedBox to parent widget
flexible({int flex = 1, FlexFit? fit}) Widget

Available on Widget?, provided by the WidgetExtension extension

add Flexible to parent widget
launch<T>(BuildContext context, {bool isNewTask = false, PageRouteAnimation? pageRouteAnimation, Duration? duration, String? routeName, Object? routeArguments}) Future<T?>

Available on Widget?, provided by the WidgetExtension extension

Launch a new screen
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
onTap(Function? function, {BorderRadius? borderRadius, Color? splashColor, Color? hoverColor, Color? highlightColor, Color? focusColor, WidgetStateProperty<Color?>? overlayColor}) Widget

Available on Widget?, provided by the WidgetExtension extension

add tap to parent widget
opacity({required double opacity, int durationInSecond = 1, Duration? duration}) Widget

Available on Widget?, provided by the WidgetExtension extension

add opacity to parent widget
paddingAll(double padding) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding all
paddingBottom(double bottom) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding bottom
paddingDirectional({double start = 0.0, double top = 0.0, double end = 0.0, double bottom = 0.0}) Widget

Available on Widget?, provided by the WidgetExtension extension

paddingLeft(double left) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding left
paddingOnly({double top = 0.0, double left = 0.0, double bottom = 0.0, double right = 0.0}) Padding

Available on Widget?, provided by the WidgetExtension extension

return custom padding from each side
paddingRight(double right) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding right
paddingSymmetric({double vertical = 0.0, double horizontal = 0.0}) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding symmetric
paddingTop(double top) Padding

Available on Widget?, provided by the WidgetExtension extension

return padding top
rotate({required double angle, bool transformHitTests = true, Offset? origin}) Widget

Available on Widget?, provided by the WidgetExtension extension

add rotation to parent widget
scale({required double scale, Offset? origin, AlignmentGeometry? alignment, bool transformHitTests = true}) Widget

Available on Widget?, provided by the WidgetExtension extension

add scaling to parent widget
toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) DiagnosticsNode
Returns a debug representation of the object that is used by debugging tools and by DiagnosticsNode.toStringDeep.
inherited
tooltip({required String msg}) Widget

Available on Widget?, provided by the WidgetExtension extension

toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) String
A string representation of this object.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) String
Returns a string representation of this node and its descendants.
inherited
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) String
Returns a one-line detailed description of the object.
inherited
toStringShort() String
A short, textual description of this widget.
inherited
translate({required Offset offset, bool transformHitTests = true, Key? key}) Widget

Available on Widget?, provided by the WidgetExtension extension

add translate to parent widget
validate({Widget value = const SizedBox()}) Widget

Available on Widget?, provided by the WidgetExtension extension

Validate given widget is not null and returns given value if null.
visible(bool visible, {Widget? defaultWidget}) Widget

Available on Widget?, provided by the WidgetExtension extension

set visibility
withHeight(double height) SizedBox

Available on Widget?, provided by the WidgetExtension extension

With custom height
withRoundedCorners({Color backgroundColor = whiteColor, BorderRadius borderRadius = const BorderRadius.all(Radius.circular(8.0)), LinearGradient? gradient, BoxBorder? border, List<BoxShadow>? boxShadow, DecorationImage? decorationImage, BoxShape boxShape = BoxShape.rectangle}) Container

Available on Widget?, provided by the WidgetExtension extension

withScroll({ScrollPhysics? physics, EdgeInsetsGeometry? padding, Axis scrollDirection = Axis.vertical, ScrollController? controller, DragStartBehavior dragStartBehavior = DragStartBehavior.start, bool? primary, required bool reverse}) Widget

Available on Widget?, provided by the WidgetExtension extension

withShaderMask(List<Color> colors, {BlendMode blendMode = BlendMode.srcATop}) Widget

Available on Widget?, provided by the WidgetExtension extension

Wrap with ShaderMask widget
withShaderMaskGradient(Gradient gradient, {BlendMode blendMode = BlendMode.srcATop}) Widget

Available on Widget?, provided by the WidgetExtension extension

Wrap with ShaderMask widget Gradient
withShadow({Color bgColor = whiteColor, Color shadowColor = Colors.black12, dynamic blurRadius = 10.0, dynamic spreadRadius = 0.0, Offset offset = const Offset(0.0, 0.0), LinearGradient? gradient, BoxBorder? border, DecorationImage? decorationImage, BoxShape boxShape = BoxShape.rectangle}) Container

Available on Widget?, provided by the WidgetExtension extension

withSize({double width = 0.0, double height = 0.0}) SizedBox

Available on Widget?, provided by the WidgetExtension extension

With custom height and width
withTooltip({required String msg}) Widget

Available on Widget?, provided by the WidgetExtension extension

Validate given widget is not null and returns given value if null.
withVisibility(bool visible, {Widget? replacement, bool maintainAnimation = false, bool maintainState = false, bool maintainSize = false, bool maintainSemantics = false, bool maintainInteractivity = false}) Visibility

Available on Widget?, provided by the WidgetExtension extension

set widget visibility
withWidth(double width) SizedBox

Available on Widget?, provided by the WidgetExtension extension

With custom width

Operators

operator ==(Object other) bool
The equality operator.
inherited