美文网首页
flutter PageView与TabBarView嵌套滚动的

flutter PageView与TabBarView嵌套滚动的

作者: 溪桥星雨 | 来源:发表于2021-06-08 09:03 被阅读0次

    参考:github项目地址

    我这边是的App的首页是PageView里加了5个页面,其中有一个页面是包含了TabBarView。在滚动的过程中,当TabBarView滚动到最后一页或者第一页面的时候,不能和PageView进行联动。所以查询了很多种方式,觉的上面作者实现的方式很不错。代码量不多。

    1.创建一个PageViewScrollUtils助手类,当监听的需要的时机,进行相应的操作

    import 'package:flutter/gestures.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/rendering.dart';
    
    class PageViewScrollUtils {
      final PageController pageController;
      final TabController tabController;
      PageViewScrollUtils({required this.pageController, required this.tabController});
    
      Drag? _drag;
    
      bool handleNotification(ScrollNotification notification) {
        if (notification is UserScrollNotification) {
          if ((notification.direction == ScrollDirection.reverse && tabController.index == tabController.length - 1) || (notification.direction == ScrollDirection.forward && tabController.index ==  0)) {
            _drag = pageController.position.drag(DragStartDetails(), () {
              _drag = null;
            });
          }
        }
        if (notification is OverscrollNotification) {
          if (notification.dragDetails != null && _drag != null) {
            _drag!.update(notification.dragDetails!);
          }
        }
        if (notification is ScrollEndNotification) {
          if (notification.dragDetails != null && _drag != null) {
            _drag!.end(notification.dragDetails!);
          }
        }
        return true;
      }
    }
    

    2.在TabBarView所在的页面实例化PageViewScrollUtils,实例化的时候需要TabBarView与PageView的controller

    _pageViewScrollUtils = PageViewScrollUtils(pageController: widget.pageController,tabController: _tabController);
    

    3.在TabBarView 外边套一个NotificationListener,监听TabBarView滚动,并使用PageViewScrollUtils进行处理

    NotificationListener<ScrollNotification>(
                        child: TabBarView(
                              physics: ClampingScrollPhysics(),
                              controller: _tabController,
                              children: [
                                LobbyLayout(),
                                LobbyLayout(),
                                LobbyLayout(),
                                LobbyLayout()
                              ]
                          ),
                          onNotification: _pageViewScrollUtils.handleNotification,
                        )
    

    4.这样就可以了。非常简单,代码量也很少。

    点击下方赞赏,给作者一点鼓励!

    相关文章

      网友评论

          本文标题:flutter PageView与TabBarView嵌套滚动的

          本文链接:https://www.haomeiwen.com/subject/qxiqeltx.html