2016-12-30 4 views
1

J'ai un problème avec Navigator ... J'ai 2 scènes, la scène principale contient un ListView et la deuxième scène contient une liste de sélection qui me permet de filtrer les éléments du ListView de la scène principale ... le problème est que quand je reviens de la deuxième scène, les éléments filtrés de ListView ne sont pas dessinés ... les lignes sont affichées mais elles sont videsréagit le composant parent du navigateur natif n'est pas dessiné après pop

Je sais qu'elles sont affichées parce que J'ai stylisé les lignes avec une couleur différente et la couleur est montrée correctement, dois-je forcer le rendu du composant ListView en quelque sorte? Si oui, comment dois-je le faire?

Voici quelques parties du code (je l'ai enlevé les parties non pertinentes):

class App extends Component { 
    renderScene(route, navigator) { 
    switch (route.id) { 
     case 'Main': 
     return (<Main navigator={navigator} />); 
     case 'FilterByBrand': 
     return (<FilterByBrand navigator={navigator} brands={route.brands} callback={route.callback}/>); 
    } 
    } 

    render() { 
    return (
     <Navigator 
     initialRoute={{id: 'Main'}} 
     renderScene={this.renderScene} 
     /> 
    ); 
    } 
} 

-

class Main extends Component { 
    // code removed (irrelevant) 

    updateBrands(brands) { 
    var filter = {}; 

    // code to generate filter to be used not shown, is working ok 

    this.setState({ brandFilter: filter }); 
    } 

    render() { 
    return (
     <Container> 
     <Header> 
      <Button> 
      <Icon name='md-pricetags' 
       onPress={()=>this.props.navigator.push({ 
       id: 'FilterByBrand', 
       brands: this.state.brands, 
       callback: this.updateBrands} 
      )} 
      /> 
      </Button> 
     </Header> 
     <Content> 
      <ProdList 
      item={this.state.items} 
      brandFilter={this.state.brandFilter} 
      /> 
     </Content> 
     </Container> 
    ); 
    } 
} 

-

class ProdList extends Component { 
    constructor(props) { 
    super(props); 

    this.dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
    this._filter = this._filter.bind(this); 
    this._genRow = this._genRow.bind(this); 
    } 

    _genRow(item) { 
    // code not shown (irrelevant) 
    } 

    _filter() { 
    let output = this.props.items; 

    // filtering code not shown, working ok 
    return output; 
    } 

    render() { 
    var dataSource = this.dataSource.cloneWithRows(this._filter()); 
    return (
     <ListView 
     style={styles.container} 
     dataSource={dataSource} 
     renderRow={this._genRow} 
     enableEmptySections={true} 
     /> 
    ); 
    } 
} 

-

class FilterByBrand extends Component { 

    selectBrand(id) { 
    brands = // save here the selected brands 

    // callback 
    this.props.callback(brands); 

    this.setState({brands: brands}); 
    } 

    render() { 
    return (
     <Container> 
     <Header> 
      <Button transparent onPress={()=>this.props.navigator.pop()}> 
      <Icon name='ios-arrow-back' /> 
      </Button> 
      <Title>Select brand(s)</Title> 
     </Header> 
     <Content> 
      <List 
      dataArray={this.state.brands} 
      renderRow={ (brand) => 
       <ListItem onPress={() => this.selectBrand(brand.id)}> 
       <Text>{brand.name}</Text> 
       </ListItem> 
      } 
      /> 
     </Content> 
     </Container> 
    ); 
    } 
} 
+0

Je pense que peut-être quelque chose à faire avec ne pas définir correctement les paramètres de la fonction '_genRow'. Les paramètres sont '(rowData, sectionID, rowID, highlightRow)' selon le doc indiqué [ici] (https://facebook.github.io/react-native/docs/listview.html#renderrow). –

+0

Où passez-vous la propriété paints au composant ProdList? Ou vous n'avez pas montré ce code? Je vois que brandFilter est passé à ProdList –

+0

codeur hacker: J'ai corrigé le code pour corriger ce problème (j'ai fait une erreur en enlevant des parties du code pour le poster ici, mais la fonction _filter fonctionne plutôt bien) – tvs

Répondre

0

peut-être oublier de rajouter ref.

var navigator; 

class App extends Component { 
    renderScene(route, navigator) { 
    switch (route.id) { 
     case 'Main': 
     return (<Main navigator={navigator} />); 
     case 'FilterByBrand': 
     return (<FilterByBrand navigator={navigator} brands={route.brands} callback={route.callback}/>); 
    } 
    } 

    render() { 
    return (
     <Navigator 
     ref={(nav) => { navigator = nav; }} 
     initialRoute={{id: 'Main'}} 
     renderScene={this.renderScene} 
     /> 
    ); 
    } 
} 
+0

Cela ne fait rien; Je ne pense pas que l'ajout de ref est réellement nécessaire pour faire fonctionner le navigateur. – tvs