StackNavigator this.props.navigation cached



我正在使用一个平面列表,在其中我正在做:

let pressed = () => {
      this.props.navigation.navigate('DetailScreen', {item: item});
    }

然后在 DetailScreen 上的 render() 中我正在做: this.props.navigation.getParam('item', null)

所以我在列表中单击的第一项,在 DetailScreen 中显示正确的项目,但是如果我返回并单击任何其他项目,那么 this.props.navigation.getParam('item', null) 总是返回相同的项目。就像第一次选择后它不会更改一样。

列表.js

_renderRow({item}){
    let pressed = () => {
      this.props.navigation.navigate('Details', {item: item});
    }
    let actualRowComponent =
      <View style={css.list.row}>
        <View style={css.list.rowContainer}>
          <Text style={css.list.rowSymbol}>{item.sym}</Text>
          <Text style={css.list.rowTitle}>{item.title}</Text>
        </View>
        <Button title={"$"+item.amount}
          onPress={pressed}
          backgroundColor='#EE7600'
          buttonStyle={{borderRadius: 5}}
          />
      </View>;

    let touchableWrapperIos =
      <TouchableHighlight
        activeOpacity={0.5}
        underlayColor="#fff"
        onPress={pressed}
      >
        {actualRowComponent}
      </TouchableHighlight>;

    let touchableWrapperAndroid =
      <TouchableNativeFeedback
        useForeground={true}
        background={TouchableNativeFeedback.SelectableBackgroundBorderless()}
        onPress={pressed}
      >
        {actualRowComponent}
      </TouchableNativeFeedback>;
    if (require('react-native').Platform.OS === 'ios') {
      return touchableWrapperIos;
    }
    else return touchableWrapperAndroid;
  }
  render(){
    return (
      <View style={css.baseStyles.baseContainer}>
        <View style={{justifyContent: 'center',alignItems: 'center', marginBottom: 40, marginTop: 50}}>
        </View>
        <SectionWidget title="Items" >
          <FlatList
            style={css.baseStyles.flatListContainer}
            data={this.items}
            renderItem={this._renderRow}
            keyExtractor={(item,index) => item.id.toString()}
          />
        </SectionWidget>
      </View>
    );
  }

细节.js

render(){
    const item = this.props.navigation.getParam('item', null);
    console.log(item.title)
    return (
      <View style={css.baseStyles.container}>
        <ScrollView>
          <View style={{marginTop: 40, marginBottom: 60, flex: 1, justifyContent: 'center',alignItems: 'center'}}>
               <Text style={css.baseStyles.priceText}>${item.amount}</Text>
               <Text style={css.baseStyles.subText}> +$0.50 </Text>
          </View>
          <Divider style={{ backgroundColor: '#ccc', marginLeft: 10, marginRight: 10  }} />
          <View style={{marginTop: 60, marginBottom: 30, flex: 1, justifyContent: 'center',alignItems: 'center'}}>
               <Text style={css.baseStyles.titleText}>{item.title}</Text>
               <Text style={css.baseStyles.descriptionText}>{item.summary}</Text>
          </View>
          <Divider style={{ backgroundColor: '#ccc', marginLeft: 10, marginRight: 10 }} />
        </ScrollView>
        <View style={css.baseStyles.footerContainer}>
          <Button title='Buy'
                backgroundColor='#EE7600'
                buttonStyle={{marginTop: 20, marginBottom: 20, borderRadius: 5, width: 150}}
                />
        </View>
      </View>
    );
  }

由于我以前从未使用过 React Navigation,所以我误解了它的用法。事实上,您的问题似乎是逻辑/用法问题,它有一个简单的解决方案。您的目的是拥有多个详细信息屏幕(我的意思只是一个组件,但堆栈中的多个屏幕),而不仅仅是一个具有不同参数的屏幕。这有很大的不同!React Navigation 提供了一种替代navigation.navigate()方法,该方法navigation.push(),它为导航的"历史记录"添加了一个堆栈,似乎正是您正在寻找的。所以,你要做的是更换

this.props.navigation.navigate('Details', {item: item});

this.props.navigation.push('Details', {item: item});

您可以在官方文档中阅读更多(并更好地解释)。

让我知道这是否符合您的问题。

我发现的问题是由于@autobind。如果你@autobind和反应导航一起使用,你会遇到问题。所以我删除了@autobind,一切都按预期工作。

相关内容

  • 没有找到相关文章

最新更新