@react-native-picker/picker vs react-native-dropdown-picker
Selecting User Input Components in React Native
@react-native-picker/pickerreact-native-dropdown-pickerSimilar Packages:

Selecting User Input Components in React Native

@react-native-picker/picker and react-native-dropdown-picker both handle single-selection inputs in React Native apps, but they solve the problem in fundamentally different ways. @react-native-picker/picker is a community-maintained wrapper around the native iOS and Android picker components, offering a look and feel that matches the operating system. react-native-dropdown-picker is a fully customizable JavaScript-based component that draws its own dropdown interface, allowing for consistent styling across platforms but requiring more manual state management.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
@react-native-picker/picker01,758399 kB2615 months agoMIT
react-native-dropdown-picker01,045161 kB1633 years agoMIT

Native Pickers vs Custom Dropdowns in React Native

Both @react-native-picker/picker and react-native-dropdown-picker handle single-selection inputs in React Native apps, but they work differently under the hood. One relies on the operating system's built-in controls, while the other draws its own interface using JavaScript. Let's compare how they tackle common development problems.

πŸ–₯️ Core Rendering Engine: Native Views vs JavaScript

@react-native-picker/picker renders actual native UI components.

  • On iOS, it uses UIPickerView.
  • On Android, it uses Spinner or Dialog depending on the mode.
  • This ensures the component feels exactly like other system apps.
// @react-native-picker/picker: Native rendering
import { Picker } from '@react-native-picker/picker';

<Picker
  selectedValue={selectedValue}
  onValueChange={(itemValue) => setSelectedValue(itemValue)}
>
  <Picker.Item label="Apple" value="apple" />
  <Picker.Item label="Banana" value="banana" />
</Picker>

react-native-dropdown-picker draws the UI using React Native views.

  • It builds the dropdown list using View, Text, and TouchableOpacity.
  • This allows full control over colors, fonts, and layout.
  • It looks the same on both iOS and Android unless you style it differently.
// react-native-dropdown-picker: JS rendering
import DropDownPicker from 'react-native-dropdown-picker';

<DropDownPicker
  open={open}
  value={value}
  items={items}
  setOpen={setOpen}
  setValue={setValue}
  setItems={setItems}
/>

🧠 State Management: Simple Props vs Complex Hooks

@react-native-picker/picker uses a simple controlled model.

  • You only track the selected value.
  • The internal list state is managed by the component itself.
  • Less boilerplate code is required for basic usage.
// @react-native-picker/picker: Simple state
const [selectedValue, setSelectedValue] = useState('apple');

<Picker selectedValue={selectedValue} onValueChange={setSelectedValue}>
  <Picker.Item label="Apple" value="apple" />
</Picker>

react-native-dropdown-picker requires multiple state variables.

  • You must track the open state, the selected value, and the list of items.
  • This gives you dynamic control over the list but adds complexity.
  • Forgetting one setter can break the dropdown behavior.
// react-native-dropdown-picker: Complex state
const [open, setOpen] = useState(false);
const [value, setValue] = useState(null);
const [items, setItems] = useState([
  { label: 'Apple', value: 'apple' },
  { label: 'Banana', value: 'banana' }
]);

<DropDownPicker open={open} value={value} items={items} setOpen={setOpen} setValue={setValue} setItems={setItems} />

🎨 Customization and Styling: Limited vs Full Control

@react-native-picker/picker has limited styling options.

  • You can change colors and fonts to a degree.
  • You cannot easily change the dropdown arrow or the modal background.
  • The component respects system dark mode automatically.
// @react-native-picker/picker: Limited style props
<Picker
  style={{ height: 50, width: 200 }}
  dropdownIconColor="blue"
  dropdownIconRippleColor="red"
>
  <Picker.Item label="Apple" value="apple" color="green" />
</Picker>

react-native-dropdown-picker allows deep customization.

  • You can style the container, label, arrow, and list items.
  • You can add icons to items or change the checkmark style.
  • This is better for matching strict brand guidelines.
// react-native-dropdown-picker: Deep customization
<DropDownPicker
  open={open}
  value={value}
  items={items}
  setOpen={setOpen}
  setValue={setValue}
  setItems={setItems}
  containerStyle={{ height: 40 }}
  style={{ backgroundColor: '#fafafa' }}
  dropDownContainerStyle={{ backgroundColor: '#eee' }}
/>

πŸ“± Platform Behavior: System Dialogs vs Consistent Modals

@react-native-picker/picker adapts to each platform.

  • iOS shows a wheel picker at the bottom or inline.
  • Android shows a spinner or a system dialog modal.
  • Users get the interaction they expect on their device.
// @react-native-picker/picker: Platform specific mode
<Picker
  mode="dialog" // Android only: forces dialog mode
  selectedValue={selectedValue}
  onValueChange={setSelectedValue}
>
  <Picker.Item label="Apple" value="apple" />
</Picker>

react-native-dropdown-picker behaves consistently everywhere.

  • The dropdown opens the same way on iOS and Android.
  • You avoid surprises where users see different UIs on different phones.
  • You must handle z-index issues manually on Android sometimes.
