React Navigation:防止多个实例导航到同一屏幕

时间:2017-03-26 17:52:55

标签: react-native react-navigation

我们说我有这个屏幕:

screenshot

当用户点击白色工具提示时,它会重定向到另一个屏幕。有时应用程序滞后一点,点击工具提示大约需要2秒才能看到屏幕发生变化。问题是,在这2个用户中,用户再次点击此工具提示以实现此目的。

我得到的结果是我的StackNavigator中有两个新屏幕实例。我的意思是我看到了我的新屏幕,但是当我点击"返回"我不会回到这个搭便车地图的地图上。屏幕,但是同一个屏幕的另一个实例。

如果我在这些2s中点击了5次,那么我需要点击5次"返回"返回地图屏幕。有什么办法可以阻止吗?只将一个实例放入StackNavigator?

我正在使用React Navigation,更确切地说是StackNavigator。这是我的代码:

"点击工具提示"部分:

<MapView.Marker
  onCalloutPress={() => this.props.navigation.navigate('spotDetails', { spotId: marker.id })}
/>

我的屏幕:

const HMapNavigator = StackNavigator({
  HMap: { screen: HMapViewContainer },
  spotDetails: { screen: SpotDetailsViewContainer },
});

4 个答案:

答案 0 :(得分:5)

已报告多个导航问题,并且有更多详细信息here

react-navigation(v1.0.0-beta.7)处于测试阶段且仍处于测试阶段,因此在实施此功能之前,您必须手动处理去抖动。

选项

  • 导航开始后禁用按钮
  • 如果您使用redux
  • ,则在onPress逻辑或操作中进行消除

lodash提供了一个有用的去抖效用,如果您正在寻找一个。

答案 1 :(得分:1)

如何克服双重导航有很多方法。

我的解决方案是在导航对象中添加key属性:

this.props.navigation.navigate({ key: 'AnotherScreen', routeName: 'AnotherScreen', params: { ... }})}

答案 2 :(得分:0)

保存以控制导航

  constructor (props) {
    super(props)
    this.state = {
      opening: false
    }
  }

创建一个功能来控制导航

  _open (campaign) {
    if (!this.state.opening) {
      this.props.navigation.navigate('Campaign', {campaign})
      this.setState({ opening: true })
      setTimeout(() => {
        this.setState({ opening: false })
      }, 1000)
    }
  }

从您的onpress调用此函子

<TouchableHighlight underlayColor='transparent' onPress={this._open.bind(this, campaign)}>

答案 3 :(得分:0)

在React Navigation的 1.x 版本中,如果您指定标识符,则导航操作将仅执行一次。例如:

db.session.commit()

更多信息:https://gist.github.com/vonovak/ef72f5efe1d36742de8968ff6a708985

在版本 2.x 3.x 中,这是默认功能。

更多信息:https://reactnavigation.org/docs/en/navigation-key.html