Coder Social home page Coder Social logo

Comments (3)

luisfuertes avatar luisfuertes commented on May 19, 2024 2

My solution changing key and with same index

  const [swiperIndex, setSwiperIndex] = useState(initialIndex)
  const [swiperLayout, setSwiperLayout] = useState({ height: 0, width: 0 })

  const onLayout = useCallback(e => {
    setSwiperLayout(e.nativeEvent.layout)
  }, [])

  return (
    <View style={styles.swiperContainer} onLayout={onLayout}>
        <SwiperFlatList
          key={`swipper-${swiperLayout.width}`}
          index={swiperIndex}
          onChangeIndex={({ index }) => setSwiperIndex(index)}
        >
          <View style={{ width: swiperLayout.width }}>
         </View>

from react-native-swiper-flatlist.

expouic avatar expouic commented on May 19, 2024

same issue!

Look my solution. Add listener on device changes and update this values on render.


//Example class
export default class myComponent extends React.Component {
// scroll view reference
swipeRef: SwiperFlatList | null = null;

constructor(props) {
   super(props);
   this.state = {
      currentIndex: 0,
      dim: Dimensions.get('window'),
   }

    // bind component events
    this.onOrientationScreenChange = this.onOrientationScreenChange.bind(this);
  }

  componentDidMount() {
    // listening device dimensions change
    Dimensions.addEventListener('change', this.onOrientationScreenChange);

    //load initial state value
    this.onOrientationScreenChange();
  }
  
  componentWillUnmount() {
    // remove listening device dimensions changes
    Dimensions.removeEventListener('change', this.onOrientationScreenChange);
  }

 /**
   * Set changes on screen orientation changes
   */
  onOrientationScreenChange(): void {
    //Update number of columns for library render
    this.setState({
      dim: Dimensions.get('window'),
    });

    //Move swiper to initial position
    this.swipeRef.scrollToIndex({index: 0, animated: true});
  }

 render() {
    const {dim} = this.state;
    return (
          <SwiperFlatList 
            ref={instance => (this.swipeRef = instance)}
            index={0} 
            showPagination 
            onMomentumScrollEnd={elem => {this.setState({currentIndex: elem.index})}}
            >
                <View style={{width: dim.width , height: dim.height}}>
             <View style={{ backgroundColor: 'tomato', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>1</Text>
          </View>
          <View style={ { backgroundColor: 'thistle', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>2</Text>
          </View>
          <View style={ { backgroundColor: 'skyblue', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>3</Text>
          </View>
          <View style={ { backgroundColor: 'teal', width: dim.width , height: dim.height }}>
            <Text style={styles.text}>4</Text>
          </View>
            </SwiperFlatList>
    );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white'
  },
  text: {
    fontSize: 20,
    textAlign: 'center'
  }
});

from react-native-swiper-flatlist.

freudibili avatar freudibili commented on May 19, 2024

same issue!

Look my solution. Add listener on device changes and update this values on render.


//Example class
export default class myComponent extends React.Component {
// scroll view reference
swipeRef: SwiperFlatList | null = null;

constructor(props) {
   super(props);
   this.state = {
      currentIndex: 0,
      dim: Dimensions.get('window'),
   }

    // bind component events
    this.onOrientationScreenChange = this.onOrientationScreenChange.bind(this);
  }

  componentDidMount() {
    // listening device dimensions change
    Dimensions.addEventListener('change', this.onOrientationScreenChange);

    //load initial state value
    this.onOrientationScreenChange();
  }
  
  componentWillUnmount() {
    // remove listening device dimensions changes
    Dimensions.removeEventListener('change', this.onOrientationScreenChange);
  }

 /**
   * Set changes on screen orientation changes
   */
  onOrientationScreenChange(): void {
    //Update number of columns for library render
    this.setState({
      dim: Dimensions.get('window'),
    });

    //Move swiper to initial position
    this.swipeRef.scrollToIndex({index: 0, animated: true});
  }

 render() {
    const {dim} = this.state;
    return (
          <SwiperFlatList 
            ref={instance => (this.swipeRef = instance)}
            index={0} 
            showPagination 
            onMomentumScrollEnd={elem => {this.setState({currentIndex: elem.index})}}
            >
                <View style={{width: dim.width , height: dim.height}}>
             <View style={{ backgroundColor: 'tomato', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>1</Text>
          </View>
          <View style={ { backgroundColor: 'thistle', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>2</Text>
          </View>
          <View style={ { backgroundColor: 'skyblue', width: dim.width , height: dim.height}}>
            <Text style={styles.text}>3</Text>
          </View>
          <View style={ { backgroundColor: 'teal', width: dim.width , height: dim.height }}>
            <Text style={styles.text}>4</Text>
          </View>
            </SwiperFlatList>
    );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white'
  },
  text: {
    fontSize: 20,
    textAlign: 'center'
  }
});

I added the same workaround and it worked but I didnt tought of moving swiper to initial position. Thank you for the tips.

Another solution is to have a key with the new width to force rerender of your component
<SwiperFlatList key={getResponsiveWidth()} index={0} ref={(ref: any) => { swiperFlatListRef = ref }} showPagination={false} disableGesture={true}>

from react-native-swiper-flatlist.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.