Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 嵌套滚动条问题:NestedScrollView、SliverAppBar、SliverPersistentHeader、TabBarView和PageView_Flutter_Flutter Sliver - Fatal编程技术网

Flutter 嵌套滚动条问题:NestedScrollView、SliverAppBar、SliverPersistentHeader、TabBarView和PageView

Flutter 嵌套滚动条问题:NestedScrollView、SliverAppBar、SliverPersistentHeader、TabBarView和PageView,flutter,flutter-sliver,Flutter,Flutter Sliver,这个问题困扰了我一段时间,即使我读了无数的网页,我仍然无法解决它。也许你能帮上忙 我得到了以下场景: 颤振应用程序的页面视图只有3页 第一页有一个简单的GridView(垂直滚动),嵌套滚动没有问题 第三个页面是一个简单的ListView,包含项目列表,这里的滚动也没有问题 第二个页面有一个嵌套的滚动视图,它的headerSliverBuilder有两个小部件:滑动条和滑动持久条。这里没什么特别的 NestedScrollView的主体包含一个包含3个选项卡的TabBarView,可以使用水平滑

这个问题困扰了我一段时间,即使我读了无数的网页,我仍然无法解决它。也许你能帮上忙

我得到了以下场景:

颤振应用程序的页面视图只有3页

第一页有一个简单的
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…)。你能发送额外的源代码吗?我更新了一个更完整的例子。我不觉得其他任何事情真的很重要,我认为问题在于应用程序的这一部分…谢谢你的提示,但我已经在使用它了。我更新了问题。