【问题标题】:Make PageView page scroll when child ListView reaches scroll limit - nested scroll?当子 ListView 达到滚动限制时使 PageView 页面滚动 - 嵌套滚动?
【发布时间】:2019-03-04 16:29:05
【问题描述】:

嵌套滚动?

PageView 中有三个垂直页面,我希望能够在它们之间翻转。 这些页面由可滚动的ListViews 组成。

当页面处于焦点时,显示的列表应该是垂直可滚动的,但是当列表滚动到任一端时,我希望 pageView 滚动接管滚动行为并处理页面翻转到下一页(如网页带有可滚动元素)。

下面的滚动列表示例。 如果列表滚动被禁用,则页面翻转工作。 我怎样才能使两者都工作?

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VerticalPageView(),
    );
  }
}

class VerticalPageView extends StatelessWidget {
  VerticalPageView({Key key}) : super(key: key);

  final PageController pageController = PageController();
  final ScrollController scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: PageView(
          controller: pageController,
          pageSnapping: true,
          scrollDirection: Axis.vertical,
          children: <Widget>[
            Container(
              color: Colors.pinkAccent,
              child: ListView.builder(
                controller: scrollController,
                itemCount: 100,
                physics: ClampingScrollPhysics(),
                itemBuilder: (context, index) {
                  return Text('page 0 item $index');
                },
              ),
            ),
            Container(
              color: Colors.lightBlue,
              child: ListView.builder(
                controller: scrollController,
                itemCount: 100,
                physics: ClampingScrollPhysics(),
                itemBuilder: (context, index) {
                  return Text('page 1 item $index');
                },
              ),
            ),
            Container(
              color: Colors.lightGreen,
              child: ListView.builder(
                controller: scrollController,
                itemCount: 100,
                physics: ClampingScrollPhysics(),
                itemBuilder: (context, index) {
                  return Text('page 2 item $index');
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

标签: dart flutter


【解决方案1】:

我认为你想要达到的目标并非不可能,但需要大量的学习和关心。

我一直在尝试使用几个NotificationListener&lt;ScrollNotification&gt; 来根据滚动的位置调整反应,但没有得到任何结果。

查看 Gallery 应用程序中的动画示例 home.dart 文件。在这方面充满了洞察力。

这种方法的问题基本上就是你所说的。当您在到达列表末尾时以编程方式禁用滚动以启用页面滚动时,您可以切换到另一个页面但不能再向另一个方向滚动列表。

所以,要么滚动列表,要么滚动页面,但不能同时滚动。

也许您可以在所有内容上方添加GestureDetector(),并检查每次拖动更新您的情况是什么,以相应地配置不同的滚动条。

无论如何,如果对您有帮助,我在这里让您使用CustomScrollViewSliverList 的替代解决方案。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VerticalPageView(),
    );
  }
}

class VerticalPageView extends StatelessWidget {
  final ScrollController _scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        controller: _scrollController,
        slivers: <Widget>[
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return Container(
                  color: Colors.pinkAccent,
                  child: Text('page 0 item $index'),
                );
              },
              childCount: 100,
            ),
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return Container(
                  color: Colors.lightBlue,
                  child: Text('page 1 item $index'),
                );
              },
              childCount: 100,
            ),
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                return Container(
                  color: Colors.lightGreen,
                  child: Text('page 2 item $index'),
                );
              },
              childCount: 100,
            ),
          ),
        ],
      ),
    );
  }
}

【讨论】:

  • 伟大的指针。在建议的 home.dart 文件中找到了一些有用的信息。如果我找到解决方案会更新。
猜你喜欢
  • 1970-01-01
  • 2019-11-26
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多