列表项中的 React-Native 开关始终未选中

React-Native Switch in ListItem is alwaays unchecked

我有一个要在 FlatList 中显示的对象列表。列表项还应该有一个切换到 select 或 deselect 的条目。但每次我点击开关时,状态都保持未选中状态。我不知道这是 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>
    );
  }
}

您的代码工作正常,只是缺少 FlatList 组件的 extraData 属性。

查看 documentation:

By passing extraData={this.state} to FlatList we make sure FlatList itself will re-render when the state.selected changes. Without setting this prop, FlatList would not know it needs to re-render any items because it is also a PureComponent and the prop comparison will not show any changes.

在你的情况下,它必须是:

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

这是一个有效的 demo