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

Я продолжаю получать эту ошибку: скриншот ошибки

Вот код, который я использую для импорта моих пользовательских шрифтов Google:

import React, { useState } from "react";
import Home from "./screens/home";
import { View } from "react-native";
import * as Font from "expo-font";
import { AppLoading } from "expo";

const getFonts = () =>
  Font.loadAsync({
    "poppins-regular": require("./assets/fonts/Poppins-Regular.ttf"),
    "poppins-bold": require("./assets/fonts/Poppins-Bold.ttf"),
  });

export default function App() {
  const [fontsLoaded, setFontsLoaded] = useState(false);
  if (fontsLoaded) {
    return <Home />;
  } else {
    return (
      <AppLoading startAsync = {getFonts} onFinish = {() => setFontsLoaded(true)} />
    );
  }
}

Вот мой пакет Json:

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject"
  },
  "dependencies": {
    "expo": "~40.0.0",
    "expo-splash-screen": "^0.8.1",
    "expo-status-bar": "~1.0.3",
    "react": "16.13.1",
    "react-dom": "16.13.1",
    "react-native": "https://github.com/expo/react-native/archive/sdk-40.0.1.tar.gz",
    "react-native-web": "~0.13.12"
  },
  "devDependencies": {
    "@babel/core": "~7.9.0"
  },
  "private": true
}

Я не могу найти ошибку или исправить ее. Я сделал это с другим проектом раньше, и это сработало. Получение информации о шрифте точно такое же. Единственное, о чем я могу думать, может быть, мои пакеты устарели? но я не уверен, какой пакет даже обновить.

Может кто-нибудь помочь?

🤔 А знаете ли вы, что...
JavaScript поддерживает работу с куки и хранилищем веб-браузера для сохранения данных на клиентской стороне.


8
12 114
5

Ответы:

Решено

Из вашего package.json я вижу, что вы находитесь на выставке SDK 40 (последний выпуск на данный момент)

AppLoading был извлечен из пакета expo в SDK 40.

Если вы хотите использовать этот компонент, вы должны запустить expo install expo-app-loading и импортировать AppLoading из его собственного пакета: import AppLoading from 'expo-app-loading';. Это часть постоянных усилий, направленных на то, чтобы сделать выставочный пакет как можно более легким.

Проверьте выставочный блог здесь.

Шаги:
ШАГ 1: expo install expo-app-loading

ШАГ 2:

заменить import { AppLoading } from "expo";

от import AppLoading from 'expo-app-loading';

ШАГ 3: Перезапустите сервер разработки expo (запуск выставки)


вам нужно добавить ключевое слово return перед font.loadAsync


Напоминаю, что на сегодняшний день использование метода startAsync устарело в expo-app-loading, вместо этого вы можете использовать useEffect и запускать свою функцию, как хотите, и обрабатывать там все ошибки,

  useEffect(() => {
      const getAsyncData = async () => {
           // Do my async request
           setIsReady(true); 
      }
      getAsyncData ();
   }, [])

Предполагая, что в вашем коде есть что-то вроде const [isReady, setIsReady] = useState(false);


Моя проблема заключалась в том, что при первой перезагрузке приложения (с выставкой) шрифты не загружались.

После удаления, перезаписи и сохранения fontFamily внутри моей таблицы стилей текст был оформлен с использованием правильного шрифта, так как приложение автоматически обновляется каждый раз, когда вы сохраняете файл. Я просто не мог заставить его работать при первой загрузке.

Я решил проблему, поместив return перед функцией Font.loadAsync():

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

Теперь startAsync AppLoading правильно получает промис, и шрифты загружаются сразу после загрузки приложения, без ошибок.

const [isDataLoaded, setIsDataLoaded] = useState(false);

  if (!isDataLoaded) {
    return (
      <AppLoading
        startAsync = {fetchFonts}
        onFinish = {() => setIsDataLoaded(true)}
        onError = {(err) => console.info(err)}
      />
    );
  }

для меня результат следующих шагов:
ШАГ 1: остановите устройство
ШАГ 2: экспо установка экспо загрузка приложения
ШАГ 3: добавьте следующую строку: import AppLoading from 'expo-app-loading';
ШАГ 4:
если (! isDataLoaded) {
вернуться (
<Загрузка приложения
startAsync = {fetchFonts}
onFinish = {() => setIsDataLoaded(true)}
onError = {(ошибка) => console.info(ошибка)}
/>
);
}