react-native-paper-dropdown-plus
v2.6.0
Published
Dropdown component using React Native Paper TextInput and Menu, now also with multiselect. This is a maintained fork of the original package by @fateh999.
Maintainers
Readme
react-native-paper-dropdown-plus
🍴 This is a maintained fork of the original react-native-paper-dropdown by @fateh999
Material Design Dropdown Component using React Native Paper, now with enhanced features and community improvements
🚀 What's New in This Fork
This fork includes several enhancements and community-contributed features that were never merged into the original repository:
✨ New Features & Improvements
🎯 FlatList Support (by @levon-zakarian)
isFlatListprop: Choose between ScrollView (default) or FlatList for better performance with large datasetsflatListProps: Pass additional props to FlatList when enabledscrollViewProps: Enhanced ScrollView props when not using FlatList- Performance boost: Better memory management for large option lists
📜 Enhanced Scroll Events (by @ashaffah)
onScrollprop: Scroll event callback for better control over scroll behavioronScrollBeginDragprop: Callback when user starts dragging the scroll viewonScrollEndDragprop: Callback when user ends dragging the scroll view- Better scroll integration: More responsive scroll interactions and improved UX
🎨 Enhanced Styling Options (by @vicetr3s)
inputStyleprop: Apply custom styles to the Dropdown Input componentinputOutlineStyleprop: Customize outline styles for better theming- Better customization: More control over component appearance
🎯 Advanced Menu Positioning (by @vicetr3s)
menuAnchorPositionprop: Control menu anchor positioning ('top' | 'bottom')menuModeprop: Menu display mode options ('flat' | 'elevated') for better UX- Updated react-native-paper: Compatible with latest Menu component features
📋 Improved Header Component (by @vicetr3s)
headerTitleprop: Display custom text or ReactElement in header (independent from input label)headerTitleStyleprop: Style the header title textheaderStyleprop: Customize header container styles- Smaller default height: More compact header design
🌙 Dark Mode Fix (by @PaitoAnderson)
- Fixed item text visibility: Proper text contrast in dark mode themes
- Better accessibility: Improved readability across all themes
🔧 Community Contributions
This fork actively accepts and merges valuable community contributions that enhance the package, providing a more feature-rich and maintained alternative to the original.
Dependencies
react-native-paperInstallation
yarn add react-native-paper-dropdown-plusor
npm i react-native-paper-dropdown-plusDemo
Basic Example
Single Select
import React, { useState } from 'react';
import { View } from 'react-native';
import { Dropdown } from 'react-native-paper-dropdown-plus';
import { Provider as PaperProvider } from 'react-native-paper';
const OPTIONS = [
{ label: 'Male', value: 'male' },
{ label: 'Female', value: 'female' },
{ label: 'Other', value: 'other' },
];
export default function App() {
const [gender, setGender] = useState<string>('');
return (
<PaperProvider>
<View style={{ margin: 16 }}>
<Dropdown
label="Gender"
placeholder="Select Gender"
options={OPTIONS}
value={gender}
onSelect={setGender}
// New features from this fork:
isFlatList={true} // Use FlatList for better performance
inputStyle={{ backgroundColor: '#f5f5f5' }} // Custom input styling
headerTitle="Choose Your Gender" // Custom header text
menuAnchorPosition="bottom" // Menu positioning
/>
</View>
</PaperProvider>
);
}Multi Select
import React, { useState } from 'react';
import { View } from 'react-native';
import { MultiSelectDropdown } from 'react-native-paper-dropdown-plus';
import { Provider as PaperProvider } from 'react-native-paper';
const MULTI_SELECT_OPTIONS = [
{ label: 'White', value: 'white' },
{ label: 'Red', value: 'red' },
{ label: 'Blue', value: 'blue' },
{ label: 'Green', value: 'green' },
{ label: 'Orange', value: 'orange' },
];
export default function App() {
const [colors, setColors] = useState<string[]>([]);
return (
<PaperProvider>
<View style={{ margin: 16 }}>
<MultiSelectDropdown
label="Colors"
placeholder="Select Colors"
options={MULTI_SELECT_OPTIONS}
value={colors}
onSelect={setColors}
// Enhanced features:
isFlatList={true}
headerTitle="Pick Your Favorite Colors"
headerTitleStyle={{ fontWeight: 'bold', color: '#333' }}
/>
</View>
</PaperProvider>
);
}Props
DropdownProps
| Prop | Type | Description | Fork Enhancement |
| --------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------- | -------------------- |
| testID | string | Test ID for the dropdown component. | |
| menuTestID | string | Test ID for the dropdown menu. | |
| value | string | The currently selected value. | |
| onSelect | (value?: string) => void | Callback function to handle value selection. | |
| options | Option[] | Array of options for the dropdown. | |
| menuUpIcon | ReactElement | Custom icon for menu up state. | |
| menuDownIcon | ReactElement | Custom icon for menu down state. | |
| maxMenuHeight | number | Maximum height of the dropdown menu. | |
| menuContentStyle | ViewStyle | Style for the dropdown menu content. | |
| listContainerStyle | StyleProp<ViewStyle> | Style for the list container (FlatList/ScrollView). | |
| inputStyle | StyleProp<ViewStyle> | Custom styles for the Dropdown Input component. | ✅ @vicetr3s |
| inputOutlineStyle | StyleProp<ViewStyle> | Custom outline styles for the Dropdown Input component. | ✅ @vicetr3s |
| headerTitle | ReactElement \| string | Custom text/component for the header (independent from input label). | ✅ @vicetr3s |
| headerTitleStyle | StyleProp<TextStyle> | Style for the header title text. | ✅ @vicetr3s |
| headerStyle | StyleProp<ViewStyle> | Style for the header container. | ✅ @vicetr3s |
| hideMenuHeader | boolean | Hide menu header component (default: false). | |
| statusBarHeight | number | Additional top margin for the status bar on Android. | |
| menuAnchorPosition | 'top' \| 'bottom' | Menu anchor positioning. | ✅ @vicetr3s |
| menuMode | 'flat' \| 'elevated' | Menu display mode. | ✅ @vicetr3s |
| Touchable | ForwardRefExoticComponent<PressableProps & RefAttributes<View>> | Custom touchable component for the dropdown. | |
| CustomMenuHeader | (props: DropdownHeaderProps) => ReactElement | Custom component for the dropdown menu header. | |
| CustomDropdownItem | (props: DropdownItemProps) => ReactElement | Custom component for dropdown item. | |
| CustomDropdownInput | (props: DropdownInputProps) => ReactElement | Custom component for dropdown input. | |
| onScroll | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll event callback. | ✅ @ashaffah |
| onScrollBeginDrag | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll begin drag event callback. | ✅ @ashaffah |
| onScrollEndDrag | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll end drag event callback. | ✅ @ashaffah |
| placeholder | string | Placeholder text for the dropdown input. | |
| label | TextInputLabelProp | Label for the dropdown input. | |
| mode | 'flat' \| 'outlined' | Mode for the dropdown input. | |
| disabled | boolean | Whether the dropdown is disabled. | |
| error | boolean | Whether the dropdown has an error. | |
| isFlatList | boolean | Whether to use FlatList for rendering (default: false). | ✅ @levon-zakarian |
| flatListProps | Omit<FlatListProps<Option>, 'data' \| 'renderItem' \| 'keyExtractor'> | Additional props for FlatList (only when isFlatList is true). | ✅ @levon-zakarian |
| scrollViewProps | ScrollViewProps | Additional props for ScrollView (only when isFlatList is false). | ✅ @levon-zakarian |
MultiSelectDropdownProps
| Prop | Type | Description | Fork Enhancement |
|----------------------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------|----------------------|
| testID | string | Test ID for the dropdown component. | |
| menuTestID | string | Test ID for the dropdown menu. | |
| value | string[] | The currently selected values. | |
| onSelect | (value: string[]) => void | Callback function to handle value selection. | |
| options | Option[] | Array of options for the dropdown. | |
| menuUpIcon | ReactElement | Custom icon for menu up state. | |
| menuDownIcon | ReactElement | Custom icon for menu down state. | |
| maxMenuHeight | number | Maximum height of the dropdown menu. | |
| menuContentStyle | ViewStyle | Style for the dropdown menu content. | |
| listContainerStyle | StyleProp<ViewStyle> | Style for the list container (FlatList/ScrollView). | |
| inputStyle | StyleProp<ViewStyle> | Custom styles for the Dropdown Input component. | ✅ @vicetr3s |
| inputOutlineStyle | StyleProp<ViewStyle> | Custom outline styles for the Dropdown Input component. | ✅ @vicetr3s |
| headerTitle | ReactElement \| string | Custom text/component for the header (independent from input label). | ✅ @vicetr3s |
| headerTitleStyle | StyleProp<TextStyle> | Style for the header title text. | ✅ @vicetr3s |
| headerStyle | StyleProp<ViewStyle> | Style for the header container. | ✅ @vicetr3s |
| hideMenuHeader | boolean | Hide menu header component (default: false). | |
| statusBarHeight | number | Additional top margin for the status bar on Android. | |
| menuAnchorPosition | 'top' \| 'bottom' | Menu anchor positioning. | ✅ @vicetr3s |
| menuMode | 'flat' \| 'elevated' | Menu display mode. | ✅ @vicetr3s |
| Touchable | ForwardRefExoticComponent<PressableProps & RefAttributes<View>> | Custom touchable component for the dropdown. | |
| CustomMenuHeader | (props: DropdownHeaderProps) => ReactElement | Custom component for the dropdown menu header. | |
| CustomMultiSelectDropdownItem | (props: MultiSelectDropdownItemProps) => ReactElement | Custom component for multi-select dropdown item. | |
| CustomMultiSelectDropdownInput | (props: DropdownInputProps) => ReactElement | Custom component for multi-select dropdown input. | |
| onScroll | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll event callback. | ✅ @ashaffah |
| onScrollBeginDrag | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll begin drag event callback. | ✅ @ashaffah |
| onScrollEndDrag | (event: NativeSyntheticEvent<NativeScrollEvent>) => void | Scroll end drag event callback. | ✅ @ashaffah |
| placeholder | string | Placeholder text for the dropdown input. | |
| label | TextInputLabelProp | Label for the dropdown input. | |
| mode | 'flat' \| 'outlined' | Mode for the dropdown input. | |
| disabled | boolean | Whether the dropdown is disabled. | |
| error | boolean | Whether the dropdown has an error. | |
| isFlatList | boolean | Whether to use FlatList for rendering (default: false). | ✅ @levon-zakarian |
| flatListProps | Omit<FlatListProps<Option>, 'data' \| 'renderItem' \| 'keyExtractor'> | Additional props for FlatList (only when isFlatList is true). | ✅ @levon-zakarian |
| scrollViewProps | ScrollViewProps | Additional props for ScrollView (only when isFlatList is false). | ✅ @levon |
Methods
| Method | Return | Description |
| --------- | ------ | ---------------------------- |
| focus() | void | Open the dropdown manually. |
| blur() | void | Close the dropdown manually. |
🤝 Contributing
This fork actively welcomes community contributions! Feel free to submit Pull Requests with improvements, bug fixes, or new features.
Contributors to this fork:
- @levon-zakarian - FlatList support and documentation improvements
- @PaitoAnderson - Dark mode text fixes
- @ashaffah - Enhanced scroll event props and scroll handling
- @vicetr3s - Enhanced styling, menu positioning, and header improvements
🙏 Credits
Original Package: react-native-paper-dropdown by Fateh Farooqui (@fateh999)
This package is a community-maintained fork that includes valuable contributions and improvements that enhance the original functionality. Special thanks to @fateh999 for creating the foundation of this amazing component!
📄 License
MIT
Original Documentation: https://fateh999.github.io/react-native-paper-dropdown
Maintained Fork: react-native-paper-dropdown-plus by Vicente Díaz (@vicetr3s)
