自从升级到最新的React-Native版本(0.55.4)后,我遇到了滚动模式列表的问题。在这种情况下,它是一个Flatlist
带有问题的Flatlist位于一个模态中,它位于另一个模式中,在另一个Flatlist中呈现为页脚组件(它是一个添加按钮)。
请帮忙!谢谢
代码:
Flatlist页脚组件(添加按钮):
@observer
class AddButton extends Component {
@observable visible = false;
constructor(props) {
super(props);
this.state = {
mergeName: '',
coin: undefined
};
}
show = () => {
this.visible = true;
};
hide = () => {
this.visible = false;
};
render() {
return (
<View>
<Button
primary
onPress={() => {
this.show();
}}
title={'add'}
style={{
width: '50%',
alignSelf: 'center',
marginVertical: 16
}}
/>
<Modal
visible={this.visible}
animationType='slide'
onRequestClose={this.hide}
>
<Screen>
<View style={{ padding: 5, backgroundColor: '#0003' }}>
<TouchableOpacity
style={{
width: '50%',
height: 40,
paddingHorizontal: 10,
justifyContent: 'center'
}}
onPress={this.hide}
>
<Text style={{ color: '#fff' }}>
{'cancel'}
</Text>
</TouchableOpacity>
</View>
<View>
<Row>
<RowLabel>{'coin'}:</RowLabel>
<Selector
force
ref={'mySelector'}
value={this.coin}
onSelect={coin => {
this.handleSelect();
}}
data={allCoins}
/>
</Row>
<Button
primary
onPress={this.handleSubmit}
title={this.props.i18n.'add'}
style={{
width: '50%',
alignSelf: 'center',
marginVertical: 16
}}
/>
</View>
</Screen>
</Modal>
</View>
);
}
}
export default AddButton;
const contentStyle = {
flex: 1,
backgroundColor: '#0003',
paddingLeft: 10,
borderRadius: 3
};
const Row = ({ style, ...rest }) => (
<View
style={[
{
height: 60,
flexDirection: 'row',
alignItems: 'center',
padding: 10,
marginRight: 10
},
style
]}
{...rest}
/>
);
const RowLabel = props => (
<Text style={{ width: 80, color: '#ccc' }} {...props} />
);
const Input = (props: TextInputProperties) => (
<View style={contentStyle}>
<TextInput
placeholderTextColor='#fff3'
style={{ color: '#ccc', flex: 1, fontSize: 14 }}
{...props}
/>
</View>
);
模态组件(选择器)中有问题的平面列表:
@observer
class Selector extends Component {
@observable value = '';
@observable visible = false;
constructor(props) {
super(props);
if (props.modify) {
this.selectValue();
}
}
selectValue = () => {
this.value = this.props.value;
};
show = () => {
if (this.props.force) this.visible = true;
if (!this.props.coin) return;
this.visible = true;
};
hide = () => {
this.filterText = '';
this.visible = false;
};
handleSelect = item => {
this.value = item;
if (typeof this.props.onSelect === 'function') {
this.props.onSelect(item);
}
this.hide();
};
componentWillReceiveProps(nextProps) {
if (nextProps.value !== this.value) {
this.value = nextProps.value || '';
}
}
renderItem = ({ item }) => {
return (
<TouchableOpacity
onPress={() => this.handleSelect(item)}
style={{
backgroundColor: '#fff',
height: 40,
paddingLeft: 10,
justifyContent: 'center'
}}
>
<Text style={{ fontSize: 14, color: '#333' }}>
{item.toUpperCase()}
</Text>
</TouchableOpacity>
);
};
render() {
let data = this.props.data;
return (
<View style={[ contentStyle, { justifyContent: 'center' } ]}>
<TouchableOpacity
style={{
flex: 1,
flexDirection: 'row',
alignItems: 'center'
}}
onPress={this.show}
>
<Text
numberOfLines={1}
style={{ color: this.value ? '#ccc' : '#fff3' }}
>
{(
this.value ||
this.props.placeholder ||
''
).toUpperCase()}
</Text>
</TouchableOpacity>
<Modal
transparent
animationType='fade'
visible={this.visible}
onRequestClose={this.hide}
>
<View
style={{
flex: 1,
backgroundColor: '#0005',
alignItems: 'center',
paddingTop: 80
}}
>
<View
style={{
width: '80%',
backgroundColor: '#fff',
borderRadius: 5,
maxHeight: '80%',
overflow: 'hidden'
}}
>
<FlatList
data={data}
keyExtractor={i => i}
getItemLayout={(_, index) => {
const height = 40 + HairSpacer.width;
return {
length: height,
offset: height * index,
index
};
}}
ItemSeparatorComponent={HairSpacer}
renderItem={this.renderItem}
/>
</View>
<TouchableOpacity
onPress={this.hide}
style={{ marginTop: 12 }}
>
<Icon
name='ios-close-circle'
size={50}
color='#ccc'
/>
</TouchableOpacity>
</View>
</Modal>
</View>
);
}
}
export default Selector;
const contentStyle = {
flex: 1,
backgroundColor: '#0003',
paddingLeft: 10,
borderRadius: 3
};
答案 0 :(得分:0)
我用ScrollView解决,就像这样:
<ScrollView>
<FlatList
data={this.state.dataSource}
renderItem={({ item, index }) => (
<CountryItem item={item} index={index}/>
)}
horizontal={false}
onEndThreshold={0}
keyExtractor={item => ''.concat(Math.random())}/>
</ScrollView>
或使用ListView。
答案 1 :(得分:0)
确保已在ScrollView中添加了Flatlist,并添加了 keyboardShouldPersistTaps ='always'
<ScrollView style={{ flex: 1 }} keyboardShouldPersistTaps='always'>
<FlatList
.................
/>
</ScrollView>
答案 2 :(得分:0)
只需将 keyboardShouldPersistTaps='always' 添加到 FlatList