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

