TrademarkTrademark
Docs
Ctrl k
Search docs...
Components

DropdownWrapper

Updated: October 18, 2026
View on GitHub
Soon
Not released yet. This is on main and is not in any published version yet. It will not install today.

DropdownWrapper opens a menu next to its trigger. It measures the trigger on screen and draws the menu in a transparent modal over everything else, under the trigger by default. If there is no room below, the menu opens above. Pressing outside the menu or the back button closes it. The menu is a Dropdown, the bordered surface, and its items are usually Options. See the web DropdownWrapper page for the web version.

Basic usage

Pass the trigger and the menu's content. The wrapper keeps its own open state. Pressing an Option calls onSelect with its value and closes the menu.

Controlled with a selected option

Pass open and onOpenChange to control the menu. selectedOption marks the Option with that value as selected, unless the option sets selected itself.

Placement and width

placement picks the side of the trigger and the edge the menu lines up with. It defaults to "bottom-start". fillWidth stretches the trigger and gives the menu its width. minWidth and maxWidth are in rem, as on the web. With closeAfterClick={false} the menu stays open after a pick.

Differences from the web

  • The menu is drawn in a transparent React Native Modal, placed with measureInWindow. It is placed when it opens and does not follow the trigger if the screen scrolls underneath it.
  • onSelect, selectedOption and closeAfterClick reach every Option written in dropdown, also inside fragments and layout elements such as Column. They do not reach options rendered inside a component of your own, or other elements with a data-value: handle those with open and onOpenChange.
  • A trigger that is pressable itself, such as a Button, keeps its own onPress; the wrapper adds its toggle after it. A screen reader reads the trigger as one button that opens a menu.
  • isOpen is accepted as another name for open.
  • There is no keyboard or arrow navigation, so handleArrowNavigation, navigationLayout, columns, optionsCount and dropdownId are not available. There is no nested mode, no onFocusCapture or onBlurCapture, and no className.
  • The web's Dropdown is a row around a column; the native one is a column that scrolls when the screen holds it short.

API reference

Prop
Type
Default
Description
triggerReactNodeWhat opens the menu. Required.
dropdownReactNodeThe menu's content, usually Options. Required.
openbooleanThe open state, controlled. Leave it out for the wrapper to keep its own.
isOpenbooleanAnother name for open. open wins when both are set.
onOpenChange(open: boolean) => voidCalled when the menu opens or closes.
placementPlacement"bottom-start""top", "right", "bottom" or "left", optionally with -start or -end.
closeAfterClickbooleantrueCloses the menu when an Option is pressed.
onSelect(value: string) => voidCalled with a pressed Option's value.
selectedOptionstringMarks the Option with this value as selected.
fillWidthbooleanfalseThe trigger fills its container and the menu matches its width.
minWidthnumberThe menu's minimum width, in rem.
maxWidthnumberThe menu's maximum width, in rem. It never grows past the screen.
minHeightnumberThe menu's minimum height, in points.
disableTriggerClickbooleanfalsePresses on the trigger do nothing. open still works.
styleStyleProp<ViewStyle>Style for the view around the trigger.
Prop
Type
Default
Description
childrenReactNodeThe options.
onSelect(value: string) => voidCalled with an Option's value when it is pressed, after its own onPress.
selectedOptionstringMarks the Option with this value as selected.
disabledbooleanfalseDims the surface and disables its options.
Flex propsFlexPropsPadding, radius, border, background and the rest, as on Flex.
Edit this page on GitHub
TrademarkTrademark
Built with curiosity by Lorant One and the Design Engineers Club