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

Flutter Web:ListView.separated滚动条跳动问题求助(Flutter3.7.6)

Flutter Web 3.7.6中ListView.separated滚动条跳动问题解决

在Flutter 3.7.6版本的Web平台开发中,使用ListView.separated构建列表时,会遇到滚动加载新项时滚动条跳动的问题。相关代码如下:

@override
Widget build(BuildContext context) {
  return ListView.separated(
    padding: const EdgeInsets.only(
      left: 65,
      right: 45,
      top: 150,
      bottom: 65,
    ),
    separatorBuilder: (context, index) {
      return const SizedBox(
        height: 40,
      );
    },
    itemBuilder: (context, i) {
      return Container(
        height: 305,
        color: Colors.red,
      );
    },
    itemCount: 40,
  );
}

滚动过程中每次加载新列表项,滚动条都会出现明显跳动;但改用ListView.builder,并在itemBuilder返回的Container下方添加SizedBox作为分隔后,该问题就不再出现。

问题原因

这是Flutter 3.7.x版本Web端的一个已知渲染逻辑问题:ListView.separated的分隔器是单独计算高度的,滚动加载时列表总高度会出现临时计算偏差,导致滚动条位置异常跳动。而ListView.builder中将分隔器直接整合到每个item里后,每个item的高度是固定的(容器高度+分隔器高度,最后一项除外),列表总高度可以被准确预计算,滚动条也就不会出现跳动。

解决方案

方案一:改用ListView.builder整合分隔器

把分隔器逻辑直接写到item内部,确保每个item的高度固定,示例代码:

@override
Widget build(BuildContext context) {
  return ListView.builder(
    padding: const EdgeInsets.only(
      left: 65,
      right: 45,
      top: 150,
      bottom: 65,
    ),
    itemBuilder: (context, i) {
      return Column(
        children: [
          Container(
            height: 305,
            color: Colors.red,
          ),
          // 最后一个item不需要显示分隔器
          if (i != 39) const SizedBox(height: 40),
        ],
      );
    },
    itemCount: 40,
  );
}

方案二:升级Flutter版本

该滚动条跳动问题在Flutter 3.10及以上版本的Web端渲染优化中已被修复,升级到更高版本即可解决。

内容的提问来源于stack exchange,提问作者anonymous-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:34