Как загружать изображения во время загрузки приложения в React Native?

#arrays #reactjs #image #react-native #loading

#массивы #reactjs #изображение #react-native #Загрузка

Вопрос:

Итак, что мне нужно сделать, это загрузить изображения из локальной папки во время загрузки приложения. Итак, я попытался реализовать это таким образом:

         async function _cacheResourcesAsync() {
            return new Promise(async (resolve) => {
                resolve();
                const images = [
                    require("whatever"),
                    require("whatever"),
                    require("whatever"),
                    require("whatever"),
                ]
        
                const cacheImages = images.map(image => {
                    return Asset.fromModule(image).downloadAsync();
                })
            });
        }
    
    const App = () => {     
        const [isLoaded, setIsLoaded] = useState(false);
        
        if (!isLoaded) {
            return (
<AppLoading 
                startAsync={_cacheResourcesAsync}
                onFinish={() => setIsLoaded(true)}
                onError={console.warn}
            />
)
        } else {
            return Whatever
        }
    }
  

Но это не работает, и я не совсем понимаю, как я могу использовать эти изображения позже в своем коде, потому что массив с ними объявляется только в функции _cacheResourcesAsync . Что я делаю не так?

Комментарии:

1. Вы используете React-Native или Expo?

2. @WojtekSzafraniec Expo

Ответ №1:

Expo: вот рабочий официальный пример

 import React from 'react';
import { Image, Text, View } from 'react-native';
import { Asset } from 'expo-asset';
import { AppLoading } from 'expo';

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

  render() {
    if (!this.state.isReady) {
      return (
        <AppLoading
          startAsync={this._cacheResourcesAsync}
          onFinish={() => this.setState({ isReady: true })}
          onError={console.warn}
        />
      ); }

    return (
      <View style={{ flex: 1 }}>
        <Image source={require('./assets/snack-icon.png')} />
      </View>
    );
  }

  async _cacheResourcesAsync() {
    const images = [require('./assets/snack-icon.png')];

    const cacheImages = images.map(image => {
      return Asset.fromModule(image).downloadAsync();
    }); 
    return Promise.all(cacheImages);
  }
}
  

Для React Native я бы предложил использовать надежные решения, такие как

Комментарии:

1. как бы вы реализовали это с помощью expo-splash-screen? Загрузка приложений теперь устарела