Ошибка загрузки собственного шрифта

Я получаю сообщение об ошибке: You started loading 'Roboto_medium', but used it before it finished loading при использовании собственной базы.

введите описание изображения здесь

Я следовал инструкциям на официальной странице.

Чтобы создать нативное приложение для реагирования, я использую create-react-native-app.

App.js

export default class App extends React.Component {

async componentWillMount() {
  await Expo.Font.loadAsync({
  'Roboto': require('native-base/Fonts/Roboto.ttf'),
  'Roboto_medium': require('native-base/Fonts/Roboto_medium.ttf'),
  'Ionicons': require('@expo/vector-icons/fonts/Ionicons.ttf'),
 });
}

 render() {
   return (
    <Container>
      <StatusBar hidden={true} />

    <Button>
      <Text>
        Button
      </Text>
    </Button>

    <ListaItens />
    </Container>
  );
}
} 

person Igor Martins    schedule 15.11.2017    source источник


Ответы (5)


вам нужно дождаться загрузки шрифтов. Вы можете сделать что-то вроде этого

import React from "react";
import { StatusBar } from "react-native";
import { Container, Button, text, ListItem, Text } from "native-base";
import Expo from "expo";

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { loading: true };
  }

  async componentWillMount() {
    await Expo.Font.loadAsync({
      Roboto: require("native-base/Fonts/Roboto.ttf"),
      Roboto_medium: require("native-base/Fonts/Roboto_medium.ttf"),
      Ionicons: require("@expo/vector-icons/fonts/Ionicons.ttf"),
    });
    this.setState({ loading: false });
  }

  render() {
    if (this.state.loading) {
      return <Expo.AppLoading />;
    }
    return (
      <Container>
        <StatusBar hidden={true} />

        <Button>
          <Text>Button</Text>
        </Button>

        <ListItem />
      </Container>
    );
  }
}
person akhil xavier    schedule 15.11.2017

Этот новый код для выставочного SDK 35, который был изменен из ответа @akhil xavier

Сначала установите экспо-шрифт

expo install 'expo-font'

вот App.js

import React from "react";
import * as Font from "expo-font";
import { ActivityIndicator } from "react-native";
import { Root } from "native-base";

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { loading: true };
  }

  async componentWillMount() {
    await Font.loadAsync({
      Roboto: require("native-base/Fonts/Roboto.ttf"),
      Roboto_medium: require("native-base/Fonts/Roboto_medium.ttf"),
      Ionicons: require("@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Ionicons.ttf"),
    });
    this.setState({ loading: false });
  }

  render() {
    if (this.state.loading) {
      return <ActivityIndicator />;
    }
    return (
      <Root>
       <RootPage /> // starter component (i.e. nav)
      </Root>
    );
  }
}
person fmchan    schedule 05.10.2019

Решение, которое работает для меня, приведено ниже. Моя ошибка заключалась в том, что я импортировал шрифт как (шрифты), но при вызове не заметил «s». Исправлено это, убедившись, что имя импорта похоже на то, к чему вы вызываете loadAsync. Чтобы он работал, в вашем проекте должен быть установлен 'expo-font'.

import React from "react";
import * as Font from "expo-font";
import { AppLoading } from "expo";
import MealsNavigator from "./navigation/MealsNavigator";


const fetchFonts = () => {
  return Font.loadAsync({
    "open-sans": require("./assets/fonts/OpenSans-Regular.ttf"),
    "open-sans-bold": require("./assets/fonts/OpenSans-Bold.ttf")
  });
};

export default function App() {
  const [fontLoaded, setFontLoaded] = useState(false);
  if (!fontLoaded) {
    return (
      <AppLoading
        startAsync={fetchFonts}
        onFinish={() => setFontLoaded(true)}
        onError={err => console.log(err)}
      />
    );
  }
  return <MealsNavigator />;
}
person cherucole    schedule 02.12.2019
comment
Ницца. Рад видеть, что кто-то еще посещает курсы Макса. В моем случае я забыл вернуть Font.loadAsync() внутри fetchFonts. - person Gustavo Maximo; 07.01.2021

Если у кого-то возникла эта проблема с семейством шрифтов «MaterialIcons», у меня была аналогичная проблема, и я обнаружил, что это решение работает:

https://javascriptrambling.blogspot.com.au/2018/03/expo-icon-fonts-with-react-native-and.html

Вам в основном нужно:

  1. Установите шрифты (используя npm install)
  2. Выполните Font.loadAsync для шрифтов в вашей функции componentWillMount().
  3. Не забудьте пометить функцию componentWillMount() как асинхронную.
  4. Условно отображается либо как «загрузка», либо с представлением в зависимости от состояния флага «загружено».

Например:

import React from 'react';
import { View } from 'react-native';
import { Avatar } from 'react-native-elements';
import { AppLoading, Font } from 'expo';

import FontAwesome  
  from './node_modules/@expo/vector-icons/fonts/FontAwesome.ttf';

import MaterialIcons  
  from './node_modules/@expo/vector-icons/fonts/MaterialIcons.ttf';


export default class App extends React.Component {
  state = {
    fontLoaded: false
  };

  async componentWillMount() {
    try {
      await Font.loadAsync({
        FontAwesome,
        MaterialIcons
      });
      this.setState({ fontLoaded: true });
    } catch (error) {
      console.log('error loading icon fonts', error);
    }
  }

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

    return (
      <View>
        <Text>My App</Text>
        <Avatar
          small
          rounded
          icon={{ name: 'add' }}
        /> 
      </View>
    );
  }
}
person Andre DiCioccio    schedule 19.04.2018

Одна из причин, по которой он должен загружать шрифт, заключается в том, что вы используете компонент Native Base Text. Если вместо этого вы импортируете компонент React Native Text, вам даже не придется загружать шрифты, и вы не увидите эту ошибку.

person Tawanda Muzavazi    schedule 24.02.2019
comment
Нет, это не правда. у меня нет ошибки при импорте текста из родной базы. Ошибка возникает, когда я использую карту - person fmchan; 05.10.2019