You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动为滚动容器计算可用高度,安卓需要显式指定滚动组件父容器的可布局高度,滚动组件才能正常判断内容溢出量触发滚动。按以下步骤修改即可修复:

  1. 给包裹FlatList/ScrollView的外层父容器设置flex:1属性,确保父容器占满父节点分配的可用高度。以FlatList版本为例,将外层的<View>修改为<View style={{flex: 1}}>;如果使用ScrollView版本,需要依次排查ScrollView的所有上级父容器,逐层设置flex:1直到根节点的可视容器。
  2. 给ScrollView/FlatList添加nestedScrollEnabled={true}属性,开启安卓端嵌套滚动支持,避免和父容器的滚动逻辑冲突。
  3. 修正keyExtractor配置:当前food数组中没有id字段,keyExtractor返回undefined会导致渲染异常,临时测试可以修改为keyExtractor={(item, index) => index.toString()},正式环境建议给每个food项添加唯一id字段。

内容的提问来源于stack exchange,提问作者Laspeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:15:06