Skip to main content

Migration to v4

Introduction

Core changes

To use the v4 version, you first need to update the package names:

- import {} from 'react-native-elements'
+ import {} from '@rneui/themed'

You can install the packages from npm or yarn

npm install @rneui/base @rneui/themed

# or with yarn
yarn add @rneui/base @rneui/themed

You can also make alias for package to help you with migration.

yarn add react-native-elements@npm:@rneui/themed

Colors

Added a new background color to the colors object.

const colors={
primary: '#2e7d32',
secondary: '#757575',
+ background: '#ffffff',
}
- import { colors } from 'react-native-elements'
+ import { lightColors, darkColors } from '@rneui/themed'

Theme

const theme:FullTheme={
colors:{},
+ spacing:{}
}

Pressable

These components are now using Pressable instead of Touchable

  • Avatar
  • Badge
  • ButtonGroup
  • CheckBox
  • Icon
  • Image
  • ListItem
  • SearchBar
  • SpeedDial
  • Tile

Pressable is a Core Component wrapper that can detect various stages of press interactions on any of its defined children.

This change would let you use onPressIn & onPressOut APIs in components, For example

  <CheckBox
title="I agree"
onPress={()=>{}}
onLongPress={()=>{}}
+ onPressIn={()=>{}}
+ onPressOut={()=>{}}
onPress={() => {}}
/>

and the rest of props for Pressable can be added via pressableProps API

  <ButtonGroup
+ pressableProps={{android_ripple:{radius:2}}}
/>

few other props (like underlayColor) will not be supported, you can remove them.

Components

Avatar

The placeholderStyle and renderPlaceholderContent props are removed and is replaced by renderCustomContent.

  <Avatar
- renderPlaceholderContent={
- <Text testID="my-custom-placeholder">Hey</Text>
- }
- placeholderStyle = {{backgroundColor:"red"}}
+ renderCustomContent={<Text>Hey</Text>}
+ />

Button

  <Button
+ size='sm',
+ radius='md'
+ color='primary'
- title='Press me'
- />
+ >
+ Press me
+ </Button>

ThemeProvider

Please make sure that ThemeProvider is defined at the root of your application (even if you are using the default theme) and NO useStyles or useTheme is called before <ThemeProvider>

- <ThemeProvider theme={myTheme} useDark={false}>
+ <ThemeProvider theme={myTheme}>
<Button title="My Button" />
</ThemeProvider>

Create custom theme using createTheme helper

- const myTheme: FullTheme = {
+ const myTheme = createTheme({
- colors: {
+ lightColors:{
primary: '#f2f2f2',
},
+ darkColors: {
+ primary: '#121212',
+ },
+ mode: 'dark',
};

Since useDark is deprecated, you can switch dark and light themeColors using updateTheme function which can be access from useTheme hook.

Complete example of root of our application

import { ThemeProvider, Button, createTheme } from '@rneui/themed';

const myTheme = createTheme({
lightColors: {
primary: '#f2f2f2',
},
darkColors: {
primary: '#121212',
},
mode: 'dark',
});

const App = () => {
return (
<ThemeProvider theme={myTheme}>
<Button title="My Button" />
</ThemeProvider>
);
};

You can use props for components while defining themes

import { createTheme } from '@rneui/themed';

const myTheme = createTheme({
components: {
Button: (buttonProps) => ({
titleStyle: {
color: buttonProps.type === 'solid' ? 'blue' : 'red',
},
}),
},
});

Thus when we use type='solid' in Button component, it will use titleStyle will have "blue" color.

<Button type='solid'>

Refer to Customization for more details.

Tooltip

Tooltip is one of core component of RNE, Since v4 this component would be stateless and would use visible, onOpen & onClose Props for its working.

  <Tooltip
+ visible={open}
+ onOpen={() => {
+ setOpen(true);
+ }}
+ onClose={() => {
+ setOpen(false);
+ }}
popover="Hey All"
/>

You can still use Tooltip as stateful component by doing:

const ControlledTooltip: React.FC<TooltipProps> = (props) => {
const [open, setOpen] = React.useState(false);
return (
<Tooltip
visible={open}
onOpen={() => {
setOpen(true);
}}
onClose={() => {
setOpen(false);
}}
{...props}
/>
);
};