ScrollController未附加到任何滚动视图

Oma*_*mry 5 flutter

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

CustomScrollView(
    controller: _scrollController,
Run Code Online (Sandbox Code Playgroud)

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

_scrollController.jumpTo(50.0);
Run Code Online (Sandbox Code Playgroud)

但是,我得到了错误

scrollController未附加到任何滚动视图

car*_*sx2 33

拖延它不是正确的解决方案。最好等到树通过使用完成构建

WidgetsBinding.instance
        .addPostFrameCallback((_){});
Run Code Online (Sandbox Code Playgroud)

样本

WidgetsBinding.instance.addPostFrameCallback((_) {
      if(pageController.hasClients){
              pageController.animateToPage(page index, duration: Duration(milliseconds: 1), curve: Curves.easeInOut);
      }
});
Run Code Online (Sandbox Code Playgroud)


Luc*_*nto 10

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

ScrollController scollBarController = ScrollController();
Run Code Online (Sandbox Code Playgroud)

在我的代码中:

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,
      ),
    ),
  ),
Run Code Online (Sandbox Code Playgroud)


小智 7

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

if (_scrollController.hasClients) 
    _scrollController.jumpTo(50.0);
Run Code Online (Sandbox Code Playgroud)

  • 我的错误是我将控制器附加到 `Scrollbar` 而不是 `SingleChildScrollView` `child: Scrollbar( child: SingleChildScrollView(controller: _scrollController,` )。我想我应该分享以防你们中的任何人可能遇到类似的情况。 (5认同)

Abd*_*han 7

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

@override
void initState(){
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_){
    //write or call your logic
    //code will run when widget rendering complete
  });
}
Run Code Online (Sandbox Code Playgroud)


bof*_*mer 6

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

_scrollController = ScrollController(initialScrollOffset: 50.0);
Run Code Online (Sandbox Code Playgroud)

  • 下面建议更好的解决方案。首先检查它是否通过“if(_scrollController.hasClients)”附加,然后您应该调用“jumpTo”或“animateTo”。在 Android 上,如果您跳过客户端检查,它仍然有效。但在 IOS 上,它会导致问题。 (5认同)

Sha*_*mon 5

初始化滚动控制器:

ScrollController _scrollController = ScrollController(); 
Run Code Online (Sandbox Code Playgroud)

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

SchedulerBinding.instance.addPostFrameCallback((_) {
  _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
});
Run Code Online (Sandbox Code Playgroud)