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

Flutter中含ListView的Body无法滚动问题求助

问题分析与解决方案

你的ListView无法滚动主要有以下几个原因,对应修改方案如下:

1. 核心问题:ListView被Center约束,没有足够滚动空间

你的ListView.builder被嵌套在Center组件里,Center会让子组件仅占用自身内容所需的最小空间,导致ListView没有足够的垂直高度来触发滚动行为。直接移除外层的Center,让FutureBuilder作为body的直接子组件即可。

2. FutureBuilder的Future重复执行,数据重复添加

每次页面build时,getChapterDocIDs()都会被重新调用,导致chapterDocIDs不断重复添加文档ID,同时没有通过setState触发UI更新(虽然FutureBuilder会因Future变化刷新,但这是错误的实现方式)。

把getChapterDocIDs()的调用移到initState中,仅在页面初始化时执行一次,并且在获取数据后调用setState更新列表,同时每次获取前清空chapterDocIDs避免重复数据。

3. 错误设置了禁用滚动的Physics

你之前尝试的physics: NeverScrollableScrollPhysics()是用来禁用滚动的,这完全和你的需求相反,直接去掉这个配置即可。


修改后的完整代码

SampleChapter 组件

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:shmc_memberapp/models/data/get_chapters.dart';

class SampleChapter extends StatefulWidget {
  const SampleChapter({super.key});

  @override
  State<SampleChapter> createState() => _SampleChapterState();
}

class _SampleChapterState extends State<SampleChapter> {
  List<String> chapterDocIDs = [];

  @override
  void initState() {
    super.initState();
    // 页面初始化时仅调用一次获取数据
    getChapterDocIDs();
  }

  Future getChapterDocIDs() async {
    // 先清空列表,避免重复添加
    chapterDocIDs.clear();
    final chapterSnapshot = await FirebaseFirestore.instance
        .collection('shmc_chapters')
        .orderBy('orderID', descending: false)
        .get();
    
    for (var chapterDoc in chapterSnapshot.docs) {
      print(chapterDoc.reference);
      chapterDocIDs.add(chapterDoc.reference.id);
    }
    // 调用setState触发UI更新
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: const Text("SHMC Chapters"),
          backgroundColor: const Color.fromARGB(255, 43, 55, 138),
          foregroundColor: Colors.white),
      body: FutureBuilder(
        // 使用固定的Future,避免每次build重新执行
        future: Future.value(chapterDocIDs),
        builder: (context, snapshot) {
          // 数据未加载完成时显示加载状态
          if (chapterDocIDs.isEmpty) {
            return const Center(child: CircularProgressIndicator());
          }
          return ListView.builder(
            // 可选:如果列表项高度固定,设置itemExtent可提升性能
            // itemExtent: 56,
            itemCount: chapterDocIDs.length,
            itemBuilder: (context, index) {
              return Padding(
                padding: const EdgeInsets.all(4.0),
                child: ListTile(
                  title: GetChapterData(documentID: chapterDocIDs[index]),
                  tileColor: Colors.white,
                  onTap: () {},
                ),
              );
            },
          );
        },
      ),
    );
  }
}

GetChapterData 组件(无需修改,可保留原代码)

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class GetChapterData extends StatelessWidget {
  final String documentID;

  const GetChapterData({super.key, required this.documentID});

  @override
  Widget build(BuildContext context) {
    CollectionReference chapters =
        FirebaseFirestore.instance.collection('shmc_chapters');

    return FutureBuilder<DocumentSnapshot>(
      future: chapters.doc(documentID).get(),
      builder: ((context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasData && snapshot.data!.exists) {
            Map<String, dynamic> data =
                snapshot.data!.data() as Map<String, dynamic>;
            return Text('${data['chapterName']} - ${data['chapterCity']}, ${data['chapterState']}');
          }
          return const Text('数据不存在');
        }
        return const Text('Loading...');
      }),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:17:04