react-native-dropdown-picker and react-native-picker-select are both popular libraries for implementing dropdown selection interfaces in React Native applications. react-native-dropdown-picker is a highly customizable, fully controlled component that renders its own modal or list UI, offering extensive styling options and support for multiple selection, search, and categorization. react-native-picker-select acts as a wrapper around the native Picker component (or its community replacement), providing a consistent API across iOS and Android while attempting to preserve native look-and-feel, though it often relies on the underlying OS dialog for the actual selection interface.
When building forms in React Native, the dropdown (or picker) is a fundamental interaction pattern. While both react-native-dropdown-picker and react-native-picker-select solve this problem, they take fundamentally different architectural approaches. One builds a custom UI entirely in JavaScript, while the other acts as a unified interface for native components. Let's break down how they handle rendering, state, and customization.
react-native-dropdown-picker renders its own UI using standard React Native views (View, Text, ScrollView).
Picker component.// react-native-dropdown-picker: Fully custom JS UI
import DropDownPicker from 'react-native-dropdown-picker';
const [open, setOpen] = useState(false);
const [value, setValue] = useState(null);
const [items, setItems] = useState([
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' }
]);
return (
<DropDownPicker
open={open}
value={value}
items={items}
setOpen={setOpen}
setValue={setValue}
setItems={setItems}
// Custom styling props
style={{ borderColor: '#ccc' }}
dropDownContainerStyle={{ backgroundColor: '#fff' }}
/>
);
react-native-picker-select wraps the native Picker component (from @react-native-picker/picker).
// react-native-picker-select: Native bridge wrapper
import RNPickerSelect from 'react-native-picker-select';
const [value, setValue] = useState(null);
const items = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' }
];
return (
<RNPickerSelect
onValueChange={(itemValue) => setValue(itemValue)}
items={items}
value={value}
// Styles only apply to the input box, not the native dialog
style={{
inputIOS: { fontSize: 16, paddingVertical: 12 },
inputAndroid: { fontSize: 16, paddingHorizontal: 10 }
}}
/>
);
react-native-dropdown-picker enforces a strictly controlled component pattern.
open, value, and items state externally.// react-native-dropdown-picker: Strict controlled state
const [open, setOpen] = useState(false);
const [value, setValue] = useState(null);
const [items, setItems] = useState([]);
// All three states must be passed and updated via setters
<DropDownPicker
open={open}
value={value}
items={items}
setOpen={setOpen}
setValue={setValue}
setItems={setItems}
/>
react-native-picker-select follows a more traditional React pattern but can behave inconsistently across platforms.
onValueChange and value props.// react-native-picker-select: Standard value/onValueChange
const [value, setValue] = useState(null);
<RNPickerSelect
value={value}
onValueChange={(itemValue) => setValue(itemValue)}
items={[{ label: 'Select', value: null }, { label: 'Red', value: 'red' }]}
// No 'open' prop exists; OS handles visibility
/>
react-native-dropdown-picker includes built-in support for search and multiple selection.
// react-native-dropdown-picker: Search and Multi-select
<DropDownPicker
open={open}
value={value}
items={items}
setOpen={setOpen}
setValue={setValue}
setItems={setItems}
multiple={true} // Enable multiple selection
searchable={true} // Enable search bar
placeholder="Select fruits"
// Customizing the search input
searchPlaceholder="Search..."
/>
react-native-picker-select does not support search or multiple selection out of the box.
// react-native-picker-select: Single select only
// No props for 'multiple' or 'searchable'
// Attempting to pass them will have no effect
<RNPickerSelect
onValueChange={setValue}
items={items}
value={value}
// Limited to basic single selection
/>
react-native-dropdown-picker guarantees 100% visual consistency.
// react-native-dropdown-picker: Consistent styling
<DropDownPicker
// These styles apply identically on both platforms
containerStyle={{ width: '100%' }}
style={{ backgroundColor: '#f9f9f9' }}
dropDownContainerStyle={{ borderWidth: 1, borderColor: '#ddd' }}
listItemContainerStyle={{ paddingVertical: 10 }}
/>
react-native-picker-select embraces platform differences.
// react-native-picker-select: Platform-specific behavior
<RNPickerSelect
// You can style the trigger, but not the OS dialog
style={{
inputIOS: { color: 'black' },
inputAndroid: { color: 'black', underlineColorAndroid: 'transparent' }
}}
useNativeAndroidPickerStyle={true} // Defaults to true, using OS style
/>
Both packages have specific limitations where alternatives might be better:
react-native-picker-select if you need to support complex layouts inside the dropdown (e.g., images next to text) because the native dialog usually only supports plain text.react-native-dropdown-picker if your app relies heavily on accessibility features provided by native OS pickers, as custom JS implementations sometimes require extra work to match native accessibility standards.@react-native-picker/picker directly if you don't need the wrapper logic of react-native-picker-select and want to stay closer to the community-maintained standard.| Feature | react-native-dropdown-picker | react-native-picker-select |
|---|---|---|
| UI Implementation | 100% JavaScript (Custom Views) | Native Bridge (OS Dialogs) |
| Visual Consistency | ✅ Identical on iOS & Android | ❌ Differs by OS |
| Search Support | ✅ Built-in | ❌ Not supported |
| Multiple Selection | ✅ Supported | ❌ Single select only |
| State Complexity | High (Open, Value, Items) | Low (Value only) |
| Customization | Unlimited (Styles, Animations) | Limited (Trigger only) |
| Native Feel | Moderate (Depends on styling) | High (Uses OS controls) |
Think in terms of control versus convention:
react-native-dropdown-picker. It is the robust choice for modern, branded applications where the dropdown is a key part of the UI.react-native-picker-select. It is perfect for settings screens or simple forms where speed of implementation and native familiarity matter most.Final Thought: While react-native-picker-select offers simplicity, the industry trend is moving towards fully custom components like react-native-dropdown-picker to ensure consistent branding and richer interactions across all devices.
Choose react-native-dropdown-picker if you need a completely custom UI that matches your design system exactly, regardless of the platform. It is the ideal choice when you require advanced features like search filtering, multiple selection, nested categories, or complex validation logic within the dropdown itself. This package is best for projects where consistency across iOS and Android is more important than using native OS controls, and where you need full control over the dropdown's open/close behavior and animation.
Choose react-native-picker-select if you prefer a lightweight solution that leverages native OS pickers for the selection interface, ensuring familiar UX for users on both platforms. It is suitable for simple single-select scenarios where you want to avoid the complexity of managing a custom modal or list view. However, be aware that this package often serves as a bridge to native components, which may limit your ability to customize the appearance of the selection dialog itself compared to a fully JavaScript-based solution.
The example in the screenshots: https://snack.expo.dev/8mHmLfcZf
Visit https://hossein-zare.github.io/react-native-dropdown-picker-website/
PRs should be made against and merged into the dev-5.x branch, which is set as the default branch on github.
Releases are currently made from the 5.x branch.
To make a new release, follow these steps:
package.jsonvx.x.x (replace the x values as appropriate of course), with the release branch as the target, with release name vx.x.x (again, with appropriate numbers in place of x of course)