React-native异步函数的钩子问题

时间:2019-07-07 16:20:59

标签: javascript reactjs react-native react-hooks

我尝试加载fontfamily,我使​​用了具有异步功能的钩子,但出现了一些错误:

function Button(props: TouchableOpacityProps & ButtonProps) {
  useEffect(() => {
    async function loadFont() {
      await Font.loadAsync({
        gotham_medium: require("../../assets/GothamMedium_1.ttf")
      });
    }
    loadFont()
  }, []);
  return (
    <TouchableOpacity {...props} style={styles.button}>
      <Text style={styles.title}>{props.title}</Text>
    </TouchableOpacity>
  );
};

我从expo导入了Font,并从react导入了useEffect,但是出现此错误。 error on the device

2 个答案:

答案 0 :(得分:2)

这是我在应用程序上拥有的功能,以防它对某人有所帮助。

  useEffect(() => {
    const loadFonts = async () => {
      await Font.loadAsync({
        'pokeh': require('../../assets/fonts/pokeh.ttf'),
      });
      setFontReady(true);
    };
    loadFonts();
  }, []);

使用npm安装expo-font之后,这两个位于顶部

import * as Font from 'expo-font';
import { AppLoading } from 'expo';

在此树状结构下:

enter image description here

答案 1 :(得分:0)

您的错误可能是由错误的React版本产生的。您确定至少使用Expo SDK 33吗?

如果这不是问题,我相信如果您在此过程中尽早加载所有资产,可能会更容易。 Expo提供了一个AppLoading组件,该组件带有一个startAsync道具,可用于轻松解决所有异步诺言。

所以您的App.js可能像这样:

import { AppLoading } from 'expo';
import * as Font from 'expo-font';
import React, { useState } from 'react';
import { StyleSheet, View, Text } from 'react-native';

export default function App(props) {
  const [isLoadingComplete, setLoadingComplete] = useState(false);

  if (!isLoadingComplete && !props.skipLoadingScreen) {
    return (
      <AppLoading
        startAsync={loadResourcesAsync}
        onError={handleLoadingError}
        onFinish={() => handleFinishLoading(setLoadingComplete)}
      />
    );
  } else {
    return (
      <View style={styles.container}>
        <Text style={styles.title}>Welcome to your Expo app</Text>
      </View>
    );
  }
}

async function loadResourcesAsync() {
  await Promise.all([
    Font.loadAsync({
      'gotham-medium': require('./assets/GothamMedium_1.ttf')
    }),
  ]);
}

function handleLoadingError(error) {
  console.warn(error);
}

function handleFinishLoading(setLoadingComplete) {
  setLoadingComplete(true);
}

const styles = StyleSheet.create({
  container: {
    marginTop: 60,
    flex: 1,
    backgroundColor: '#fff',
  },
  title: {
    fontFamily: 'gotham-medium',
    fontSize: 36
  }
});

,然后您就可以在应用中的任何地方访问fontFamily: 'gotham-medium'。您也可以在Promise.all()调用中解决多个承诺(加载其他资产等)

让我知道是否有帮助。干杯!