我正在尝试将其与react-navigation一起使用,并且不断得到:
fontFamily'Feather'不是系统字体,尚未加载 通过Expo.Font.loadAsync
我在加载组件中使用Font.loadAsync()方法,但错误不断出现。我实际上最终从我的应用程序中删除了所有矢量图标,以便开始清理。
所以我的问题是我是否有一个以加载屏幕开头的开关导航器(这将启动auth检查),然后切换到包含我的应用程序内容的登录屏幕或根标签容器。我似乎不知道该在哪里调用Font.loadAsync()
这是我的MainNavigator.js
export default createBottomTabNavigator(
{
Friends: FriendsList,
Profile: Profile,
Settings: Settings
},
{
defaultNavigationOptions: ({navigation}) => ({
tabBarIcon: ({tintColor}) => {
const {routeName} = navigation.state;
let iconName;
if (routeName == "Friends") {
iconName = "users"
} else if (routeName == "Profile") {
iconName = "user"
} else if (routeName == "Settings") {
iconName = "settings"
}
return <Feather name={iconName} size={20} color={tintColor} />
}
}),
tabBarOptions: {
style: {
backgroundColor: "#fff"
},
inactiveTintColor: "#999",
activeTintColor: TERTIARY_COLOR
}
}
)
App.js
// Screens for Switch Navigator
import AuthScreens from "./components/screens/AuthScreens";
import LoadingScreen from "./components/screens/Loading";
import MainNavigator from "./MainNavigator";
const AppContainer = createAppContainer(createSwitchNavigator(
{
LoadingScreen,
AuthScreens,
MainNavigator
},
{
initialRouteName: "LoadingScreen"
}
))
加载屏幕
export default class LoadingScreen extends Component {
async componentDidMount() {
try{
await Font.loadAsync({
FeatherFont
})
firebase.auth().onAuthStateChanged(user => {
this.props.navigation.navigate(user ? "MainContainer" : "LoginScreen")
})
} catch(error) {
alert(error)
}
}
render() {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center"}}>
<ActivityIndicator/>
</View>
)
}
}
答案 0 :(得分:0)
您需要将它们加载到App.js
内的_loadResourcesAsync
中,而不用Font.loadAsync()
_loadResourcesAsync = async () => {
// blablabla
return Promise.all([
Asset.loadAsync([
require('random images'),
]),
Font.loadAsync(
// this line is where you load the font, name and path
{Feather: require('./assets/fonts/Feather-path.ttf')},
),
]);
};
然后在render
函数内部:
render() {
if (!this.state.isLoadingComplete && !this.props.skipLoadingScreen) {
return (
<AppLoading
startAsync={this._loadResourcesAsync}
onError={this._handleLoadingError}
onFinish={this._handleFinishLoading}
/>
);
} else {
return (
<View style={styles.container}>
<StatusBar barStyle="light-content" />
<AppNavigator style={styles.container} />
<BarraOffline connected={this.state.isConnected}/>
</View>
);
}
}
答案 1 :(得分:0)
我不知道您对FeatherFont
的定义
但我不认为Font
将其识别为字体。
Font
是处理字体相关任务的模块。
Expo.Font.loadAsync()
。componentDidMount()
生命周期方法中
App
组件。App
中添加以下方法:Font SDK
导入,让我们添加以下代码:我们需要一种在字体加载完成后重新呈现Text组件的方法。
class App extends React.Component {
state = {
fontLoaded: false,
};
async componentDidMount() {
await Font.loadAsync({
'open-sans-bold': require('./assets/fonts/OpenSans-Bold.ttf'),
});
this.setState({ fontLoaded: true });
}
}
使用React Native,您可以使用Text
样式属性在fontFamily
组件中指定字体。 fontFamily
是我们与Font.loadAsync
一起使用的密钥。
用法
<Text style={{ fontFamily: 'open-sans-bold', fontSize: 56 }}>
Hello, world!
</Text>