美文网首页
【flutter填坑】TabBar与PageView

【flutter填坑】TabBar与PageView

作者: 咸鱼本鱼丶 | 来源:发表于2022-02-18 15:34 被阅读0次

    1.TabBar+TabBarView的TabController添加addListener后,回调较慢问题

    此问题的具体表现为:在给TabController通过addListener添加回调后,当滑动TabBarView切换页面时候,页面已经切换过去,但addListener中回调较慢。

    但是观察后发现,当用手直接点击TabBar进行切换时候,速度很快,但此时addListener回调了2次。

    解决方法:

    目前只找到一个思路,用PageView替换TabBarView。替换工作量并不大。同时可以解决切换时候回调慢和回调2次的问题。
    替换后需要对页面切换添加处理,使PageView和TabBar同步切换。

    PageView(
          controller: _pageController,
          children: _getContentList(),
          onPageChanged: (index) {
          //要在此处对tabController进行操作
            _tabController?.animateTo(index);
          },
        );
    
    TabBar(
          controller: _tabController,
          tabs: getTabList(),
          onTap: (index) {
          //在TabBar的onTap中对PageView进行切换
            pageController?.jumpToPage(index);
          },
        );
    

    注意,在TabBar的onTap中使用PageController进行切换页面时候,尽量避免使用animate相关方法,可能会造成两个问题:
    (1)点击切换页面时候,比如从3切换到0,那么TabController的index值会多次触发,即从3->2->1->0,而不是从3直接变为0,如果使用了此index进行一些判断,可能会造成问题。
    (2)TabBar抖动

    2.PageView只加载一个页面问题

    PageView默认只会加载当前一个页面,但有时候可能有一些UI需求,希望在滑动页面之前加载一个占位图之类,此时如果等滑动切换页面再加载可能会有很小的一个延迟,看到背景色,视觉体验上差一些,所以会希望PageView能提前加载下一页。

    有一种投机取巧的解决方案是,修改PageController的viewportFraction,设置为0.9999之类。

    _pageController = PageController(viewportFraction: 0.9999);
    

    相当于让旁边的页面加载0.0001,这样旁边的页面会提前进行加载。

    3.PageView监听页面切换百分比

    大部分情况下,onPageChanged可能够用。但有时候,我们可能想要监听页面滑动的百分比,以此来做一些跟手势相关的处理。

    PageView(
          ……省略
          onPageChanged: (index) {
            //此处无法监听到百分比
          },
        );
    

    可以对PageController addListener,并进行处理。

    pageController?.addListener(() {
          //滑动开始的页面。truncate是对double值进行取整。PageController的page值会从当前页面按百分比进行增加,最后变为下一页的index值。
          int startPage = pageController!.page!.truncate();
    
          //delta值就是当前滑动的的百分比。为0-1的小数。它的正负表示方向。
          double delta = pageController!.page! - startPage;
    
          //默认情况下,当滑到第一页或最后一页再进行同方向滑动,会使outOfRange为true,否则为false。和physics设置有一定关系。
          bool outOfRange = pageController!.position.outOfRange;
          //滑动到第一页或最后一页,atEdge为true
          bool atEdge = pageController!.position.atEdge;
        });
    

    可以通过以上值对滑动页面的百分比进行判断。

    相关文章

      网友评论

          本文标题:【flutter填坑】TabBar与PageView

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