studio scrolling react not inside flatlist aware react-native scrollview react-native-android

react native - scrolling - Reaccionar nativo de Android ScrollView scrollTo no funciona



scrollview inside scrollview react native (3)

Estoy tratando de usar un ScrollView horizontal en React Native para Android, donde la posición inicial está en el medio de las imágenes en desplazamiento en lugar de (0,0).

El método scrollTo parece ser llamado correctamente dentro de componentDidMount pero no se mueve nada en la aplicación, todavía se muestra como el inicio del desplazamiento hacia la izquierda.

Como se trata de Android, no tengo acceso a las propiedades contentOffset o lo establecería directamente, de acuerdo con la documentación. Aquí está el código:

''use strict''; var React = require(''react-native''); var { StyleSheet, View, Text, ScrollView, Component, } = React; var precomputeStyle = require(''precomputeStyle''); class Carousel extends Component { constructor(props, context) { super(props, context); //this.changeContent = this.changeContent.bind(this); } componentDidMount() { this.myScroll.scrollTo(100); console.log("called DidMount"); } render() { return ( <View style={{flex: 1}}> <ScrollView ref={(ref) => this.myScroll = ref} contentContainerStyle={styles.container} horizontal={true} pagingEnabled={true} showsHorizontalScrollIndicator={false} bounces={true} onMomentumScrollEnd={this.onAnimationEnd} > {this.props.children} </ScrollView> </View> ); } onAnimationEnd(e) { console.log("curr offset: " + e.nativeEvent.contentOffset.x); } } var styles = StyleSheet.create({ container: { flex: 1, justifyContent: ''center'', }, page: { alignItems: ''center'', justifyContent: ''center'', borderWidth: 1, }, }); module.exports = Carousel;


Esto funciona en React Native 0.44.0. Gracias por la pista @Eldelshell. También parece funcionar con cualquier valor de tiempo de espera. Al menos en el emulador. Encontré que la respuesta con InteractionManager.runAfterInteractions no solucionó el problema, pero tal vez haya una diferencia en las versiones.

componentDidMount() { setTimeout(() => { this._scroll.scrollTo({y: 100}) }, 1) }


Quería evitar el uso de demoras y temporizadores, por lo que, después de un poco de excavación, descubrí que el uso de onLayout funciona muy bien:

scrollToInitialPosition = () => { this.scrollViewRef.scrollTo({ y: 100 }); } ... <ScrollView ref={(ref) => { this.scrollViewRef = ref; }} onLayout={this.scrollToInitialPosition} />


Tuve el mismo problema, y ​​desperdicié varias horas sin él:

  • 1: en Android, ScrollView puede desplazarse solo cuando su tamaño <tamaño de contenido

  • 2: en reaccionar con Android nativo, si llama a ScrollView.scrollTo () en componentDidMount, no funcionará, porque ScrollView tiene una animación de diseño al crear, puede encontrarlo en ReactScrollView.java

protected void onLayout(boolean changed, int l, int t, int r, int b) { // Call with the present values in order to re-layout if necessary scrollTo(getScrollX(), getScrollY()); }

Por lo tanto, debe retrasarlo después de la animación.

componentDidMount() { InteractionManager.runAfterInteractions(() => { this.myScroll.scrollTo(100); console.log("called DidMount"); }) }