【问题标题】:How to load custom Fonts in an Expo app using React Navigation and Redux如何使用 React Navigation 和 Redux 在 Expo 应用程序中加载自定义字体
【发布时间】:2021-08-30 09:31:01
【问题描述】:

我只是无法在使用 Expo、React Natvigation 的现有应用程序中加载自定义字体。我有一个在 core.js 文件中设置导航的应用程序

    import React from "react";
import {Text, View, StyleSheet} from "react-native";
import {NavigationContainer} from "@react-navigation/native";
import {createStackNavigator} from "@react-navigation/stack";
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import LoginScreen from "./login.js";
import RegisterScreen from "./register.js";
//import Home from "./home.js";
import PostAJobPage from "./secondTab.js";
import Ionicons from "react-native-vector-icons/Ionicons"
import store from "./store";
import SplashScreen from "./splashscreen";
import Home from "./homeStack.js";
import { Entypo } from '@expo/vector-icons';
import { MaterialCommunityIcons } from '@expo/vector-icons';
import SearchAJobStack from "./jobsearchstack.js";


const Tab = createBottomTabNavigator()

const Tabs = () => {
  return(
    //<NavigationContainer>
      <Tab.Navigator initialRouteName = "home"
        screenOptions = {({route}) => ({
          tabBarIcon : ({focused,color, size}) => {
            let iconName;
            if(route.name == "home") {
              iconName = "ios-home"
              return <Ionicons name = {iconName} color = {color} size = {size}/>
            }
            else if(route.name == "postJob")
            {
              //iconName = "md-settings"
              iconName = "briefcase"
              return <Entypo name = {iconName} color = {color} size = {size}/>
            }
            else if (route.name == "searchJob")
            {
              iconName = "briefcase-search"
              return <MaterialCommunityIcons name = {iconName} size={size} color= {color} />
            }

            //return <Ionicons name = {iconName} color = {color} size = {size}/>
          }
        })}
        tabBarOptions = {{
          style : {
            height : 50
          },
          showLabel : false,
          activeTintColor : "gold"
        }

        }>
        <Tab.Screen name="home" component ={Home}/>
        <Tab.Screen name="postJob" component ={PostAJobPage}/>
        <Tab.Screen name="searchJob" component ={SearchAJobStack}/>
      </Tab.Navigator>
    //</NavigationContainer>
  )
}


const Stack = createStackNavigator()

function Stacks() {
  return(
    <NavigationContainer>
      <Stack.Navigator initialRouteName = "loadingPage">
        <Stack.Screen
          name = "loadingPage"
          component = {SplashScreen}
          options = {{
            headerShown : false
          }}/>

        <Stack.Screen
          name ="Main"
          component = {Tabs}
          options = {{
            headerShown : false,
          }}/>
        <Stack.Screen name= "login"
          component = {LoginScreen}
          options = {{
            title : "Login",
            headerTitleAlign : "left"
          }}/>

        <Stack.Screen name= "register"
          component = {RegisterScreen}
          options = {{
            title : "Register",
            headerTitleAlign : "left",
          }}/>
      </Stack.Navigator>
    </NavigationContainer>
  )
}

export default class core extends React.Component {

  render(){
    return (
      <Stacks/>
    )
  }
}


const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor : "#fff",
    alignItems : "center",
    justifyContent : "center",
  }
})

我在我的 App.js 中导入此堆栈,并添加了代码以根据 Expo 中的文档添加自定义字体,但如果我将 fontFamily: Pacifico 更改为任何屏幕,它都不起作用

我的 app.js 文件是

    import 'react-native-gesture-handler';
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View, Image } from 'react-native';
import Core from "./core.js";
import {Provider} from "react-redux";
import store from "./store.js";
import * as Font from "expo-font";

const customFonts = {
  dancingScript : require("./assets/fonts/DancingScript-Regular.ttf"),
  Pacifico : require("./assets/fonts/Pacifico-Regular.ttf"),
  Inter : require("./assets/fonts/Inter-VariableFont.ttf"),
}


export default class App extends React.Component {
  state = {
    fontsLoaded : false,
  }
  async _loadFontsAsync() {
    await Font.loadAsync(customFonts);
    this.setState({ fontsLoaded: true });
  }

  componentDidMount() {
    this._loadFontsAsync();
  }

  render(){
    if(this.state.fontsLoaded)
    {
      return (
        <Provider store = {store}>
          
          <Core/>

        </Provider>
      );
    }
    else {
      return(
        <View style= {styles.container}>
          <Image source = {require("./ajax-loader.gif")}/>
        </View>
      )
    }

  }

}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
    //fontFamily : "dancingScript",
  },
});

