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

Flutter中PageController报错:ScrollController绑定多个滚动视图

解决PageController绑定多个Scroll Views的错误

出现ScrollController attached to multiple scroll views错误的核心原因是PageController未被正确销毁,且旧页面的PageView仍与控制器保持绑定,结合你的Riverpod使用场景,按以下步骤修复:

1. 给HomePageState添加dispose方法释放控制器

autoDispose Provider会在实例失效时调用dispose,但你的HomePageState未重写该方法销毁PageController,导致控制器残留并可能被多个PageView绑定:

final homePageProvider = ChangeNotifierProvider.autoDispose((ref) => HomePageState());

class HomePageState extends ChangeNotifier {
  int _selectedIndex = 0;
  late PageController _pageController;

  HomePageState() {
    _pageController = PageController();
  }

  int get selectedIndex => _selectedIndex;
  PageController get pageController => _pageController;

  void changeVisibility(int index) {
    pageController.animateToPage(index,
        duration: const Duration(milliseconds: 200), curve: Curves.easeInOut);
    _selectedIndex = index;
    notifyListeners();
  }

  // 重写dispose,销毁PageController
  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }
}

2. 修改退出登录的导航逻辑,移除旧页面

你当前使用pushNamed跳转登录页,旧的主页仍留在导航栈中,其PageView会继续绑定控制器。改用pushReplacementNamed替换当前页面,确保旧主页被销毁:

menuButton(
  onTap: () {
    LoginController().logout();
    ref.invalidate(homePageProvider);
    // 替换当前页面,旧主页被移除出栈
    Navigator.pushReplacementNamed(context, LoginNew.routeName);
  },
  icon: const Icon(Icons.logout),
  title: AppLocalizationUtil.of(context)!.log_out
),

3. 验证PageView的控制器绑定

确保PageView正确使用Provider中的控制器,避免手动复用旧控制器实例:

// 主页Scaffold的body部分
PageView(
  controller: ref.watch(homePageProvider).pageController,
  children: [/* 你的页面内容 */],
)

这样处理后,退出登录时旧主页会被销毁,控制器也会被释放;再次登录进入主页时,会创建全新的Provider实例和PageController,不会出现多个PageView绑定同一控制器的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:23:29