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

Flutter侧边栏使用可滚动ListView时报controller绑定多个ScrollPosition错误

问题原因
  • 侧边栏中ListView未指定专属滚动控制器,默认会绑定当前上下文的PrimaryScrollController
  • 侧边栏跳转的目标页面如果也存在未指定控制器的竖直滚动ListView,会复用同一个全局PrimaryScrollController,导致单个控制器同时绑定多个滚动位置,触发报错
解决方案

方案1(推荐,稳定可控)

将Sidebar改为StatefulWidget,内部创建独立的滚动控制器,主动管理生命周期:

// 先将Sidebar改为StatefulWidget
class Sidebar extends StatefulWidget {
  const Sidebar({super.key});

  @override
  State<Sidebar> createState() => _SidebarState();
}

class _SidebarState extends State<Sidebar> {
  // 声明独立的滚动控制器
  late final ScrollController _scrollController;

  @override
  void initState() {
    super.initState();
    _scrollController = ScrollController();
  }

  @override
  void dispose() {
    // 组件销毁时释放控制器避免内存泄漏
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ListView(
      // 绑定独立控制器,关闭全局主控制器绑定
      controller: _scrollController,
      primary: false,
      // 以下原有子组件代码保持不变
      children: <Widget>[
        DrawerHeader(
          decoration: BoxDecoration(
            image: DecorationImage(
                image: AssetImage("assets/images/bgimage.jpg"),
                fit: BoxFit.cover),
            color: Colors.blue,
          ),
          child: Center(
              child: Column(
            children: [
              Text(
                '${store.user['name']}',
                style: TextStyle(color: Colors.white, fontSize: 25),
              ),
              Lottie.asset(
                'assets/lottie/coin.json',
                width: 50,
                height: 50,
              ),
              Text(
                '${store.user['wallet']}',
                style: TextStyle(color: Colors.white, fontSize: 20),
              ),
            ],
          )),
        ),
        ListTile(
          leading: Icon(Icons.home),
          title: Text('Home'),
          onTap: () {
            Navigator.popAndPushNamed(context, '/home');
          },
        ),
        ListTile(
          leading: Icon(Icons.assessment_outlined),
          title: Text('Loss/Profit'),
          onTap: () {
            Navigator.pop(context);
          },
        ),
        ListTile(
          leading: Icon(Icons.calendar_today),
          title: Text('Results'),
          onTap: () {
            Navigator.popAndPushNamed(context, '/result');
          },
        ),
        ListTile(
          leading: Icon(Icons.supervised_user_circle),
          title: Text('Referrals'),
          onTap: () {
            Navigator.pop(context);
          },
        ),
      ],
    );
  }
}

方案2(快速验证)

无需修改组件类型,直接给Sidebar内的ListView添加primary: false属性,告知组件不要复用全局主控制器,Flutter会自动生成临时独立控制器:

ListView(
  primary: false, // 新增该行即可
  children: [...原有子组件],
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:27:03