React-Native Switch в ListItem всегда непроверен - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть список объектов, которые я хочу показать в FlatList.Элементы списка также должны иметь переключатель для выбора или отмены выбора записи.Но каждый раз, когда я нажимаю на переключатель, состояние остается неизменным.Я не знаю, является ли это ошибкой компонента ListItem или в моем коде.Событие onValueChange срабатывает правильно, но затем кажется, что FlatList не перерисовывается после изменения состояния или набор данных не обновляется ...

Вот мои классы:

class Person {
  constructor() {
    this._name = '';
    this._selected = false;
  }

  getName() {
    return this._name;
  }

  setName(value) {
    this._name = value;
  }

  isSelected() {
    return this._selected;
  }

  setSelected(value) {
    this._selected = value;
  }
}

class App extends Component {
  constructor(props) {
    super(props);
    let p1 = new Person();
    p1.setName('Superman');
    let p2 = new Person();
    p2.setName('Batman');
    let list = [ p1, p2 ];
    this.state = { persons: list };
  }

  renderItem = ({item, index}) => (
    <ListItem
      title={item.getName()}
      switch={{
        value: item.isSelected(),
        onValueChange: (value) => {
          let list = this.state.persons;
          list[index].setSelected(value);
          this.setState({ persons: list });
        },
      }}
    />
  );

  render() {
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.persons}
          renderItem={this.renderItem}
        />
      </View>
    );
  }
}

1 Ответ

0 голосов
/ 19 апреля 2019

Ваш код работает нормально, отсутствует только свойство extraData компонента FlatList.

Оформление документации :

Передав extraData={this.state} в FlatList, мы убедимся, что FlatList сам будет рендериться при изменении state.selected. Без настройки этот реквизит, FlatList не знал бы, что он должен повторно визуализировать любые элементы потому что это также PureComponent и сравнение опор не будет показать любые изменения.

В вашем случае это должно быть:

<FlatList
     data={this.state.persons}
     renderItem={this.renderItem}
     extraData={this.state}
/>

Вот рабочая демоверсия .

...