This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
Expo Font
A library that allows loading fonts at runtime and using them in React Native components.
expo-font allows loading fonts from the web and using them in React Native components. See more detailed usage information in the Fonts guide.
Installation
If you are installing this in an existing React Native app, make sure to install expo in your project.
Configuration in app config
There are two ways to add fonts to your app: using the expo-font config plugin (recommended for Android and iOS) or loading them at runtime (which works across all platforms including web).
On Android and iOS, the plugin allows you to embed font files at build time which is more efficient than useFonts or loadAsync. After you set up the config plugin and run prebuild, you can render custom fonts right away. The plugin can be configured in different ways, see the Fonts guide on how to use it.
Example app.json with config plugin
Configurable properties
Are you using this library in an existing React Native app?
- Android: Copy font files to android/app/src/main/assets/fonts.
- iOS: See Adding a Custom Font to Your App in the Apple Developer documentation.
Usage
If you don't want to use the config plugin, you can load a font at runtime with the useFonts hook, as shown in the snippet:
API
import * as Font from 'expo-font';
Constants
Type: UseFontHook
Load a map of fonts at runtime with loadAsync. This returns true if the fonts are
loaded and ready to use. It also returns an error if something went wrong, to use in development.
Note, the fonts are not "reloaded" when you dynamically change the font map.
Example
const [loaded, error] = useFonts({ 'Inter-Black': require('./assets/fonts/Inter-Black.otf'), });
Methods
Synchronously get all the fonts that have been loaded.
This includes fonts that were bundled at build time using the config plugin, as well as those loaded at runtime using loadAsync.
string[]Returns array of strings which you can use as fontFamily style prop.
Synchronously detect if the font for fontFamily has finished loading.
booleanReturns true if the font has fully loaded.
Synchronously detect if the font for fontFamily is still being loaded.
booleanReturns true if the font is still loading.
An efficient method for loading fonts from static or remote resources which can then be used
with the platform's native text elements. In the browser, this generates a @font-face block in
a shared style sheet for fonts. No CSS is needed to use this method.
Note: We recommend using the config plugin instead whenever possible.
Promise<void>Returns a promise that fulfils when the font has loaded. Often you may want to wrap the
method in a try/catch/finally to ensure the app continues if the font fails to load.
Creates an image with provided text.
Promise<RenderToImageResult>Promise which fulfils with image metadata.
Interfaces
Types
An object used to dictate the resource that is loaded into the provided font namespace when used
with loadAsync.
Literal type: union
The different types of assets you can provide to the loadAsync() function.
A font source can be a URI, a module ID, or an Expo Asset.
Acceptable values are: string | number | Asset | FontResource
Type: object shaped as below:
Or object shaped as below:
Enums
Sets the font-display
for a given typeface. The default font value on web is FontDisplay.AUTO.
Even though setting the fontDisplay does nothing on native platforms, the default behavior
emulates FontDisplay.SWAP on flagship devices like iOS, Samsung, Pixel, etc. Default
functionality varies on One Plus devices. In the browser this value is set in the generated
@font-face CSS block and not as a style property meaning you cannot dynamically change this
value based on the element it's used in.
FontDisplay.AUTO = "auto"(Default) The font display strategy is defined by the user agent or platform. This generally defaults to the text being invisible until the font is loaded. Good for buttons or banners that require a specific treatment.
FontDisplay.BLOCK = "block"The text will be invisible until the font has loaded. If the font fails to load then nothing will appear - it's best to turn this off when debugging missing text.
FontDisplay.FALLBACK = "fallback"Splits the behavior between SWAP and BLOCK.
There will be a 100ms timeout
where the text with a custom font is invisible, after that the text will either swap to the
styled text or it'll show the unstyled text and continue to load the custom font. This is good
for buttons that need a custom font but should also be quickly available to screen-readers.
FontDisplay.OPTIONAL = "optional"This works almost identically to FALLBACK, the only difference is that the browser will
decide to load the font based on slow connection speed or critical resource demand.