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
相关产品推荐
相关产品推荐

