在 setInterval 期间,React Native 可触摸不透明度在平面列表中失败
React Native touchable opacity fails inside a flatlist during setInterval
我有一个 FlatList,其中所有项目都是 TouchableOpacities,它们每个都有一个 onClick 函数,在我添加一个 Slider 之前它工作得很好,它会随着时间的推移从 setInterval 函数自动滑动。这是该应用程序页面的样子(歌曲标题是 TouchableOpacities):
以下是此问题的重要代码部分:
<FlatList
data={queueItems}
renderItem={renderItem}
keyExtractor={item => Math.floor(Math.random() * 1000000).toString()}
/>
const renderItem = ({ item }) => {
return(
<dataContext.Consumer>
{({ setModalVisible }) => (
<TouchableOpacity onPress={() => {setModalVisible(true, item)}} style={styles.QueueContainer}>
<Text style={styles.text}>{item.title}</Text>
</TouchableOpacity>
)}
</dataContext.Consumer>
);
}
<Slider
value={playSeconds} maximumValue={duration}
onSlidingStart={value => onSliderEditStart()}
onSlidingComplete={value => onSliderEditEnd(value)}
maximumTrackTintColor='gray'
minimumTrackTintColor='blue'
thumbTintColor='white'
style={{flex:1, alignSelf:'center'}}
/>
async componentDidMount(){
setInterval(() => { if(this.sound && this.sound.isLoaded() && !this.sliderEditing){
this.sound.getCurrentTime((seconds) => {
this.setState({playSeconds:seconds});
})
}}, 100);
};
this.onSliderEditStart = () => {
this.sliderEditing = true;
console.log('start');
}
this.onSliderEditEnd = (value) => {
if(this.sound){
this.setState({
playSeconds: value,
});
this.sound.setCurrentTime(value);
}
this.sliderEditing = false;
console.log('end');
}
我知道问题与 setInterval 有关,因为当我从代码中取出 setInterval 时 onPress 函数起作用。此外,我尝试将 setInterval 更改为 5 秒,并且 onPress 将在除 5 秒间隔之外的任何时间工作。这个问题也一定与 FlatList 有关,因为 FlatList 之外的 TouchableOpacities 工作得很好。
已解决问题是使用以下方法为平面列表中的每个项目生成密钥:
keyExtractor={item => Math.floor(Math.random() * 1000000).toString()}
出于某种原因,以这种方式生成密钥非常麻烦。
我有一个 FlatList,其中所有项目都是 TouchableOpacities,它们每个都有一个 onClick 函数,在我添加一个 Slider 之前它工作得很好,它会随着时间的推移从 setInterval 函数自动滑动。这是该应用程序页面的样子(歌曲标题是 TouchableOpacities):
以下是此问题的重要代码部分:
<FlatList
data={queueItems}
renderItem={renderItem}
keyExtractor={item => Math.floor(Math.random() * 1000000).toString()}
/>
const renderItem = ({ item }) => {
return(
<dataContext.Consumer>
{({ setModalVisible }) => (
<TouchableOpacity onPress={() => {setModalVisible(true, item)}} style={styles.QueueContainer}>
<Text style={styles.text}>{item.title}</Text>
</TouchableOpacity>
)}
</dataContext.Consumer>
);
}
<Slider
value={playSeconds} maximumValue={duration}
onSlidingStart={value => onSliderEditStart()}
onSlidingComplete={value => onSliderEditEnd(value)}
maximumTrackTintColor='gray'
minimumTrackTintColor='blue'
thumbTintColor='white'
style={{flex:1, alignSelf:'center'}}
/>
async componentDidMount(){
setInterval(() => { if(this.sound && this.sound.isLoaded() && !this.sliderEditing){
this.sound.getCurrentTime((seconds) => {
this.setState({playSeconds:seconds});
})
}}, 100);
};
this.onSliderEditStart = () => {
this.sliderEditing = true;
console.log('start');
}
this.onSliderEditEnd = (value) => {
if(this.sound){
this.setState({
playSeconds: value,
});
this.sound.setCurrentTime(value);
}
this.sliderEditing = false;
console.log('end');
}
我知道问题与 setInterval 有关,因为当我从代码中取出 setInterval 时 onPress 函数起作用。此外,我尝试将 setInterval 更改为 5 秒,并且 onPress 将在除 5 秒间隔之外的任何时间工作。这个问题也一定与 FlatList 有关,因为 FlatList 之外的 TouchableOpacities 工作得很好。
已解决问题是使用以下方法为平面列表中的每个项目生成密钥:
keyExtractor={item => Math.floor(Math.random() * 1000000).toString()}
出于某种原因,以这种方式生成密钥非常麻烦。