ScrollController附加到多个滚动视图

Luk*_*tti 6 flutter

我有一个像这样的有状态的小部件

final _scrollController = TrackingScrollController();

PageView(
  controller: _pageController,
  children: <Widget>[
    _ListView(controller: _scrollController),
    _ListView(controller: _scrollController),
    _ListView(controller: _scrollController),
  ],
)
Run Code Online (Sandbox Code Playgroud)

这似乎与此处显示的模式匹配https://docs.flutter.io/flutter/widgets/TrackingScrollController-class.html

但是,当我滚动一个列表时,其他列表未同步,并且每一帧都出现此错误

flutter: Another exception was thrown: ScrollController attached to multiple scroll views.

关于我在做什么错的任何想法吗?我对TrackingScrollController有不合理的期望吗?

Jon*_*nke 6

请参阅 Ashton Thomas 的解释,了解为什么TrackingScrollController不适用于此用例。要实现您所描述的行为,您可以使用 Google 发布的新包:linked_scroll_controller

首先,将此包添加到您的pubspec.yaml

dependencies:
  linked_scroll_controller: ^0.1.2
  // ...
Run Code Online (Sandbox Code Playgroud)

然后将其集成到您的代码中,如下所示:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final _pageController = PageController();

  // This group keeps track of the synchronized scroll offset.
  final _scrollControllerGroup = LinkedScrollControllerGroup();
  ScrollController _scrollController1;
  ScrollController _scrollController2;
  ScrollController _scrollController3;

  @override
  void initState() {
    super.initState();

    // Create separate ScrollControllers as you need them:
    _scrollController1 = _scrollControllerGroup.addAndGet();
    _scrollController2 = _scrollControllerGroup.addAndGet();
    _scrollController3 = _scrollControllerGroup.addAndGet();
  }

  @override
  void dispose() {
    // Don't forget to dispose all of your controllers!
    _pageController.dispose();
    _scrollController1.dispose();
    _scrollController2.dispose();
    _scrollController3.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return PageView(
      controller: _pageController,
      children: <Widget>[
        // Use controllers only once:
        ListView(controller: _scrollController1),
        ListView(controller: _scrollController2),
        ListView(controller: _scrollController3),
      ],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Din*_*ian 1

得到的滚动位置_trackingScrollController吗?如果是这样,您将收到错误。

get postion下面是inside的实现ScrollController,它是TrackingScrollController.

ScrollPosition get position {
  assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
  assert(_positions.length == 1, 'ScrollController attached to multiple scroll views.');
  return _positions.single;
 }
Run Code Online (Sandbox Code Playgroud)