This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 55).
FloatingActionButton
Jetpack Compose FloatingActionButton components following Material Design 3.
Expo UI provides four FloatingActionButton variants matching the Material Design 3 FloatingActionButton API:
SmallFloatingActionButton— a compact FABFloatingActionButton— the standard FAB (default size)LargeFloatingActionButton— a larger FABExtendedFloatingActionButton— a FAB with an icon and a text label, supporting animated expand/collapse
Each component uses slot-based children (.Icon and, for ExtendedFloatingActionButton, .Text) to compose content.
Note: If you need multiple action buttons in a floating toolbar, use
HorizontalFloatingToolbarinstead.
Installation
- npx expo install @expo/uiIf you are installing this in an existing React Native app, make sure to install expo in your project.
Usage
Standard FloatingActionButton
import { FloatingActionButton, Host, Icon } from '@expo/ui/jetpack-compose'; export default function StandardFABExample() { return ( <Host matchContents> <FloatingActionButton onClick={() => console.log('FAB pressed')}> <FloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </FloatingActionButton.Icon> </FloatingActionButton> </Host> ); }
FAB variants
import { FloatingActionButton, Host, Icon, LargeFloatingActionButton, SmallFloatingActionButton, } from '@expo/ui/jetpack-compose'; import { View } from 'react-native'; export default function FABVariantsExample() { return ( <View style={{ flexDirection: 'row', gap: 16 }}> <Host matchContents> <SmallFloatingActionButton onClick={() => {}}> <SmallFloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </SmallFloatingActionButton.Icon> </SmallFloatingActionButton> </Host> <Host matchContents> <FloatingActionButton onClick={() => {}}> <FloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </FloatingActionButton.Icon> </FloatingActionButton> </Host> <Host matchContents> <LargeFloatingActionButton onClick={() => {}}> <LargeFloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </LargeFloatingActionButton.Icon> </LargeFloatingActionButton> </Host> </View> ); }
ExtendedFloatingActionButton
import { ExtendedFloatingActionButton, Host, Icon, Text } from '@expo/ui/jetpack-compose'; import { useState } from 'react'; export default function ExtendedFABExample() { const [expanded, setExpanded] = useState(true); return ( <Host matchContents> <ExtendedFloatingActionButton expanded={expanded} onClick={() => setExpanded(v => !v)}> <ExtendedFloatingActionButton.Icon> <Icon source={require('./assets/edit.xml')} /> </ExtendedFloatingActionButton.Icon> <ExtendedFloatingActionButton.Text> <Text>Edit</Text> </ExtendedFloatingActionButton.Text> </ExtendedFloatingActionButton> </Host> ); }
Floating over content
Use a Compose Box with align('bottomEnd') to position the FAB over scrollable content entirely within the Compose layer.
import { Box, FloatingActionButton, Host, Icon, LazyColumn, ListItem, } from '@expo/ui/jetpack-compose'; import { align, fillMaxSize, fillMaxWidth, offset } from '@expo/ui/jetpack-compose/modifiers'; export default function FloatingFABExample() { return ( <Host style={{ flex: 1 }}> <Box modifiers={[fillMaxSize()]}> <LazyColumn modifiers={[fillMaxSize()]}>{/* ...list items... */}</LazyColumn> <FloatingActionButton modifiers={[align('bottomEnd'), offset(-16, -16)]} onClick={() => console.log('pressed')}> <FloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </FloatingActionButton.Icon> </FloatingActionButton> </Box> </Host> ); }
Custom color
import { ExtendedFloatingActionButton, Host, Icon, Text } from '@expo/ui/jetpack-compose'; export default function FABCustomColorExample() { return ( <Host matchContents> <ExtendedFloatingActionButton containerColor="#E8DEF8" onClick={() => console.log('pressed')}> <ExtendedFloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </ExtendedFloatingActionButton.Icon> <ExtendedFloatingActionButton.Text> <Text>New item</Text> </ExtendedFloatingActionButton.Text> </ExtendedFloatingActionButton> </Host> ); }
API
import { SmallFloatingActionButton, FloatingActionButton, LargeFloatingActionButton, ExtendedFloatingActionButton, } from '@expo/ui/jetpack-compose';
Components
Type: React.Element<ExtendedFloatingActionButtonProps>
Renders a Material Design 3 ExtendedFloatingActionButton with animated label expansion.
Wraps ExtendedFloatingActionButton.
Example
import { ExtendedFloatingActionButton, Host, Icon, Text } from '@expo/ui/jetpack-compose'; <Host matchContents> <ExtendedFloatingActionButton expanded={true} onClick={() => console.log('pressed')}> <ExtendedFloatingActionButton.Icon> <Icon source={require('./assets/edit.xml')} /> </ExtendedFloatingActionButton.Icon> <ExtendedFloatingActionButton.Text> <Text>Edit</Text> </ExtendedFloatingActionButton.Text> </ExtendedFloatingActionButton> </Host>
Type: React.Element<FloatingActionButtonProps>
Renders a Material Design 3 standard FloatingActionButton.
Wraps FloatingActionButton.
Example
import { FloatingActionButton, Host, Icon } from '@expo/ui/jetpack-compose'; <Host matchContents> <FloatingActionButton onClick={() => console.log('pressed')}> <FloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </FloatingActionButton.Icon> </FloatingActionButton> </Host>
ColorValueThe background color of the button container.
Defaults to FloatingActionButtonDefaults.containerColor (primary container).
Type: React.Element<FloatingActionButtonProps>
Renders a Material Design 3 large FloatingActionButton.
Wraps LargeFloatingActionButton.
Example
import { LargeFloatingActionButton, Host, Icon } from '@expo/ui/jetpack-compose'; <Host matchContents> <LargeFloatingActionButton onClick={() => console.log('pressed')}> <LargeFloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </LargeFloatingActionButton.Icon> </LargeFloatingActionButton> </Host>
Type: React.Element<FloatingActionButtonProps>
Renders a Material Design 3 small FloatingActionButton.
Wraps SmallFloatingActionButton.
Example
import { SmallFloatingActionButton, Host, Icon } from '@expo/ui/jetpack-compose'; <Host matchContents> <SmallFloatingActionButton onClick={() => console.log('pressed')}> <SmallFloatingActionButton.Icon> <Icon source={require('./assets/add.xml')} /> </SmallFloatingActionButton.Icon> </SmallFloatingActionButton> </Host>