Flutter NestedScrollView嵌套滚动异常:标签页内列表childCount为15时无法滚动,设为30可正常滚动
解决NestedScrollView标签页内列表无法滚动的问题
我来帮你拆解下这个奇怪的现象~ 其实问题根源很简单:当列表总高度没有超出当前标签页的可用视口高度时,CustomScrollView会默认不触发滚动行为。
你看,你的SliverFixedExtentList每个item高度是80,15个的话总高度是15*80=1200,如果这个高度刚好小于等于NestedScrollView分配给当前TabBarView的剩余空间(减去SliverAppBar、TabBar和SafeArea的高度),列表就不会滚动;而改成30个时总高度是2400,大概率超过了剩余视口高度,所以滚动就正常了。
解决方案
这里有两种常用的解决思路,你可以根据需求选择:
1. 强制列表始终可滚动
给CustomScrollView添加physics: AlwaysScrollableScrollPhysics()参数,这样即使内容没超出视口,也能触发滚动(比如iOS的回弹效果、Android的边缘光晕):
return CustomScrollView( key: PageStorageKey<String>(name), // 新增这一行参数 physics: AlwaysScrollableScrollPhysics(), slivers: <Widget>[ // ... 原有代码保持不变 ], );
2. 用空白填充剩余视口(可选)
如果希望内容不足时用空白填满剩余空间,让列表的滚动边界更清晰,可以在SliverFixedExtentList后面添加一个SliverFillRemaining:
slivers: <Widget>[ SliverOverlapInjector( handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), ), SliverPadding( padding: const EdgeInsets.all(8.0), sliver: SliverFixedExtentList( // ... 原有代码保持不变 ), ), // 添加这个sliver,自动填满剩余视口空间 SliverFillRemaining(), ],
你可以先试试第一种方法,应该能快速解决你的问题~
内容的提问来源于stack exchange,提问作者Moni
相关产品推荐
相关产品推荐

