【问题标题】:I'm getting ScrollController attached to multiple scroll views我将 ScrollController 附加到多个滚动视图
【发布时间】:2021-10-19 10:30:46
【问题描述】:

我在其中有一个自定义小部件的综合浏览量,初始化后我在其中传递了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:(...)
               ),);
}
}

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

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

那么为什么即使我只在一个地方使用它也会出现这个错误,任何人都可以帮助我

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    从此代码

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

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

    不要传递_scrollController,而是让InternalWeekViewPage statefullWidgte 并在initState 上创建和初始化。

    它能解决你的问题吗?

    【讨论】:

    • 我的代码有很多变化,所以我正在尝试这个
    • 另外,您可以生成_scrollController 的列表并使用index 传递。
    猜你喜欢
    • 2019-02-09
    • 2021-08-12
    • 2019-02-28
    • 2019-05-18
    • 2019-02-06
    • 2019-07-30
    • 2019-02-17
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多