// react-native-dropdown-picker: Consistent behavior
<DropDownPicker
  open={open}
  value={value}
  items={items}
  setOpen={setOpen}
  setValue={setValue}
  setItems={setItems}
  zIndex={3000} // Manual z-index management required
  zIndexInverse={1000}
/>

🌱 When Not to Use These

These components are great for single selection, but consider alternatives when:

  • You need multi-select functionality: Use @react-native-picker/picker (limited) or a dedicated multi-select library instead.
  • You need searchable lists with thousands of items: react-native-dropdown-picker supports search, but @react-native-picker/picker does not.
  • Your app requires accessibility compliance: Native pickers often have better built-in screen reader support than custom JS components.

πŸ“Œ Summary Table

Feature@react-native-picker/pickerreact-native-dropdown-picker
RenderingπŸ“± Native OS Components🎨 JavaScript Views
State Management🟒 Simple (Value only)🟠 Complex (Open, Value, Items)
CustomizationπŸ”’ Limited to system stylesπŸ”“ Full control over UI
Platform Feel🍏 iOS / πŸ€– Android differ🌍 Consistent across platforms
Search Support❌ Noβœ… Yes
MaintenanceπŸ›‘οΈ Official Community ModuleπŸ› οΈ Third-Party Library

πŸ’‘ Final Recommendation

@react-native-picker/picker is like the standard tool kit πŸ”§β€”it works out of the box, feels native, and rarely breaks when you update React Native. Ideal for internal tools, settings screens, and forms where speed and stability matter more than unique branding.

react-native-dropdown-picker is like a custom design kit πŸŽ¨β€”perfect for consumer-facing apps where every pixel must match your brand guide. It shines when you need search functionality or a specific interaction model that native components do not support.

Final Thought: Despite their differences, both packages aim to solve the same problem: letting users choose one option from a list. Choose based on whether you prioritize native stability or design flexibility.

How to Choose: @react-native-picker/picker vs react-native-dropdown-picker

  • @react-native-picker/picker:

    Choose @react-native-picker/picker when you want the standard native experience, need maximum stability with OS updates, and do not require heavy visual customization. It is the safest bet for forms that need to feel like part of the OS and works well for simple selection tasks where platform consistency is less critical than native performance.

  • react-native-dropdown-picker:

    Choose react-native-dropdown-picker when your design system requires a specific look that differs from the native picker, or when you need features like search inside the dropdown. It is suitable for projects where brand consistency across iOS and Android outweighs native feel, and your team can manage the additional state complexity.

README for @react-native-picker/picker

@react-native-picker/picker

npm version Build Supports Android, iOS, MacOS, and Windows MIT License Lean Core Extracted

AndroidiOSPickerIOS
WindowsMacOS

Supported Versions

@react-native-picker/pickerreact-nativereact-native-windows
>= 2.0.00.61+0.64+
>= 1.16.00.61+0.61+
>= 1.2.00.60+ or 0.59+ with JetifierN/A
>= 1.0.00.57N/A

Getting started

$ npm install @react-native-picker/picker --save

or

$ yarn add @react-native-picker/picker

For React Native v0.60 and above (Autolinking)

As react-native@0.60 and above supports autolinking there is no need to run the linking process. Read more about autolinking here. This is supported by react-native-windows@0.64 and above.

iOS

CocoaPods on iOS needs this extra step:

npx pod-install

Android

No additional step is required.

Windows (expand for details)

Windows

Usage in Windows without autolinking requires the following extra steps:

Add the ReactNativePicker project to your solution.
  1. Open the solution in Visual Studio 2019
  2. Right-click Solution icon in Solution Explorer > Add > Existing Project Select D:\dev\RNTest\node_modules\@react-native-picker\picker\windows\ReactNativePicker\ReactNativePicker.vcxproj
windows/myapp.sln

Add a reference to ReactNativePicker to your main application project. From Visual Studio 2019:

Right-click main application project > Add > Reference... Check ReactNativePicker from Solution Projects.

app.cpp

Add #include "winrt/ReactNativePicker.h" to the headers included at the top of the file.

Add PackageProviders().Append(winrt::ReactNativePicker::ReactPackageProvider()); before InitializeComponent();.

MacOS

CocoaPods on MacOS needs this extra step (called from the MacOS directory)

pod install
React Native below 0.60 (Link and Manual Installation)

The following steps are only necessary if you are working with a version of React Native lower than 0.60

Mostly automatic installation

$ react-native link @react-native-picker/picker

Manual installation

iOS

  1. In XCode, in the project navigator, right click Libraries ➜ Add Files to [your project's name]
  2. Go to node_modules ➜ @react-native-picker/picker and add RNCPicker.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libRNCPicker.a to your project's Build Phases ➜ Link Binary With Libraries
  4. Run your project (Cmd+R)<

Android

  1. Open application file (android/app/src/main/java/[...]/MainApplication.java)
  • Add import com.reactnativecommunity.picker.RNCPickerPackage; to the imports at the top of the file
  • Add new RNCPickerPackage() to the list returned by the getPackages() method
  1. Append the following lines to android/settings.gradle:
    include ':@react-native-picker_picker'
    project(':@react-native-picker_picker').projectDir = new File(rootProject.projectDir, 	'../node_modules/@react-native-picker/picker/android')
    
  2. Insert the following lines inside the dependencies block in android/app/build.gradle:
      implementation project(path: ':@react-native-picker_picker')
    

MacOS

  1. In XCode, in the project navigator, right click Libraries ➜ Add Files to [your project's name]
  2. Go to node_modules ➜ @react-native-picker/picker and add RNCPicker.xcodeproj
  3. In XCode, in the project navigator, select your project. Add libRNCPicker.a to your project's Build Phases ➜ Link Binary With Libraries
  4. Run your project (Cmd+R)<

RTL Support

you need to add android:supportsRtl="true" to AndroidManifest.xml

   <application
      ...
      android:supportsRtl="true">

Usage

Import Picker from @react-native-picker/picker:

import {Picker} from '@react-native-picker/picker';

Create state which will be used by the Picker:

const [selectedLanguage, setSelectedLanguage] = useState();

Add Picker like this:

<Picker
  selectedValue={selectedLanguage}
  onValueChange={(itemValue, itemIndex) =>
    setSelectedLanguage(itemValue)
  }>
  <Picker.Item label="Java" value="java" />
  <Picker.Item label="JavaScript" value="js" />
</Picker>

If you want to open/close picker programmatically on android (available from version 1.16.0+), pass ref to Picker:

const pickerRef = useRef();

function open() {
  pickerRef.current.focus();
}

function close() {
  pickerRef.current.blur();
}

return <Picker
  ref={pickerRef}
  selectedValue={selectedLanguage}
  onValueChange={(itemValue, itemIndex) =>
    setSelectedLanguage(itemValue)
  }>
  <Picker.Item label="Java" value="java" />
  <Picker.Item label="JavaScript" value="js" />
</Picker>

Props


Reference

Props

onValueChange

Callback for when an item is selected. This is called with the following parameters:

  • itemValue: the value prop of the item that was selected
  • itemPosition: the index of the selected item in this picker
TypeRequired
functionNo

selectedValue

Value matching value of one of the items. Can be a string or an integer.

TypeRequired
anyNo

style

TypeRequired
pickerStyleTypeNo

testID

Used to locate this view in end-to-end tests.

TypeRequired
stringNo

enabled

If set to false, the picker will be disabled, i.e. the user will not be able to make a selection.

TypeRequiredPlatform
boolNoAndroid, Web, Windows

mode

On Android, specifies how to display the selection items when the user taps on the picker:

  • 'dialog': Show a modal dialog. This is the default.
  • 'dropdown': Shows a dropdown anchored to the picker view
TypeRequiredPlatform
enum('dialog', 'dropdown')NoAndroid

dropdownIconColor

On Android, specifies color of dropdown triangle. Input value should be value that is accepted by react-native processColor function.

TypeRequiredPlatform
ColorValueNoAndroid

dropdownIconRippleColor

On Android, specifies ripple color of dropdown triangle. Input value should be value that is accepted by react-native processColor function.

TypeRequiredPlatform
ColorValueNoAndroid

prompt

Prompt string for this picker, used on Android in dialog mode as the title of the dialog.

TypeRequiredPlatform
stringNoAndroid

itemStyle

Style to apply to each of the item labels.

TypeRequiredPlatform
text stylesNoiOS, Windows

numberOfLines

On Android & iOS, used to truncate the text with an ellipsis after computing the text layout, including line wrapping, such that the total number of lines does not exceed this number. Default is '1'

TypeRequiredPlatform
numberNoAndroid, iOS

onBlur

TypeRequiredPlatform
functionNoAndroid

onFocus

TypeRequiredPlatform
functionNoAndroid

selectionColor

TypeRequiredPlatform
ColorValueNoiOS

Methods

blur (Android only, lib version 1.16.0+)

Programmatically closes picker

focus (Android only, lib version 1.16.0+)

Programmatically opens picker

PickerItemProps

Props that can be applied to individual Picker.Item

label

Displayed value on the Picker Item

TypeRequired
stringYes

value

Actual value on the Picker Item

TypeRequired
number,stringYes

color

Displayed color on the Picker Item

TypeRequired
ColorValueNo

fontFamily

Displayed fontFamily on the Picker Item

TypeRequired
stringNo

style

Style to apply to individual item labels.

TypeRequiredPlatform
ViewStylePropNoAndroid

enabled

If set to false, the specific item will be disabled, i.e. the user will not be able to make a selection

@default: true

TypeRequiredPlatform
booleanNoAndroid

contentDescription

Sets the content description to the Picker Item

TypeRequiredPlatform
stringNoAndroid

PickerIOS

Props


Reference

Props

itemStyle

TypeRequired
text stylesNo

onValueChange

TypeRequired
functionNo

selectedValue

TypeRequired
anyNo

selectionColor

TypeRequiredPlatform
ColorValueNoiOS

themeVariant

TypeRequired
enum('light', 'dark')No