You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将expo-google-fonts添加到React Native全局样式表

如何将@expo-google-fonts/poppins配置到全局样式表

我正在使用@expo-google-fonts/poppins字体包,官方示例仅展示了在单个Text组件所在文件中加载字体并单独设置fontFamily的方式,但我希望将字体配置到全局样式表,避免在每个页面的每个Text组件上重复设置样式。

我的全局样式表代码如下:

import { StyleSheet } from "react-native";

export const globalStyles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fdfdfd",
    alignItems: "center",
    justifyContent: "center",
  },
  primaryButtonText: {
    color: "#fdfdfd",
    fontSize: 18,
    fontFamily: "Poppins_100Thin",
  },
  secondaryButtonText: {
    color: "#228ee7",
    fontSize: 18,
    fontFamily: "Poppins_100Thin",
  },
});

我曾尝试提取官方示例的字体定义和导入逻辑到fonts.js文件,但导入到全局样式表后字体并未成功加载,代码如下:

import {
  useFonts,
  Poppins_100Thin,
  Poppins_100Thin_Italic,
  Poppins_200ExtraLight,
  Poppins_200ExtraLight_Italic,
  Poppins_300Light,
  Poppins_300Light_Italic,
  Poppins_400Regular,
  Poppins_400Regular_Italic,
  Poppins_500Medium,
  Poppins_500Medium_Italic,
  Poppins_600SemiBold,
  Poppins_600SemiBold_Italic,
  Poppins_700Bold,
  Poppins_700Bold_Italic,
  Poppins_800ExtraBold,
  Poppins_800ExtraBold_Italic,
  Poppins_900Black,
  Poppins_900Black_Italic,
} from "@expo-google-fonts/poppins";

export default function PoppinsFont() {
  let [fontsLoaded] = useFonts({
    Poppins_100Thin,
    Poppins_100Thin_Italic,
    Poppins_200ExtraLight,
    Poppins_200ExtraLight_Italic,
    Poppins_300Light,
    Poppins_300Light_Italic,
    Poppins_400Regular,
    Poppins_400Regular_Italic,
    Poppins_500Medium,
    Poppins_500Medium_Italic,
    Poppins_600SemiBold,
    Poppins_600SemiBold_Italic,
    Poppins_700Bold,
    Poppins_700Bold_Italic,
    Poppins_800ExtraBold,
    Poppins_800ExtraBold_Italic,
    Poppins_900Black,
    Poppins_900Black_Italic,
  });

  return fontsLoaded;
}

解决方案

之前的方法无效是因为useFonts是React Hook,只能在React组件中执行,而全局样式表是静态的StyleSheet对象,无法运行Hook逻辑。正确的做法是在应用根组件中加载字体,确保字体加载完成后再渲染应用,这样全局样式里的fontFamily就能匹配到已加载的字体。

方法1:直接在根组件加载字体

修改你的根组件(比如App.js),在其中完成字体加载:

import { StatusBar } from 'expo-status-bar';
import { View, Text } from 'react-native';
import { useFonts, 
  Poppins_100Thin,
  Poppins_100Thin_Italic,
  Poppins_200ExtraLight,
  Poppins_200ExtraLight_Italic,
  Poppins_300Light,
  Poppins_300Light_Italic,
  Poppins_400Regular,
  Poppins_400Regular_Italic,
  Poppins_500Medium,
  Poppins_500Medium_Italic,
  Poppins_600SemiBold,
  Poppins_600SemiBold_Italic,
  Poppins_700Bold,
  Poppins_700Bold_Italic,
  Poppins_800ExtraBold,
  Poppins_800ExtraBold_Italic,
  Poppins_900Black,
  Poppins_900Black_Italic,
} from '@expo-google-fonts/poppins';
import { globalStyles } from './path/to/globalStyles';

export default function App() {
  let [fontsLoaded] = useFonts({
    Poppins_100Thin,
    Poppins_100Thin_Italic,
    Poppins_200ExtraLight,
    Poppins_200ExtraLight_Italic,
    Poppins_300Light,
    Poppins_300Light_Italic,
    Poppins_400Regular,
    Poppins_400Regular_Italic,
    Poppins_500Medium,
    Poppins_500Medium_Italic,
    Poppins_600SemiBold,
    Poppins_600SemiBold_Italic,
    Poppins_700Bold,
    Poppins_700Bold_Italic,
    Poppins_800ExtraBold,
    Poppins_800ExtraBold_Italic,
    Poppins_900Black,
    Poppins_900Black_Italic,
  });

  // 字体未加载完成时显示加载提示
  if (!fontsLoaded) {
    return <View><Text>加载字体中...</Text></View>;
  }

  return (
    <View style={globalStyles.container}>
      <Text style={globalStyles.primaryButtonText}>主按钮文本</Text>
      <Text style={globalStyles.secondaryButtonText}>次要按钮文本</Text>
      <StatusBar style="auto" />
    </View>
  );
}

方法2:封装字体加载组件(代码解耦)

如果不想把字体加载逻辑写在根组件,可以封装成独立的FontLoader组件:

// components/FontLoader.js
import { useFonts, 
  Poppins_100Thin,
  Poppins_100Thin_Italic,
  Poppins_200ExtraLight,
  Poppins_200ExtraLight_Italic,
  Poppins_300Light,
  Poppins_300Light_Italic,
  Poppins_400Regular,
  Poppins_400Regular_Italic,
  Poppins_500Medium,
  Poppins_500Medium_Italic,
  Poppins_600SemiBold,
  Poppins_600SemiBold_Italic,
  Poppins_700Bold,
  Poppins_700Bold_Italic,
  Poppins_800ExtraBold,
  Poppins_800ExtraBold_Italic,
  Poppins_900Black,
  Poppins_900Black_Italic,
} from '@expo-google-fonts/poppins';
import { View, Text } from 'react-native';

export default function FontLoader({ children }) {
  let [fontsLoaded] = useFonts({
    Poppins_100Thin,
    Poppins_100Thin_Italic,
    Poppins_200ExtraLight,
    Poppins_200ExtraLight_Italic,
    Poppins_300Light,
    Poppins_300Light_Italic,
    Poppins_400Regular,
    Poppins_400Regular_Italic,
    Poppins_500Medium,
    Poppins_500Medium_Italic,
    Poppins_600SemiBold,
    Poppins_600SemiBold_Italic,
    Poppins_700Bold,
    Poppins_700Bold_Italic,
    Poppins_800ExtraBold,
    Poppins_800ExtraBold_Italic,
    Poppins_900Black,
    Poppins_900Black_Italic,
  });

  if (!fontsLoaded) {
    return <View><Text>加载字体中...</Text></View>;
  }

  return children;
}

然后在根组件中使用:

// App.js
import { StatusBar } from 'expo-status-bar';
import { View } from 'react-native';
import FontLoader from './components/FontLoader';
import { globalStyles } from './path/to/globalStyles';
import MainApp from './path/to/MainApp';

export default function App() {
  return (
    <FontLoader>
      <View style={globalStyles.container}>
        <MainApp />
        <StatusBar style="auto" />
      </View>
    </FontLoader>
  );
}

注意事项

你的全局样式表无需修改,只要字体在根组件加载完成,全局样式中定义的fontFamily(如Poppins_100Thin)就能自动匹配到已加载的字体。

内容的提问来源于stack exchange,提问作者JohnBradens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:31:13