React native 反应自然';s Animated.ScrollView不允许我以编程方式滚动到特定位置

React native 反应自然';s Animated.ScrollView不允许我以编程方式滚动到特定位置,react-native,scrollview,React Native,Scrollview,在升级到React Native和Expo的最新版本之前,此代码块正常工作。它正在使用的版本是“^32.0.0”“expo”: 以前我可以通过编程方式移动Animated.ScrollView的子对象,现在我无法再这样做了。这是我正在测试的测试代码块 import React, { Component } from 'react'; import { StyleSheet, Text, View, Animated, TouchableOpacity, SafeAreaV

在升级到React Native和Expo的最新版本之前,此代码块正常工作。它正在使用的版本是“^32.0.0”“expo”:

以前我可以通过编程方式移动Animated.ScrollView的子对象,现在我无法再这样做了。这是我正在测试的测试代码块

import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  Animated,
  TouchableOpacity,
  SafeAreaView,
  ScrollView
} from 'react-native';

export default class App extends React.Component {
  constructor(props) {
    super(props);
  }
  handleMove = () => {
    this.scroller.getNode().scrollTo({
      x: 200,
      y: 0,
      animated: false
    });
  };
  render() {
    return (
      <SafeAreaView style={styles.container}>
        <Text>Open up App.js to start working on your app!</Text>
        <Animated.ScrollView
          horizontal
          ref={scroller => {
            this.scroller = scroller;
          }}
        >
          <View
            style={{
              height: 100,
              width: 100,
              backgroundColor: 'red',
              margin: 5
            }}
          />
        </Animated.ScrollView>
        <TouchableOpacity onPress={this.handleMove}>
          <Text>Move</Text>
        </TouchableOpacity>
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {}
});
正确的做法是什么

我加了一点点心来说明我的问题 你可以试试这个


从0.57升级到0.60后,我遇到了类似的问题

似乎在安装东西的时间上(在RN版本之间)发生了一些变化。我将在几天后再次检查我的代码,因为我怀疑我正在使用一些即将弃用的生命周期函数。事实上,它们现在被认为是“不安全”的使用可能是由于一些时间问题(胡乱猜测)


我只需将scrollTo设置为100毫秒的超时时间,就可以让代码正常工作。这表明scrollview在第一次尝试时没有完全装入。实际上,我对我的用例的超时很满意,但我还是想解决这个问题,因为我不喜欢黑客解决方案。

我可以通过在scrollView中添加一个道具来解决我的问题。
scrollToOverflowEnabled={true}


现在一切都像以前一样正常了。我希望这对将来的人有所帮助

我可以通过使用一个简单的设置超时1秒来实现这一点

下面是我的代码现在的样子:

setTimeout(() => {
  this.scrollView.scrollTo({
    x: DEVICE_WIDTH * current_index,
    y: 0,
    animated: false
  });
}, 1)

与上面Micheal的建议类似,这可能是由于不推荐使用的组件WillMount in React在ScrollView中未正确更新而导致的装载问题造成的。

我将如何以编程方式执行此操作?您可以在内容中放入所需内容我刚刚尝试了解决方案,但无法使动画正常工作。我将在回家后进行验证。谢谢。这对我来说不起作用,我可以通过它的ref获得ScrollView(所以它肯定是挂载的),但是由于某种原因,scrollTo在升级后不起作用。您是否还注意到了其他可能解决此问题的方法?通过仔细查看您的代码,我注意到您在ref上调用了
getNode()
。我这样做了,它现在正在工作!但这很奇怪,我在文档中找不到它,我通常不必通过
getNode()
就可以访问ref的函数。谢谢你的回答!实际上,它甚至可以在我这边没有
scrollToOverflowEnabled={true}
的情况下工作。使用expo 35。问题是此解决方案仅适用于IOS。。。有针对Android的解决方案吗?您的解决方案是仅针对IOS的应用程序
setTimeout(() => {
  this.scrollView.scrollTo({
    x: DEVICE_WIDTH * current_index,
    y: 0,
    animated: false
  });
}, 1)