ScrollController未附加到任何滚动视图

时间:2018-08-31 11:29:45

标签: flutter

我正在使用CustomScrollView,并为其提供控制器。 ScrollController可以工作,我什至在其中添加了一个侦听器并打印出滚动视图的位置。

CustomScrollView(
    controller: _scrollController,

现在,我要做的就是跳到initState()函数中的50.0位置。

_scrollController.jumpTo(50.0);

但是,我得到了错误

  

scrollController未附加到任何滚动视图

11 个答案:

答案 0 :(得分:4)

延迟它不是正确的解决方案。最好等到使用

完成树的构建
WidgetsBinding.instance
        .addPostFrameCallback((_){});

答案 1 :(得分:3)

@ carlosx2答案是正确的,但是如果有人想知道将WigetsBinding放在哪里。就在这里。

dist

答案 2 :(得分:2)

要设置ScrollController的初始位置,请使用initialScrollOffset属性:

_scrollController = ScrollController(initialScrollOffset: 50.0);

答案 3 :(得分:0)

首先通过使用其hasClients属性检查scrollController是否已附加到滚动视图。

if (_scrollController.hasClients) 
    _scrollController.jumpTo(50.0);

答案 4 :(得分:0)

我找到了可行的解决方案,但是坦率地说,我认为该方法不是最佳实践。 以我为例,在将 controller.jumpTo()附加到任何滚动视图之前,已对其进行了调用。为了解决问题,我延迟了几毫秒,然后调用.jumpTo(),因为将调用build并将控制器附加到任何滚动视图。

Future.delayed(Duration(milliseconds: <some time, ex: 100>), () {
         _scrollController.jumpTo(50.0);
        });

我完全同意这是不好的解决方案,但可以解决问题。

答案 5 :(得分:0)

当您尝试将ScrollController绑定到实际上尚不存在的小部件时,会发生有时。因此,它尝试绑定,但是没有要绑定的ListView / ScrollView。 假设您有以下代码:

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
    Expanded(
      flex: 8,
      child: Container(
        child: ListView.builder(
          controller: scrollController,
          itemCount: messages.length,
          itemBuilder: (context, index) {
            return MessageTile(message: messages[index]);
          }),
        ),
     ),
 ]),

在这里,我们正在动态构建ListView。由于我们之前从未声明过这个ListView,所以scrollController没有任何要绑定的东西。但这很容易解决:

//首先声明ListView和ScrollController

final scrollController = ScrollController(initialScrollOffset: 0);
ListView list = ListView.builder(
  controller: scrollController,
  itemCount: messages.length,
  itemBuilder: (context, index) {
    return MessageTile(message: messages[index]);
  }
);

//然后在构建函数中只需引用已构建的列表

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
    Expanded(
      flex: 8,
      child: Container(
         child: list,
      ),
    ),
  ]),

答案 6 :(得分:0)

使用setState()方法绑定到与滚动相关的小部件(您的列表视图等)

setState(() {
    topicsScrollController.animateTo(....);
});

答案 7 :(得分:0)

我对两个控制器使用相同的ScrollController解决了我的问题。 首先,我创建ScrollController():

ScrollController scollBarController = ScrollController();

在我的代码内:

Container(
    width: MediaQuery.of(context).size.width,
    height: MediaQuery.of(context).size.height,
    child: Scrollbar(
      controller: scollBarController,
      isAlwaysShown: true,
      child: StaggeredGridView.count(
        controller: scollBarController,
        crossAxisCount: 16,
        staggeredTiles: _staggeredTamanho,
        shrinkWrap: true,
        children: [
          ...
        ], //listStaggered,
        mainAxisSpacing: 7.0,
      ),
    ),
  ),

答案 8 :(得分:0)

初始化scrollController:

ScrollController _scrollController = ScrollController(); 

在以下要滚动的位置使用以下代码:

SchedulerBinding.instance.addPostFrameCallback((_) {
  _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
});

答案 9 :(得分:0)

我尝试了上述解决方案,但是设置了ScrollController initialScrollOffset,检查hasClients和jumpTo,WidgetsBinding对我没有作用。

最后通过检查位置'scrollcontroller.positions.length'来解决我的问题

if (_sc.positions.length == 0 || _sc.position.pixels == 0.0) {
    return Container();
}

您必须检查控制器位置以消除错误

参考:https://api.flutter.dev/flutter/widgets/ScrollController/position.html

答案 10 :(得分:0)

我使用此代码使appbar的颜色在0位置透明,而黑色则超过70

backgroundColor: !_scrollController.hasClients
            ? Colors.transparent
            : _scrollController.offset > 70
                ? Color.fromRGBO(7, 7, 7, 1)
                : Colors.transparent,