【问题讨论】:

    标签: reactjs react-native fonts expo react-navigation


    【解决方案1】:

    我个人觉得这是加载自定义字体的更好方法。我在所有项目中都使用这种方法。到loadFonts 创建一个名为hooks 的文件夹,您的App.js 所在的位置

    然后,安装expo-app-loading & expo-font

    然后在hooks文件夹中创建一个名为useFonts.js的文件

    useFonts.js里面这样写

    import * as Font from "expo-font";
    
    export default useFonts = async () => {
       await Font.loadAsync({
          "Pacifico" : require("./assets/fonts/Pacifico-Regular.ttf"),
          // All other fonts here
        });
    };.
    

    现在在你的App.js 中这样写

    import * as Font from 'expo-font';
    import AppLoading from 'expo-app-loading';
    import React, { useState } from 'react';
    
    import useFonts from './hooks/useFonts';
    
    export default function App() {
      const [IsReady, SetIsReady] = useState(false);
    
      const LoadFonts = async () => {
        await useFonts();
      };
    
      if (!IsReady) {
        return (
          <AppLoading
            startAsync={LoadFonts}
            onFinish={() => SetIsReady(true)}
            onError={() => {}}
          />
        );
      }
    
      return <View styles={styles.container}>{/* Code Here */}</View>;
    }
    

    注意:以上解决方案适用于Function 组件。

    对于Class Component,你可以这样做

    Working Example Here

    import React from 'react';
    import { StyleSheet, Text, View, Image } from 'react-native';
    
    import useFonts from './hooks/useFonts';
    
    export default class App extends React.Component {
      state = {
        fontsLoaded: false,
      };
    
      async _loadFontsAsync() {
        await useFonts();
        this.setState({ fontsLoaded: true });
      }
    
      componentDidMount() {
        this._loadFontsAsync();
      }
    
      render() {
        if (this.state.fontsLoaded) {
          return (
            <View style={styles.container}>
              <Text>Fonts Loaded</Text>
              <Text style={{ fontFamily: 'Helvetica' }}>Helvetica Text</Text>
              <Text>Normal Text</Text>
            </View>
          );
        } else {
          return (
            <View style={styles.container}>
              <Image
                source={{
                  uri:
                    'https://landerapp.com/blog/wp-content/uploads/2018/06/1_FFP1bisztXseQFbZ-WQedw-1.png',
                }}
                style={{ width: '100%', height: '100%' }}
              />
            </View>
          );
        }
      }
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center',
        //fontFamily : "dancingScript",
      },
    });
    

    【讨论】:

    • 修正它起作用了,我正在改变一些已经有 fontWeight 的文本的 fontfamily :“bold”,它没有让它改变,删除 fontweight 为我解决了它
    【解决方案2】:

    这就是您如何在 expo 应用程序中加载字体的方法 在您的应用程序的入口点(主要是 App.js)中编写代码

      import { useFonts } from "expo-font"; 
    
       const [fontsLoaded] = useFonts({
            // Axiforma: require("./assets/fonts/Axiforma-Black.ttf"),
            // BlackItalic: require("./assets/fonts/Axiforma-BlackItalic.ttf"),
            Bold: require("./assets/fonts/Axiforma-Bold.ttf"),
            // BoldItalic: require("./assets/fonts/Axiforma-BoldItalic.ttf"),
            // Book: require("./assets/fonts/Axiforma-Book.ttf"),
            // BookItalic: require("./assets/fonts/Axiforma-BookItalic.ttf"),
            ExtraBold: require("./assets/fonts/Axiforma-ExtraBold.ttf"),
            // ExtraBoldItalic: require("./assets/fonts/Axiforma-ExtraBoldItalic.ttf"),
            // Heavy: require("./assets/fonts/Axiforma-Heavy.ttf"),
            // HeavyItalic: require("./assets/fonts/Axiforma-HeavyItalic.ttf"),
            // Italic: require("./assets/fonts/Axiforma-Italic.ttf"),
            Light: require("./assets/fonts/Axiforma-Light.ttf"),
            // LightItalic: require("./assets/fonts/Axiforma-LightItalic.ttf"),
            Medium: require("./assets/fonts/Axiforma-Medium.ttf"),
            // MediumItalic: require("./assets/fonts/Axiforma-MediumItalic.ttf"),
            Regular: require("./assets/fonts/Axiforma-Regular.ttf"),
            SemiBold: require("./assets/fonts/Axiforma-SemiBold.ttf"),
            // SemiBoldItalic: require("./assets/fonts/Axiforma-SemiBoldItalic.ttf"),
            Thin: require("./assets/fonts/Axiforma-Thin.ttf"),
            // ThinItalic: require("./assets/fonts/Axiforma-ThinItalic.ttf"),
          });
          if (!fontsLoaded) return <AppLoading />;
    

    【讨论】:

    • 这没有帮助,似乎仍然无法让它们在任何屏幕上发生变化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2020-04-18
    • 1970-01-01
    • 2021-08-31
    • 2017-12-18
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多