V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yangyifan
V2EX  ›  问与答

请教一个 flutter 里 NestedScrollView body 嵌套滚动的问题

  •  
  •   yangyifan · 2020-03-24 22:14:05 +08:00 · 3408 次点击
    这是一个创建于 1706 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 NestedScrollView 的 body 里放了一个 PageView,在 PageView 里的层级如下 :

    PageView -> SingleChildScrollView -> ListView

    PS : SingleChildScrollView 的作用是用来监听滚动事件从而实现 下拉刷新 /上拉加载 更多。

    这样导致了 body 里的滚动和 NestedScrollView 的 headerSliverBuilder 滚动是分开的。 在网上寻找了很久找到一个相似 问题,但是不是很完美,想问下大家是怎么解决的。 他的解决方案是在子组件里控制父级组件的滚动,代码如下:

        _scrollController = ScrollController();
    
    
        _scrollController.addListener((){
          var innerPos      = _scrollController.position.pixels;
          var maxOuterPos   = widget.parentController.position.maxScrollExtent;
          var currentOutPos = widget.parentController.position.pixels;
    
          if(innerPos >= 0 && currentOutPos < maxOuterPos) {
            widget.parentController.position.jumpTo(innerPos+currentOutPos);
    
          }else{
            var currenParentPos = innerPos + currentOutPos;
            widget.parentController.position.jumpTo(currenParentPos);
          }
        });
        
        widget.parentController.addListener((){
          var currentOutPos = widget.parentController.position.pixels;
          if(currentOutPos <= 0) {
            _scrollController.position.jumpTo(0);
          }
        });
    

    这个解决方案的问题正如回答里所说的 “会导致头部滚动折叠的很快”。

    如果想要模拟,可以尝试 run 一下这份 链接 的代码

    2 条回复    2020-03-25 13:49:29 +08:00
    yimity
        1
    yimity  
       2020-03-25 10:47:56 +08:00   ❤️ 1
    https://github.com/fluttercandies/extended_nested_scroll_view
    不知道这个是否和你的问题相似。
    yangyifan
        2
    yangyifan  
    OP
       2020-03-25 13:49:29 +08:00
    @yimity 是的。

    Do without ScrollController in NestedScrollView's body
    因为无法给 NestedScrollView 的 body 中的列表设置 ScrollController(这样会破坏 NestedScrollView 内部的 InnerScrollController 的行为),所以我这里给大家提供了 Demos 来展示怎么不通过 ScrollController 来完成
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 23:34 · PVG 07:34 · LAX 15:34 · JFK 18:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.