Expo 字体
一个允许在运行时加载字体并在 React Native 组件中使用它们的库。
expo-font
允许从网络加载字体并在 React Native 组件中使用它们。请参阅 字体 指南中更详细的使用信息。
¥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
-
npx expo install expo-font
If you are installing this in an existing React Native app, make sure to install expo
in your project.
应用配置中的配置
¥Configuration in app config
有两种方法可以向你的应用添加字体:使用 expo-font
配置插件(推荐)或在运行时加载它们。
¥There are two ways to add fonts to your app: using the expo-font
config plugin (recommended) or loading them at runtime.
该插件允许你在构建时嵌入字体文件,这比 useFonts
或 loadAsync
更高效。设置配置插件并运行 prebuild 后,你可以立即渲染自定义字体。该插件可以通过多种方式配置,有关如何使用它,请参阅 字体 指南。
¥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
{
"expo": {
"plugins": [
[
"expo-font",
{
"fonts": ["./path/to/file.ttf"],
"android": {
"fonts": [
{
"fontFamily": "Source Serif 4",
"fontDefinitions": [
{
"path": "./path/to/SourceSerif4-ExtraBold.ttf",
"weight": 800
}
]
}
]
}
]
]
}
}
Configurable properties
Name | Default | Description |
---|---|---|
fonts | [] | An array of font definitions to link to the native project. The paths should be relative to the project root. On Android, the file name becomes the font family name. On iOS, the font family name is always taken directly from the font file and may not be the same as the file name — follow the naming advice or use |
android | [] | An array of font definitions to link to the native project on Android. Use the object syntax to embed xml fonts with custom family name. |
ios | [] | An array of font file paths to link to the native project on iOS. The font family name is taken directly from the font file. |
Are you using this library in an existing React Native app?
-
安卓:将字体文件复制到 android/app/src/main/assets/fonts。
¥Android: Copy font files to android/app/src/main/assets/fonts.
-
iOS:请参阅 Apple 开发者文档中的 向你的应用添加自定义字体。
¥iOS: See Adding a Custom Font to Your App in the Apple Developer documentation.
用法
¥Usage
如果你不想使用 配置插件,可以使用 useFonts
钩子在运行时加载字体,如下代码片段所示:
¥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:
import { useFonts } from 'expo-font';
import * as SplashScreen from 'expo-splash-screen';
import { useEffect } from 'react';
import { Text, View, StyleSheet } from 'react-native';
SplashScreen.preventAutoHideAsync();
export default function App() {
// Use `useFonts` only if you can't use the config plugin.
const [loaded, error] = useFonts({
'Inter-Black': require('./assets/fonts/Inter-Black.otf'),
});
useEffect(() => {
if (loaded || error) {
SplashScreen.hideAsync();
}
}, [loaded, error]);
if (!loaded && !error) {
return null;
}
return (
<View style={styles.container}>
<Text style={{ fontFamily: 'Inter-Black', fontSize: 30 }}>Inter Black</Text>
<Text style={{ fontSize: 30 }}>Platform Default</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
});
API
import * as Font from 'expo-font';
Hooks
Parameter | Type | Description |
---|---|---|
map | string | Record<string, FontSource> | A map of |
Load a map of fonts with loadAsync
. This returns a boolean
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.
[boolean, null | Error]
- loaded (
boolean
) - A boolean to detect if the font forfontFamily
has finished loading. - error (
Error | null
) - An error encountered when loading the fonts.
Example
const [loaded, error] = useFonts({ ... });
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.
Parameter | Type | Description |
---|---|---|
fontFamily | string | The name used to load the |
Synchronously detect if the font for fontFamily
has finished loading.
boolean
Returns true
if the font has fully loaded.
Parameter | Type | Description |
---|---|---|
fontFamily | string | The name used to load the |
Synchronously detect if the font for fontFamily
is still being loaded.
boolean
Returns true
if the font is still loading.
Parameter | Type | Description |
---|---|---|
fontFamilyOrFontMap | string | Record<string, FontSource> | String or map of values that can be used as the |
source(optional) | FontSource | The font asset that should be loaded into the |
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.
Parameter | Type | Description |
---|---|---|
glyphs | string | Text to be exported. |
options(optional) | RenderToImageOptions | RenderToImageOptions. |
Types
An object used to dictate the resource that is loaded into the provided font namespace when used
with loadAsync
.
Property | Type | Description |
---|---|---|
default(optional) | string | - |
display(optional) | FontDisplay | Only for: Web Sets the |
uri(optional) | string | number | - |
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
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.
错误代码
¥Error codes
代码 | 描述 |
---|---|
ERR_FONT_API | 如果传递给 loadAsync 的参数无效。 |
ERR_FONT_SOURCE | 提供的资源类型不正确。 |
ERR_WEB_ENVIRONMENT | 浏览器的 document 元素不支持注入字体。 |
错误 _ 下载 | 无法下载提供的资源。 |
ERR_FONT_FAMILY | 提供的字体系列名称无效。 |
错误 _ 卸载 | 尝试卸载尚未完成加载的字体。 |