React Native中ScrollView/FlatList循环渲染时Android端无法滚动问题
问题描述
- 基于Expo开发的应用在安卓设备上ScrollView循环渲染内容时无明确原因无法滚动,iOS端无此问题
- 已尝试设置
flex:1、flexGrow:1属性,问题未解决 - 后续改用FlatList实现相同逻辑,仍然无法滚动
初始ScrollView版本代码(fooditems.js)
import React from "react"; import { View, Text, StyleSheet, ScrollView } from "react-native"; import { Divider, Image } from "react-native-elements"; const foods = [ { title: "chicken", description: "Lorem ipsum dolor sit amet consectetur, recusandae error amet cum doloremque mollitia hic, porro autem qui libero fugit atque.", image: "some image link", price: "$ 10.99", }, { title: "barbecued chicken", description: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eaque quis quam architecto. ", image: "some image link", price: "$ 14.99", }, { title: "barbecued chicken", description: "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Eaque quis quam architecto. ", image: "some image link", price: "$ 14.99", }, ]; export default function MenuItems() { return ( <ScrollView> {foods.map((food, index) => ( <View key={index}> <View style={styles.menuItemStyle}> <FoodInfo food={food} /> <FoodImage food={food} /> </View> <Divider width={0.5} /> </View> ))} </ScrollView> ); } const styles = StyleSheet.create({ menuItemStyle: { flexDirection: "row", justifyContent: "space-between", margin: 20, }, titleStyle: { fontSize: 19, fontWeight: "600", }, });
修改后FlatList版本代码
export default function MenuItems() { const renderItem = ({ item }) => ( <View> <View style={styles.menuItemStyle}> <FoodInfo food={item} /> <FoodImage food={item} /> </View> <Divider width={0.5} orientation="vertical" style={{ marginHorizontal: 20 }} /> </View> ); return ( <View> <FlatList data={foods} renderItem={renderItem} keyExtractor={(item) => item.id} /> </View> ); } const styles = StyleSheet.create({ menuItemStyle: { flexDirection: "row", justifyContent: "space-between", margin: 20, }, titleStyle: { fontSize: 19, fontWeight: "600", }, }); const FoodInfo = (props) => ( <View style={{ width: 240, justifyContent: "space-between" }}> <Text style={styles.titleStyle}>{props.food.title}</Text> <Text>{props.food.description}</Text> <Text>{props.food.price}</Text> </View> ); const FoodImage = (props) => ( <View> <Image source={{ uri: props.food.image }} style={{ width: 100, height: 100, borderRadius: 9 }} /> </View> );
解决方案
该问题是安卓端React Native滚动组件的常见兼容性问题,iOS和安卓的flex布局默认行为存在差异:iOS会自动为滚动容器计算可用高度,安卓需要显式指定滚动组件父容器的可布局高度,滚动组件才能正常判断内容溢出量触发滚动。按以下步骤修改即可修复:
- 给包裹FlatList/ScrollView的外层父容器设置
flex:1属性,确保父容器占满父节点分配的可用高度。以FlatList版本为例,将外层的<View>修改为<View style={{flex: 1}}>;如果使用ScrollView版本,需要依次排查ScrollView的所有上级父容器,逐层设置flex:1直到根节点的可视容器。 - 给ScrollView/FlatList添加
nestedScrollEnabled={true}属性,开启安卓端嵌套滚动支持,避免和父容器的滚动逻辑冲突。 - 修正
keyExtractor配置:当前food数组中没有id字段,keyExtractor返回undefined会导致渲染异常,临时测试可以修改为keyExtractor={(item, index) => index.toString()},正式环境建议给每个food项添加唯一id字段。
内容的提问来源于stack exchange,提问作者Laspeed
相关产品推荐
相关产品推荐

