我正在将滚动控制器附加到多个滚动视图



我有一个页面视图里面的一个自定义小部件,我在初始化后传递的scrollController。还有一些函数可以从那个小部件操作scrollController但是每当它到达运行操作部分时它就会给我这个错误。

Unhandled Exception: 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 109 pos 12: '_positions.length == 1': ScrollController attached to multiple scroll views.

class WeekView<T> extends StatefulWidget {
@override
WeekViewState<T> createState() => WeekViewState<T>();
}
class WeekViewState<T> extends State<WeekView<T>> {
late ScrollController _scrollController;
late PageController _pageController;
@override
void initState() {
super.initState();
_pageController = PageController(initialPage: _currentIndex);
_scrollController = ScrollController();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (widget.enableScrollToEvent) {
if (widget.scrollToEvent == ScrollToEvent.currentTime &&
_controller.events.last.endTime != null) {
_controller.addListener(() {
scrollToCurrentTime(_controller.events.last.endTime!);
});
} else {
_controller.addListener(scrollToEvent);
}
}
}
@override
Widget build(BuildContext context) {
return PageView.builder(
itemCount: _totalWeeks,
controller: _pageController,
onPageChanged: _onPageChange,
itemBuilder: (_, index) {                      return InternalWeekViewPage<T>(
scrollController: _scrollController,
);
},
),
}

功能,

void scrollToEvent() {
if (_pageController.hasClients) {
_pageController
.animateToPage(
_pageController.initialPage +
((_controller.events.last.date.getDayDifference(DateTime.now())) /
7)
.floor(),
curve: widget.pageTransitionCurve,
duration: widget.pageTransitionDuration,
)
.then((value) {
if (_scrollController.hasClients) {//<<<<<<<<<<< scrollController 
if (_controller.events.last.endTime != null) { 
_scrollController.animateTo(
math.max(
_controller.events.last.endTime!.hour * _hourHeight -
_scrollController.position.viewportDimension +
_hourHeight,
0),
duration: widget.scrollTransitionDuration,
curve: widget.scrollToEventCurve,
);
}
}
});
}
}

定制小部件,

class InternalWeekViewPage<T> extends StatelessWidget {
const InternalWeekViewPage({
required this.scrollController,
});
@override
Widget build(BuildContext context) {
return  Expanded(
child: SingleChildScrollView(
controller: scrollController,
child:(...)
),);
}
}

注意:我已经删除了一些不必要的部分,以提高可读性

当我手动滚动,然后我做操作,它不会给我任何错误,但直接做给我错误。

那么为什么我得到这个错误,即使我只在一个地方使用它谁能帮助我

从这个代码

itemBuilder: (_, index) {      
return InternalWeekViewPage<T>(
scrollController: _scrollController,
);

项目生成器返回InternalWeekViewPage和具有相同_scrollController的列表。

代替传递_scrollController,使InternalWeekViewPagestatefullWidgte,并在initState上创建和初始化。

它能解决你的问题吗?