Flutter错误:“ ScrollController未附加到任何滚动视图。”滚动

时间:2019-09-27 11:59:03

标签: android listview flutter dart

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

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。这当然是一个错误,但没有解决错误。在四个列表视图中的每个视图中滚动时都会发生错误。

4 个答案:

答案 0 :(得分:9)

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

ScrollController.hasClient

如果这是错误的,则与 [ScrollPosition],例如[position],[offset],[animateTo]和[jumpTo], 不能被调用。

例如:

    if (_controller.hasClients) {
      _controller.animateTo(
      ...
    }

答案 1 :(得分:0)

如果正确粘贴您的代码-看来可能有误:

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

答案 2 :(得分:0)

问题出在_scrollListener内部。

if-else中检查控制器时,场景中只有一个视图。意味着仅渲染一个listview,并且仅完全设置一个scrollcontroller。但是在您的代码中,他们正在检查单个函数中所有scrollcontroller的位置。那就是为什么您收到此错误。首先检查控制器是否具有位置,只有在连接控制器和正确渲染视图后才具有该位置。之后,检查extentAfter的值。

Exa-

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

&等等

答案 3 :(得分:-1)

更新您的Flutter SDK,即可解决此问题 那对我来说是工作 在您的cmd上运行此命令-flutter update