Reactjs Can';t似乎无法使用Expo';s Font.loadAsync

Reactjs Can';t似乎无法使用Expo';s Font.loadAsync,reactjs,react-native,fonts,expo,Reactjs,React Native,Fonts,Expo,我正在使用React Native with Expo,除了这个自定义字体的问题外,一切都很顺利。我在./assets/fonts中有我的fontLobster Regular.ttf,我一直在尝试加载它,如官方文档中所示: componentDidMount() { Font.loadAsync({ 'Lobster': require('./assets/fonts/Lobster-Regular.ttf'), }); } 然后,我将标题样式设置为:

我正在使用React Native with Expo,除了这个自定义字体的问题外,一切都很顺利。我在./assets/fonts中有我的font
Lobster Regular.ttf
,我一直在尝试加载它,如官方文档中所示:

componentDidMount() {

    Font.loadAsync({

      'Lobster': require('./assets/fonts/Lobster-Regular.ttf'),
    });

  }
然后,我将标题样式设置为:

  headerText: {
    color: 'white',
    fontSize: 30,
    fontFamily: 'Lobster'
  }, 
我得到的只是

fontFamily“Lobster”不是系统字体,尚未加载 通过Font.loadAsync

  • 如果要使用系统字体,请确保键入的名称正确,并且设备操作系统支持该名称

  • 如果这是自定义字体,请确保使用font.loadAsync加载它


我错过什么了吗?

是的。您缺少调用是
Font.loadAsync()
。这意味着它异步加载。例如:这需要一段时间。在加载字体之前,无法呈现UI。您需要按照以下思路做一些事情:

import { AppLoading, Font } from 'expo'

state = {
    fontsLoaded: false,
    ...
}

componentWillMount() {
    Font.loadAsync( {
            'Lobster': require('./assets/fonts/Lobster-Regular.ttf')
        }
    ).then( () => this.setState( { fontsLoaded: true } ) )
}

render() {
    if( !this.state.fontsLoaded ) {
        return <AppLoading/>
    }

    return (
        ...
    )
}
从“expo”导入{AppLoading,Font}
状态={
fontsLoaded:错,
...
}
组件willmount(){
Font.loadAsync({
“Lobster”:需要(“./assets/font/Lobster Regular.ttf”)
}
).then(()=>this.setState({fontsLoaded:true}))
}
render(){
如果(!this.state.fontsLoaded){
返回
}
返回(
...
)
}

**在无状态函数中反应本机字体**

**步骤:1从expo导入字体**

*步骤2:需要文件中的字体*

**步骤4:使用已加载的应用程序**


从expo CLI安装expo字体软件包,因为有时expo字体版本与您的expo版本不兼容,所以

第1步:

expo install expo-font
class App extends React.Component {
  state = {
    fontLoaded: false,
  };

  componentDidMount() {
    this.loadAssetsAsync();
  }

  async loadAssetsAsync() {
    await Font.loadAsync({
      // Load a font `Montserrat` from a static resource
      MuseoSans500: require("./assets/fonts/museosans_500-webfont.ttf"),
      MuseoSans700: require("./assets/fonts/museosans_700-webfont.ttf"),
    });
    this.setState({ fontLoaded: true });
  }

  render() {
    if (!this.state.fontLoaded) {
      return null; // render some progress indicator
    }
    return <AnyComponent />;
  }
}


第二步:

expo install expo-font
class App extends React.Component {
  state = {
    fontLoaded: false,
  };

  componentDidMount() {
    this.loadAssetsAsync();
  }

  async loadAssetsAsync() {
    await Font.loadAsync({
      // Load a font `Montserrat` from a static resource
      MuseoSans500: require("./assets/fonts/museosans_500-webfont.ttf"),
      MuseoSans700: require("./assets/fonts/museosans_700-webfont.ttf"),
    });
    this.setState({ fontLoaded: true });
  }

  render() {
    if (!this.state.fontLoaded) {
      return null; // render some progress indicator
    }
    return <AnyComponent />;
  }
}


类应用程序扩展了React.Component{
状态={
错误:,
};
componentDidMount(){
这个.loadAssetAsync();
}
异步LoadAssetAsync(){
等待Font.loadAsync({
//从静态资源加载字体“Montserrat”
MuseoSans500:require(“./assets/font/museosans_500-webfont.ttf”),
MuseoSans700:require(“./assets/font/museosans_700-webfont.ttf”),
});
this.setState({fontLoaded:true});
}
render(){
如果(!this.state.fontload){
return null;//呈现一些进度指示器
}
返回;
}
}
在App.js文件中使用此useEffect进行加载,加载后,字体可以在expo或react原生项目中的任何位置使用

const Heading = (color) => {
    return({fontSize:45*fontScale, fontFamily: "Montserrat-SemiBold", color, marginTop: -10, marginLeft: InitialMargin, letterSpacing: 4})
}

请确保您没有使用fontWeight样式,因为它将覆盖fontStyle,并且不会将fontFamily应用于文本。

Font.loadAsync很旧,并且被证明存在不可预知的问题。现在,世博会推出了新的解决方案

因此,正确的代码是:

import {useFonts} from 'expo-font';
import AppLoading from "expo-app-loading";

let [fontsLoaded] = useFonts({
      'Lobster': require('./assets/fonts/Lobster-Regular.ttf'),
    });
    if (!fontsLoaded) {
        return <AppLoading/>;
    }
...
从“expo字体”导入{useFonts};
从“世博会应用加载”导入应用加载;
让[fontsLoaded]=使用字体({
“Lobster”:要求(“./assets/font/Lobster Regular.ttf”),
});
如果(!fontsLoaded){
返回;
}
...
expo install expo-font
class App extends React.Component {
  state = {
    fontLoaded: false,
  };

  componentDidMount() {
    this.loadAssetsAsync();
  }

  async loadAssetsAsync() {
    await Font.loadAsync({
      // Load a font `Montserrat` from a static resource
      MuseoSans500: require("./assets/fonts/museosans_500-webfont.ttf"),
      MuseoSans700: require("./assets/fonts/museosans_700-webfont.ttf"),
    });
    this.setState({ fontLoaded: true });
  }

  render() {
    if (!this.state.fontLoaded) {
      return null; // render some progress indicator
    }
    return <AnyComponent />;
  }
}


useEffect(()=>{
    async function loadFonts(){
      await Font.loadAsync({
        'Montserrat': require("./assets/fonts/Montserrat/Montserrat-Regular.ttf"),
        'Montserrat-SemiBold': require('./assets/fonts/Montserrat/Montserrat-SemiBold.ttf'),
        'Montserrat-Bold': require('./assets/fonts/Montserrat/Montserrat-Bold.ttf'),
        'Fascinate': require('./assets/fonts/Fascinate/Fascinate-Regular.ttf')
      }).then(res=>{
        console.log("FONTS LOADED!");
        setLoaded(true)
      }).catch(Err=>{
        setLoaded(true);
        console.log(Err);
      }); 
    }

    loadFonts();
  },[])
const Heading = (color) => {
    return({fontSize:45*fontScale, fontFamily: "Montserrat-SemiBold", color, marginTop: -10, marginLeft: InitialMargin, letterSpacing: 4})
}
import {useFonts} from 'expo-font';
import AppLoading from "expo-app-loading";

let [fontsLoaded] = useFonts({
      'Lobster': require('./assets/fonts/Lobster-Regular.ttf'),
    });
    if (!fontsLoaded) {
        return <AppLoading/>;
    }
...