修改列表滚动条颜色时出现PrimaryScrollController错误的解决方法
错误原因及无错误实现方案
错误原因
你给ListView.separated设置了primary: false,这会让它放弃使用Flutter默认的PrimaryScrollController;但外层的RawScrollbar默认会尝试关联PrimaryScrollController,两者的控制器不匹配,就触发了这个错误。
解决方法(两种任选其一)
方法一:显式共用同一个ScrollController
给ListView和RawScrollbar绑定同一个自定义控制器,确保滚动条和列表的滚动状态同步:
// 先定义一个ScrollController final ScrollController _scrollController = ScrollController(); // 修改后的组件代码 RawScrollbar( thumbColor: Colors.purple, controller: _scrollController, // 绑定控制器 child: ListView.separated( controller: _scrollController, // 列表也绑定同一个控制器 primary: false, // 保留该设置无影响 padding: EdgeInsets.only(left: 15.0, right: 15.0, top: 10.0), separatorBuilder: (BuildContext context, int index) { return Visibility( visible: true, child: Container( height: height * margin, width: width * .8, )); }, itemCount: _foundEvents.length, itemBuilder: (context, index) => EventCard( width: width * .8, cardPadding: width * .05, height: getCardHeight(height, margin: margin), event: _foundEvents[index]["event"], isLoading: eventsState.eventIdLoading == _foundEvents[index]["event"].id, ), ), )
方法二:让ListView使用PrimaryScrollController
如果不需要自定义控制器,直接删除primary: false(或者改成primary: true,垂直滚动的ListView默认primary为true),这样RawScrollbar就能自动关联PrimaryScrollController:
RawScrollbar( thumbColor: Colors.purple, child: ListView.separated( // 删掉primary: false,或改为primary: true padding: EdgeInsets.only(left: 15.0, right: 15.0, top: 10.0), separatorBuilder: (BuildContext context, int index) { return Visibility( visible: true, child: Container( height: height * margin, width: width * .8, )); }, itemCount: _foundEvents.length, itemBuilder: (context, index) => EventCard( width: width * .8, cardPadding: width * .05, height: getCardHeight(height, margin: margin), event: _foundEvents[index]["event"], isLoading: eventsState.eventIdLoading == _foundEvents[index]["event"].id, ), ), )
内容的提问来源于stack exchange,提问作者Orl13
相关产品推荐
相关产品推荐

