"FlatList не прокручивается"
Описание проблемы:
Я создал экран, на котором отображается компонент, содержащий FlatList
. По какой-то причине я не могу прокручивать список. Можете ли вы помочь мне обнаружить ошибку и указать направление для решения?
render-функция и стили из моего экранного файла:
render() {
return (
<View style={styles.container}>
<SearchBar />
<ActivityList style={styles.list} data={this.state.data} />
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
overflow: 'hidden',
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'flex-start',
},
list: {
flex: 1,
overflow: 'hidden',
},
});
render-функция и стили из моего компонента списка элементов:
export default class CardItem extends React.PureComponent {
render() {
return (
<View style={styles.cardview}>
<View style={styles.imagecontainer}>
<Image
resizeMode="cover"
style={styles.cardimage}
source={{
uri: this.props.image,
}}
/>
</View>
<View style={styles.cardinfo}>
<Text style={styles.cardtitle}>{this.props.title}</Text>
<View style={styles.cardtext}>
<Text style={styles.textdate}>{this.props.date}</Text>
<Text style={styles.texthour}>{this.props.hour}</Text>
</View>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
cardview: {
flex: 1,
justifyContent: 'flex-start',
backgroundColor: 'white',
elevation: 3,
maxHeight: 200,
width: Dimensions.get('window').width - 20,
margin: 1,
marginTop: 10,
borderRadius: 4,
},
imagecontainer: {
flex: 7,
height: 140,
borderRadius: 4,
},
cardimage: {
flex: 1,
opacity: 0.8,
height: 140,
borderTopLeftRadius: 4,
borderTopRightRadius: 4,
},
cardinfo: {
flex: 2,
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
padding: 10,
},
cardtitle: {
flex: 1,
fontSize: 16,
fontWeight: 'bold',
},
cardtext: {
flex: 1,
justifyContent: 'center',
alignItems: 'flex-end',
},
textdate: {
color: '#5e5e71',
},
texthour: {
color: '#5e5e71',
},
});
render-функция и стили из моего компонента списка:
export default class ActivityList extends React.Component {
_renderCardItem = ({ item }) => (
<CardItem
image={item.image}
title={item.title}
date={item.date}
hour={item.hour}
/>
);
_keyExtractor = item => item.id;
render() {
return (
<FlatList
data={this.props.data}
renderItem={this._renderCardItem}
contentContainerStyle={styles.cardcontainer}
keyExtractor={this._keyExtractor}
/>
);
}
}
const styles = StyleSheet.create({
cardcontainer: {
flex: 1,
overflow: 'hidden',
backgroundColor: 'white',
alignItems: 'center',
width: Dimensions.get('window').width,
borderWidth: 0,
},
});
Мои данные имеют уникальные идентификаторы, заголовки, даты и часы.
Я просмотрел все доступные руководства и документацию, но не нашел решения.
5 ответ(ов)
Уберите flex: 1
из вашего styles.cardcontainer
, это должно решить проблему с прокруткой. Свойство contentContainerStyle
в FlatList/ScrollView оборачивает все дочерние компоненты — это то, что находится внутри FlatList, и у него не должно быть заданной высоты или значения flex. Если вам нужно установить flex: 1
для самого FlatList, используйте style={{flex: 1}}
вместо этого. Удачи!
Вы столкнулись с аналогичной проблемой при использовании FlatList? Попробуйте использовать стили flex: 1
и flexGrow: 1
для вашего компонента FlatList. Вот пример кода:
<View style={styles.list}>
<FlatList style={{ flex: 1, flexGrow: 1 }} />
</View>
Эти стили помогут FlatList правильно занять доступное пространство в родительском представлении. Это решение сработало для меня. Надеюсь, что поможет и вам!
Я тоже сталкивался с этой проблемой, когда добавлял инструмент для работы с изображениями в своем приложении для чата, и нашел обманное решение.
Просто добавив TouchableWithoutFeedback
, который оборачивает каждый элемент в FlatList
, я смог преодолеть эту проблему. Странно, но это работает.
Вот как это выглядит в коде:
_renderCardItem = ({ item }) => (
<TouchableWithoutFeedback onPress={() => {}}>
<CardItem
image={item.image}
title={item.title}
date={item.date}
hour={item.hour}
/>
</TouchableWithoutFeedback>
);
Попробуйте, возможно, это поможет и вам!
Для того чтобы обеспечить прокрутку FlatList, выполните следующие шаги:
<View style={{flex: 1}}>
<FlatList
data={this.state.data}
renderItem={({item}) => this.renderData(item)}
keyExtractor={item => item._id}
contentContainerStyle={{
flexGrow: 1,
}}
/>
</View>
Этот код оборачивает FlatList
в View
с flex: 1
, что позволяет ему занимать всю доступную высоту. Используя contentContainerStyle
с flexGrow: 1
, вы обеспечиваете, что контент внутри FlatList
может растягиваться, позволяя ему прокручиваться, если данных больше, чем помещается на экране.
Для остальных, кто столкнется с этой проблемой: мой FlatList находился внутри TouchableWithoutFeedback. Я заменил его на View, и снова смог прокручивать список.
В чем разница между React Native и React?
Высота, равная динамической ширине (флюидная верстка на CSS)
Несколько файлов JavaScript/CSS: лучшие практики?
"Не используйте Route или withRouter() вне Router при работе с react-router 4 и styled-components в React"
Использование IndexRoute в react-router v4 с React