Swiper возвращает неверный индекс в onIndexChange

Big image in given screenshot is being shown in Swiper and ">" button is 
 being used to move to next Image.

 Thumbnail is being shown in separate FlatList and on click on particular, swiper image also change to shown selected image in thumbnail

Вот код swiper:

 <Swiper style={styles.wrapper} 
          loop= {false}
          onIndexChanged={(index)=>{ 
            console.log('defaul',index)
            console.log('Test_Swiper',this.state.curSelPhotoIndex)
            artWork = this.state.images[index].isArtwork;
            this.setState({curSelPhotoIndex: index, isArtwork : false})
          }}
          showsButtons={this.state.swiperBtn}
        index= {this.state.curSelPhotoIndex}
          showsPagination = {false}
          nextButton = {<Text style={{color: 'rgba(255,255,255,0.7)',fontSize: 200,fontWeight:'100',top:-80}}>›</Text>}
          prevButton = {<Text style={{color: 'rgba(255,255,255,0.7)',fontSize: 200,fontWeight:'100',top:-80}}>‹</Text>}
          loadMinimal = {true}
          loadMinimalSize = {1}
          loadMinimalLoader = { <ActivityIndicator
          animating
          style={{marginTop:250}}
            size='large'
            color='white'
          /> }

          >
          {
              this.state.images.length > 0 ? this.state.images.map((value, index) => {
                imageURL = getLocalURL(this.state.images[index].localIdentifier)
                return (
            <View style={styles.mainView} key={index}>
              {/* resizeMode= enum('cover', 'contain', 'stretch', 'repeat', 'center') */}
              <Image
                source={(imageURL == "")?require('../Images/defaultImg.png'):{ uri: imageURL }}
                style={styles.image}
                resizeMode='cover'
                ></Image> 
                {
                  isCurSelChanging ?
                    <ActivityIndicator
                      animating
                      style={{marginTop:250}}
                      size='large'
                      color='white'
                    />
                  : null
                }
                <View style={styles.flatListTagStyle} >
                <ScrollView 
                horizontal = 'true'
                showsHorizontalScrollIndicator={false}
                >
                <View style={styles.flatListFirstFiveTagWrapStyle} >
                <FlatList
                  style={[styles.flatListFirstFiveTagStyle]}
                  contentContainerStyle={styles.flatListTagContentStyle}
                  data={this.state.dataTag}
                  renderItem={({item, index}) => this.renderItemTagFirstFive(item, index)}
                  keyExtractor={(item, index) => index}
                  extraData={this.state}
                  />
                <FlatList
                  style={[styles.flatListFirstFiveTagStyle]}
                  contentContainerStyle={styles.flatListTagContentStyle}
                  data={this.state.dataTag}
                  renderItem={({item, index}) => this.renderItemTagFirstThree(item, index)}
                  keyExtractor={(item, index) => index}
                  extraData={this.state}
                  />
                </View>
                <FlatList
                  horizontal = 'true'
                  showsHorizontalScrollIndicator={false}
                  style={styles.flatListNextTagStyle}
                  contentContainerStyle={styles.flatListTagContentStyle}
                  data={this.state.dataTag}
                  renderItem={({item, index}) => this.renderItemTagNextToFive(item, index)}
                  keyExtractor={(item, index) => index}
                  extraData={this.state}
                  /> 

                </ ScrollView>
                  </View>



            </View>)
              }) : <View></View>
            }
          </Swiper>

Вот код миниатюры Flatlist:

 <FlatList
                horizontal= 'true' 
                style={styles.wrapper}            
                data={this.state.images}
                renderItem={({item, index}) => this.renderItem(item, index)}
                keyExtractor={(item, index) => index}
                extraData={this.state.curSelPhotoIndex}
                scrollToIndex={this.state.curSelPhotoIndex}
              /> 

вот метод renderItem:

renderItem (item, index) {
    const imageURL =  getLocalURL(item.localIdentifier)
  //console.log('check_index', index)
    return (
      <TouchableOpacity  onPress={() => this.onPressSubImg(index)}>


          <Image
            source={{ uri: imageURL }}
            style={styles.subImage}
            ></Image>
            {
              (this.state.curSelPhotoIndex == index)?
                <Text style={styles.dot}>.</Text>
              : <Text></Text>
            }

      </TouchableOpacity>
    )
  }

Вот метод получения вызова по нажатию на миниатюру:

onPressSubImg (index) {
    console.log('check_sub', index)

    this.setState({isCurSelChanging: true, curSelPhotoIndex: index})
    setTimeout(() => {this.assignCategories(index)}, 100)
  }

Вот я обновляю значение curSelPhotoIndex: индекс, который должен показывать текущее изображение в swiper, используя index= {this.state.curSelPhotoIndex} Он работает нормально, но после выбора изображения, чтобы показать из эскиза, если я изменяю изображение, используя следующую кнопку, я получать вызов

onIndexChanged={(index)=>{ 
            console.log('defaul',index)
            console.log('Test_Swiper',this.state.curSelPhotoIndex)
            artWork = this.state.images[index].isArtwork;
            this.setState({curSelPhotoIndex: index, isArtwork : false})
          }}

Здесь параметр индекса возвращает неверное значение, иногда он возвращает индекс, который превышает длину массива.

0 ответов

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