我有一个像这样的有状态的小部件
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有不合理的期望吗?
请参阅 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)
你得到的滚动位置_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)
| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |