Flutter 嵌套滚动条问题:NestedScrollView、SliverAppBar、SliverPersistentHeader、TabBarView和PageView
这个问题困扰了我一段时间,即使我读了无数的网页,我仍然无法解决它。也许你能帮上忙 我得到了以下场景: 颤振应用程序的页面视图只有3页 第一页有一个简单的Flutter 嵌套滚动条问题:NestedScrollView、SliverAppBar、SliverPersistentHeader、TabBarView和PageView,flutter,flutter-sliver,Flutter,Flutter Sliver,这个问题困扰了我一段时间,即使我读了无数的网页,我仍然无法解决它。也许你能帮上忙 我得到了以下场景: 颤振应用程序的页面视图只有3页 第一页有一个简单的GridView(垂直滚动),嵌套滚动没有问题 第三个页面是一个简单的ListView,包含项目列表,这里的滚动也没有问题 第二个页面有一个嵌套的滚动视图,它的headerSliverBuilder有两个小部件:滑动条和滑动持久条。这里没什么特别的 NestedScrollView的主体包含一个包含3个选项卡的TabBarView,可以使用水平滑
GridView
(垂直滚动),嵌套滚动没有问题
第三个页面是一个简单的ListView
,包含项目列表,这里的滚动也没有问题
第二个页面有一个嵌套的滚动视图
,它的headerSliverBuilder
有两个小部件:滑动条
和滑动持久条
。这里没什么特别的
NestedScrollView
的主体包含一个包含3个选项卡的TabBarView
,可以使用水平滑动在它们之间滑动——滑动方向与包含此页面的PageView
相同
正文是出现滚动问题的地方
在3个标签之间滑动就像一个符咒。但是,如果当前选项卡是第一个选项卡,并且您尝试进一步向左滑动(手指从左向右移动),则第一页(属于页面视图
)不会显示。相反,如果当前选项卡是第三个,并且您尝试向右滑动(手指的运动是从右向左),则不会发生任何情况
如果对第二页中包含的页眉进行相同的手指运动,页面将变好(第一页或第三页)
这是第二页中的代码,希望知道当选项卡到达边缘时,TabBarView
中的滑动运动为什么没有传播到容器中:
Scaffold(
appBar: _generateAppBar(),
body: DefaultTabController(
length: 3,
child: NestedScrollView(
headerSliverBuilder: (_, __) => [
SliverAppBar(
backgroundColor: backgroundColor,
elevation: 0.0,
expandedHeight: 200.0,
floating: true,
pinned: false,
flexibleSpace: backgroundImageView,
),
SliverPersistentHeader(
floating: false,
delegate: _SliverAppBarDelegate(
TabBar(
labelColor: Theme.of(context).primaryColor,
unselectedLabelColor: Colors.black26,
indicatorWeight: 2.5,
tabs: const [
Text('Tab 1'),
Text('Tab 2'),
Text('Tab 3'),
],
),
),
pinned: true,
),
],
body: TabBarView(
children: [
Center(child: Text('Body 1')),
Center(child: Text('Body 2')),
Center(child: Text('Body 3')),
],
),
),
),
);
辅助类:
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
_SliverAppBarDelegate(this._tabBar);
final TabBar _tabBar;
@override
double get minExtent => _tabBar.preferredSize.height;
@override
double get maxExtent => _tabBar.preferredSize.height;
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) =>
Container(child: _tabBar);
@override
bool shouldRebuild(_SliverAppBarDelegate oldDelegate) =>
false;
}
你知道怎么解决这个问题吗?谢谢 你应该把包裹起来
NestedScrollView
like
DefaultTabController(
length: tabs.length,
child: NestedScrollView())
您的代码似乎不完整(例如,没有TabController…)。你能发送额外的源代码吗?我更新了一个更完整的例子。我不觉得其他任何事情真的很重要,我认为问题在于应用程序的这一部分…谢谢你的提示,但我已经在使用它了。我更新了问题。