React Native - Expo: fontFamily 'SimpleLineIcons' не является системным шрифтом и не был загружен через Font.loadAsync

Итак, я получаю эту ошибку на устройстве / эмуляторе Android:

React Native - Expo: fontFamily 'SimpleLineIcons' не является системным шрифтом и не был загружен через Font.loadAsync

С другой стороны, на iOS он компилируется нормально, и simple-line-icons отображаются правильно.

У меня последняя версия expo.

Мой package.json:

{
  "name": "FamScore3",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "react-native-scripts": "1.14.0",
    "jest-expo": "^31.0.0",
    "react-test-renderer": "16.3.1"
  },
  "main": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
  "scripts": {
    "start": "react-native-scripts start",
    "eject": "react-native-scripts eject",
    "android": "react-native-scripts android",
    "ios": "react-native-scripts ios",
    "test": "jest"
  },
  "jest": {
    "preset": "jest-expo"
  },
  "dependencies": {
    "@firebase/auth": "^0.7.6",
    "@firebase/database": "^0.3.6",
    "axios": "^0.18.0",
    "metro-react-native-babel-preset": "^0.45.0",
    "expo": "^31.0.4",
    "firebase": "^5.5.1",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-31.0.1.tar.gz",
    "react-native-elements": "^0.19.1",
    "react-native-material-dropdown": "^0.11.1",
    "react-native-router-flux": "^4.0.1",
    "react-redux": "^5.0.7",
    "redux": "^4.0.0",
    "redux-thunk": "^2.3.0"
  }
}

Мой app.json:

{
  "expo": {
    "sdkVersion": "31.0.0"
  }
}

Мой метод Font.loadAsync в App.js, как реализовано в документации:

export default class App extends Component {

  state = {
    fontLoaded: false
  }

  async componentDidMount() {
    try {

      await Font.loadAsync({
        amaticBold: require('./assets/fonts/amaticSC-Bold.ttf'),
        indieFlower: require('./assets/fonts/indieFlower.ttf'),
        'Material Icons': require('@expo/vector-icons/fonts/MaterialIcons.ttf'),
        'simple-line-icons': require('@expo/vector-icons/fonts/SimpleLineIcons.ttf')

      })

      this.setState({ fontLoaded: true })

    } catch (error) {
      console.info('error loading fonts', error);
    }

  }

  render() {
    const store = createStore(reducers, {}, applyMiddleware(ReduxThunk))

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

    return (
      <Provider store = {store}>
        <Router />
      </Provider> 
    )
  }
}

Заранее большое спасибо. Любая помощь приветствуется! Я застрял на какое-то время.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
0
16 033
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Итак, мне наконец удалось решить эту проблему.

Проблема заключалась в том, что iOS и Android, по-видимому, требуют разных имен для шрифтов, которые вы хотите загрузить.

Простые иконки, которые я загрузил, работали только для iOS, а на Android я получил эту ошибку: fontFamily 'SimpleLineIcons' не является системным шрифтом и не был загружен через Font.loadAsync.

В итоге я загрузил и простые иконки, и SimpleLineIcons, указывая на один и тот же каталог, например:

componentDidMount() {
    this.loadAssetsAsync()
  }

  loadAssetsAsync = async () => {
    await Font.loadAsync({
      amaticBold: require('./assets/fonts/amaticSC-Bold.ttf'),
      indieFlower: require('./assets/fonts/indieFlower.ttf'),
      'Material Icons': require('@expo/vector-icons/fonts/MaterialIcons.ttf'),
      'MaterialIcons': require('@expo/vector-icons/fonts/MaterialIcons.ttf'),
      'SimpleLineIcons': require('@expo/vector-icons/fonts/SimpleLineIcons.ttf'),
      'simple-line-icons': require('@expo/vector-icons/fonts/SimpleLineIcons.ttf')
    })
    this.setState({ fontLoaded: true })
  }

  render() {
    const store = createStore(reducers, {}, applyMiddleware(ReduxThunk))

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

    return (
      <Provider store = {store}>
        <Router />
      </Provider>
    )
  }

Это, по общему признанию, уродливое решение на данный момент решило мою проблему. Убедитесь, что вы действительно набираете именно так, как вам подсказывает ошибка. Если ошибка: fontFamily MyAwesomeFont не является системным шрифтом ... Тогда вам действительно нужно назвать это:

Font.loadAsync({
    'MyAwesomeFont': require('./path/to/MyAwesomeFont.ttf')
})

Надеюсь, это поможет кому-нибудь.

У меня была такая же проблема, и я обнаружил, что изменение имени шрифта на тот, который вы назвали, может решить проблему:

// Before
'my-awesome-font': require('./path/to/my-awesome-font.ttf')

// After
'MyAwesomeFont': require('./path/to/my-awesome-font.ttf')

Это может быть знак тире, который нельзя использовать.

У меня была та же проблема, и я потратил много времени на эту ошибку. Это 2021 год, и есть лучший способ сделать то же самое, поэтому вместо кода ниже

Font.loadAsync({
    'MyAwesomeFont': require('./path/to/MyAwesomeFont.ttf')
})

Правильный способ сделать это

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

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

Если вам нужны дополнительные объяснения, проверьте официальные документы здесь

Я столкнулся с этой ошибкой, когда использовал @ response-native-render-html, где он рендерил Html, сгенерированный из других cms, и это вызывает проблему семейства шрифтов, если создатель контента использовал собственный шрифт.

поэтому для решения этой проблемы я использовал функцию ignoredStyles в рендерере HTML, а затем установите baseFontStyle, чтобы текстовое содержимое выглядело одинаково.

код:

import HTML from "react-native-render-html"`

<HTML ignoredStyles = {['fontFamily']} baseFontStyle = {[fontFamily: 'nunito-regular', fontSize: 16]} />

Если вы пришли из "Сетевого ниндзя" Туто, вот решение.

Home.js

import React, { useState } from 'react';
import {StyleSheet, View, Text } from 'react-native';

export default function Home() {
    return (
        <View style = {styles.container}>
            <Text style = {styles.titleText}>Home Screen</Text>
        </View>
    );
}

// https://docs.expo.dev/guides/using-custom-fonts/
const styles = StyleSheet.create({
    container: {
        padding: 24,
    },
    titleText:{
        fontFamily: 'Nunito-Bold',
        fontSize: 24,
    }
})

App.js

import { StatusBar } from 'expo-status-bar';
import React, { useState } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import Home from './screens/home';

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

export default function App() {
  // const [fontsLoaded, setFontsLoaded] = useState(false);

  const [fontsLoaded] = useFonts({
    'Nunito-Regular': require('./assets/fonts/Nunito-Regular.ttf'),
    'Nunito-Bold': require('./assets/fonts/Nunito-Bold.ttf'),
  });

  if (!fontsLoaded) {
    return (
      <AppLoading />
    )
  } else {
    return (
      <Home />
    );
  }
}


const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

Другие вопросы по теме