颤振错误:'ScrollController 未附加到任何滚动视图。'在滚动

Posted

技术标签:

【中文标题】颤振错误:\'ScrollController 未附加到任何滚动视图。\'在滚动【英文标题】:Flutter error: 'ScrollController not attached to any scroll views.' on scroll颤振错误:'ScrollController 未附加到任何滚动视图。'在滚动 【发布时间】:2020-01-27 18:08:16 【问题描述】:

每当我在列表视图中滚动时,我都会在控制台中收到此错误消息:

ScrollController not attached to any scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 110 pos 12: '_positions.isNotEmpty'

我整天都在努力解决这个问题,我想让其他人看看它。 这段代码还有更多问题,但现在我主要关心的是修复这个错误。

我尝试使用 Listview.builder,检查 hController.hasClients 和更多小东西。他们似乎没有改变任何东西

class MyHome extends StatefulWidget 
  @override
  MyHomeState createState() => new MyHomeState();


class MyHomeState extends State<MyHome> with SingleTickerProviderStateMixin 
  ScrollController hController;
  ScrollController tController;
  ScrollController fController;
  ScrollController bController;

  @override
  void initState() 
    super.initState();
    hController = new ScrollController()..addListener(_scrollListener);
    tController = new ScrollController()..addListener(_scrollListener);
    fController = new ScrollController()..addListener(_scrollListener);
    bController = new ScrollController()..addListener(_scrollListener);
  

  @override
  void dispose() 
    super.dispose();
    hController.removeListener(_scrollListener);
    tController.removeListener(_scrollListener);
    fController.removeListener(_scrollListener);
    bController.removeListener(_scrollListener);
  
  @override
  Widget build(BuildContext context) 
    return new DefaultTabController(
        length: 4,
        child: new Scaffold(
          //Removed AppBar for readability
          body: new TabBarView(
            children: [
              new Container(// hot
                child: ListView(
                    controller: hController,
                    children: <Widget>[
                      Utils.show("hot")
                    ],
                ),
              ),
              new Container( //Trending
                child: ListView(
                  controller: tController,
                  children: <Widget>[
                    Utils.show("trending")
                  ],
                ),
              ),
              new Container( //Fresh
                child: ListView(
                  controller: fController,
                  children: <Widget>[
                    Utils.show("fresh")
                  ],
                ),
              ),
              new Container( //Best
                child: ListView(
                  controller: bController,
                  children: <Widget>[
                    Utils.show("best")
                  ],
                ),
              ),
            ],
          ),
        ));
  
  void _scrollListener() 
    if (hController.position.extentAfter == 0.0) 
      setState(() 
        Utils.show("hot");
      );
    else if (tController.position.extentAfter == 0.0) 
      setState(() 
        Utils.show("trending");
      );
     else if (fController.position.extentAfter == 0.0) 
      setState(() 
        Utils.show("fresh");
      );
     else if (bController.position.extentAfter == 0.0) 
      setState(() 
        Utils.show("best");
      );
    
  


编辑:为了清楚起见,我第一次发布此代码时,我使用了两次 tController。这当然是一个错误,但并没有解决错误。滚动四个列表视图中的每一个时都会发生错误。

【问题讨论】:

您可以编辑您的帖子以添加“scroll_controller.dart”文件吗?错误似乎潜伏在那里。 @Ananth 这是一个默认的flutter文件,错误指的是: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; 【参考方案1】:

检查控制器没有客户端蚂蚁然后延迟跳转:

if (!_scrollController.hasClients) 
      _scrollController.animateTo(_scrollController.position.maxScrollExtent,
        duration: const Duration(milliseconds: 500),
        curve: Curves.easeInOut);
    

【讨论】:

【参考方案2】:

为避免此类错误,请使用 getter

ScrollController.hasClient

如果这是错误的,那么与 [ScrollPosition],如[position]、[offset]、[animateTo]、[jumpTo], 不得调用。

例如:

    if (_controller.hasClients) 
      _controller.animateTo(
      ...
    

【讨论】:

【参考方案3】:

更新你的flutter sdk它将解决这个问题 那是为我工作 在你的 cmd 上运行它 - flutter update

【讨论】:

【参考方案4】:

问题出在_scrollListener内部。

当您在if-else 检查控制器时,现场只有一个视图。意味着只有一个listview 被渲染并且只有一个scrollcontroller 被完全设置。但是在您的代码中,他们正在检查单个函数中所有滚动控制器的位置。这就是您收到此错误的原因。首先检查控制器是否有位置,只有在连接控制器并且视图正确呈现时才会有位置。之后检查extentAfter 值。

Exa -

if (hController.positions.length > 0 && tController.position.extentAfter == 0.0) 

else if (tController.positions.length > 0 && tController.position.extentAfter == 0.0) 

等等

【讨论】:

嗨!感谢您的评论。这实际上是我在调试时犯的一个错误,更改此错误后仍然会发生。 (这确实解决了另一个问题,不幸的是不是错误)我编辑了帖子以匹配我现在使用的代码。 好的,你也面临同样的问题。你能根据错误评论我第110行的代码吗?请检查错误行号是否已更改并告诉我 第110行的代码来自默认的flutter文件'scroll_controller.dart',它指的是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; 第110行是_positions.isNotEmpty 哦,对不起,我没有注意到它不是你自己的颤振小部件。好的,让我看看我能找到什么。 感谢@AakashKumar 你节省了我的时间:)。它对我有用【参考方案5】:

如果您正确粘贴代码 - 似乎可能有错误:

new Container(// hot
  child: ListView(
    controller: tController,
    children: <Widget>[
      Utils.show("hot")
    ],
  ),
),
new Container( //Trending
  child: ListView(
    controller: tController,
    children: <Widget>[
      Utils.show("trending")
    ],
  ),
),

你用过tController两次,没有用过hController

【讨论】:

嗨!感谢您的评论。这实际上是我在调试时犯的一个错误,更改此错误后仍然会发生。 (这确实解决了另一个问题,不幸的是不是错误)。我编辑了我的帖子以匹配我现在使用的代码。

以上是关于颤振错误:'ScrollController 未附加到任何滚动视图。'在滚动的主要内容,如果未能解决你的问题,请参考以下文章

FlutterListView 列表高级功能 ( ScrollController 上拉加载更多 )

Flutter 可滚动组件:ScrollController

ScrollController 未附加到任何滚动视图

附加到多个滚动视图的 ScrollController

如何获得 ScrollController 的全尺寸

ListView的监听