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

Flutter页面无法完全滚动问题求助

Flutter滚动问题:SingleChildScrollView无法滚到底的解决办法

你的问题核心是滚动组件嵌套+固定高度限制导致的:

  • 外层SingleChildScrollView嵌套了固定高度为deviceHeight的SizedBox,把内容死死限制在设备可视高度内,超出部分直接被截断,自然无法滚动
  • 内部又嵌套了ListView.builder,两个滚动组件叠加引发滚动冲突,而且ListView的父容器也设了固定高度,导致shrinkWrap: true的作用完全失效

解决步骤:

  1. 移除外层的SingleChildScrollView和固定高度的SizedBox——ListView本身具备滚动能力,不需要额外嵌套滚动组件
  2. 让ListView直接占据AppBar下方的剩余空间,不需要给父容器设置固定高度
  3. 把原来的BouncingScrollPhysics直接设置给ListView,保持滚动效果

修改后的完整代码:

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

  @override
  State<LigoLog> createState() => _LigoLogState();
}

class _LigoLogState extends State<LigoLog> {
  final _box = Hive.box('ligo');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        toolbarHeight: 60.0,
        iconTheme: const IconThemeData(
          color: Colors.white,
        ),
        title: Text(
          'appbarTitle'.tr,
          style: const TextStyle(
            fontFamily: 'Lalezar',
            fontSize: 20.0,
            fontWeight: FontWeight.bold,
            color: Colors.white,
          ),
        ),
        backgroundColor: const Color(0xffF85E63),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            Hive.box('ligo').clear();
          });
        },
        backgroundColor: const Color(0xffF85E63).withOpacity(0.5),
        child: const Icon(
          Icons.delete_rounded,
          color: Colors.white,
          size: 25.0,
        ),
      ),
      resizeToAvoidBottomInset: false,
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 16.0),
        child: ListView.builder(
          physics: const BouncingScrollPhysics(),
          itemCount: _box.length,
          itemBuilder: (context, index) {
            Log log = _box.getAt(index);
            return Padding(
              padding: const EdgeInsets.only(top: 10.0),
              child: Container(
                height: 210.0,
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                  border: Border.all(
                    width: 1.5,
                    color: const Color(0xffF85E63),
                  ),
                ),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'responsibleAdminLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.responsibleAdmin,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'transactionDate'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.date,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'userLogLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            '@${log.user}',
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'userAmountLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.amount,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'userCostInDollarsLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.costInDollars,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'userCostInTomansLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.costInTomans,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            'userStatusLabel'.tr,
                            style: const TextStyle(
                              color: Color(0xffF85E63),
                              fontSize: 18.5,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                          const SizedBox(width: 8.0),
                          Text(
                            log.status,
                            style: TextStyle(
                              color: LigoStatus.statusColor,
                              fontSize: 18.0,
                              fontFamily: 'Lalezar',
                              fontWeight: FontWeight.normal,
                            ),
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

额外说明:

  • 用Padding替代原来固定宽度的SizedBox,更灵活适配不同屏幕尺寸
  • 如果页面确实需要混合滚动与非滚动内容,必须去掉所有固定高度限制,给ListView设置shrinkWrap: true和physics: NeverScrollableScrollPhysics()避免冲突,但这种场景下直接用ListView或CustomScrollView会更高效

内容的提问来源于stack exchange,提问作者Shervin.bdn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:32:33