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

Flutter页面滚动报错:PrimaryScrollController绑定多个滚动组件

分类餐单页面滚动报错修复:PrimaryScrollController 绑定冲突

问题场景

开发的分类餐单页面滚动时触发错误:

The PrimaryScrollController is currently attached to more than one Scrollable widget.

页面采用外层ScrollablePositionedList嵌套内层ListView的结构,每个分类下对应一个商品列表。

核心原因

Flutter的PrimaryScrollController会自动绑定到页面中的滚动组件,当页面存在多个滚动组件(外层ScrollablePositionedList + 多个内层ListView)时,它们会争抢同一个全局控制器,导致冲突报错。

修复方案

1. 禁用内层ListView的PrimaryScrollController绑定

在内层ListView中添加primary: false,明确告知Flutter该组件不使用全局的PrimaryScrollController,避免冲突。

2. 优化滚动逻辑(可选)

如果希望整个页面仅由外层统一滚动,无需内层列表独立滚动,可以给内层ListView设置physics: const NeverScrollableScrollPhysics(),让它仅负责布局,不响应滚动事件。

修改后的核心代码

CupertinoScrollbar _buildBody() {
    return CupertinoScrollbar(
      child: ScrollablePositionedList.builder(
        physics: const BouncingScrollPhysics(),
        itemScrollController: _itemScrollController,
        itemPositionsListener: _itemPositionsListener,
        padding: EdgeInsets.zero,
        itemCount: Dummy.categories.length,
        itemBuilder: (context, index) {
          return Column(
            children: [
              CustomTextWidget(
                paddingTop: 16,
                paddingLeft: 16,
                paddingBottom: 16,
                alignment: Alignment.centerLeft,
                text: Text(
                  Dummy.categories.elementAt(index),
                  style: AppConstants.textStyle(
                      fontWeight: FontWeight.bold, fontSize: 28),
                ),
              ),
              ListView(
                shrinkWrap: true,
                primary: false, // 关键修复:禁用全局PrimaryScrollController绑定
                physics: const NeverScrollableScrollPhysics(), // 可选:让内层列表不独立滚动
                children: [
                  GestureDetector(
                      onTap: () {
                        setState(
                          () {
                            isExpanded = !isExpanded;
                          },
                        );
                      },
                      child:
                          isExpanded ? const ExpandedProductCard() : const ProductCard()),
                  const ProductCard(),
                  const ProductCard(),
                  const ProductCard(),
                  const ProductCard(),
                ],
              ),
              Container()
            ],
          );
        },
      ),
    );
  }

补充说明

  • primary: false:必须添加,这是解决控制器冲突的核心,确保每个滚动组件使用独立的控制器或不绑定全局控制器。
  • NeverScrollableScrollPhysics():根据产品需求选择,如果需要内层列表可单独滚动,可保留原BouncingScrollPhysics(),但primary: false不能省略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:33:21