Reactjs Can';t似乎无法使用Expo';s Font.loadAsync
我正在使用React Native with Expo,除了这个自定义字体的问题外,一切都很顺利。我在./assets/fonts中有我的fontReactjs 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'), }); } 然后,我将标题样式设置为:
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/>;
}
...