React Native, как заменить URL изображения на ошибку? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть приложение, которое отображает несколько изображений, которые я загружаю из API. Теперь проблема в том, что срок действия некоторых изображений истек, что вызывает проблемы на Android, в Android экран начинает отставать, как только на него загружается просроченное изображение.

Я попытался заменить источник изображения на onError={() => this.imgRefs[img_unique_id].setNativeProps({src: [{uri: this.state.workingUri}]})}, но этот метод не работает. Я не могу использовать локальное состояние, поскольку оно не сохраняет выходные данные в локальном состоянии.

Я попробовал следующий код

  <Image  
      source={image.url} 
      progressiveRenderingEnabled={true}
      ref={item.id} 
      onError={(e) => this.refs[item.id].setNativeProps({source: [{uri: "working image URL"}]})} 
      resizeMethod={"scale"}>
   </Image>      

Приведенный выше код дает мне неопределенную ошибку setNativeProps, и если я не использую onError на Android, он показывает мне ошибку утечки памяти.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Вот полный пример этого.Чтобы иметь собственное состояние для каждого элемента FlatList, я создал класс.

import React, { Component, PureComponent } from 'react';
import { FlatList, Text, View, Image } from 'react-native';

class ItemClass extends PureComponent {
  state = {
    isImageExit: null
  }
  componentWillMount = () => {
    const { task } = this.props;
    Image.getSize(task.url, (width, height) => {
        if(width>0){
            this.setState({ isImageExit: true });
        }
        else{
            this.setState({ isImageExit: false });
        }
    }, () => {
      this.setState({ isImageExit: false });
    });
  }

  render() {
    const { isImageExit } = this.state;
    const { task } = this.props;
    const url = isImageExit ? task.url : 'https://dummyimage.com/600x400/000/fff';
    if (isImageExit === null) {
      return null;
    }
    return (
      <Image
        style={{ height: 200, width: 200 }}
        source={{ uri: url }}
      />
    );
  }
}

export default class App extends Component {
  render() {
    const data = [
      { url: 'url' },
      { url:'https://cdn.pixabay.com/photo/2017/08/05/18/53/mountain-2585069_1280.jpg' },
    ];
    return (
      <View style={{alignItems: 'center', top: 50}}>
          <FlatList
            data={data}
            renderItem={({ item }) => <ItemClass task={item} />}
          />
      </View>
    );
  }
}
0 голосов
/ 17 апреля 2019

Я думаю, что вы должны использовать данные, полученные от Api, и соответственно устанавливать состояние внутри componentWillReceiveProps, потому что я считаю, что установка состояния - лучший способ для достижения этого результата. .

 this.setState = { image: { uri: 'image_uri_from_api' } }

Внутри <Image> добавить -

 <Image style={ your_custom_style }
       source={ this.state.image }
       onError={ this.onError.bind(this) }
 />

Внутри onError добавить это -

onError(error){
   this.setState({ image: require('your_local_image.path')})
 }

Надеюсь, это работает сейчас!

...