代码之家  ›  专栏  ›  技术社区  ›  Omar Awamry

ScrollController未连接到任何滚动视图

  •  2
  • Omar Awamry  · 技术社区  · 6 年前

    我正在使用CustomScrollView,并为它提供一个控制器。 ScrollController工作时,我甚至添加了一个侦听器,并打印出scroll视图的位置。

    CustomScrollView(
        controller: _scrollController,
    

    _scrollController.jumpTo(50.0);
    

    但是,我得到了错误

    scrollController未连接到任何滚动视图

    1 回复  |  直到 6 年前
        1
  •  60
  •   Ed H    6 年前

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

    if (_scrollController.hasClients) 
        _scrollController.jumpTo(50.0);
    
        2
  •  27
  •   BIS Tech    4 年前

    拖延不是正确的解决办法。最好等到树建好了再使用

    WidgetsBinding.instance
            .addPostFrameCallback((_){});
    

    样品

    WidgetsBinding.instance.addPostFrameCallback((_) {
          if(pageController.hasClients){
                  pageController.animateToPage(page index, duration: Duration(milliseconds: 1), curve: Curves.easeInOut);
          }
    });
    
        3
  •  20
  •   boformer    6 年前

    ScrollController ,使用 initialScrollOffset 属性:

    _scrollController = ScrollController(initialScrollOffset: 50.0);
    
        4
  •  7
  •   Abdullah Khan    5 年前

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

    @override
    void initState(){
      super.initState();
      WidgetsBinding.instance.addPostFrameCallback((_){
        //write or call your logic
        //code will run when widget rendering complete
      });
    }
    
        5
  •  3
  •   Ibn Masood    5 年前

    这个 有时 当您试图将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和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
  •  2
  •   Lucas De Lavra Pinto    5 年前

    首先创建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,
          ),
        ),
      ),
    
        7
  •  0
  •   Erkebulan Duisebay    6 年前

    我找到了有效的解决办法,但坦率地说,我认为这种方法不是最佳做法。 对我来说 控制器.jumpTo() 在附加到任何滚动视图之前调用。为了解决这个问题,我延迟了几毫秒,然后调用了.jumpTo(),因为将调用build,并且控制器将附加到任何滚动视图。

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

    我完全同意这是不好的解决办法,但它可以解决问题。

        8
  •  0
  •   Saya Gamers    5 年前

    使用setState()方法绑定到与滚动相关的小部件(listview等)

    setState(() {
        topicsScrollController.animateTo(....);
    });
    
        9
  •  0
  •   Shariar Saimon    4 年前

    初始化scrollController:

    ScrollController _scrollController = ScrollController(); 
    

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

    SchedulerBinding.instance.addPostFrameCallback((_) {
      _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
    });
    
        10
  •  0
  •   Mimu Saha Tishan    4 年前

    最后通过检查位置解决了我的问题滚动控制器.位置.长度“就像

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

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

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

        11
  •  0
  •   Christopher Moore    4 年前

    我用这个代码使appbar的颜色在0位置透明,在70多个位置为黑色

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