Flutter--通过TabController实现TabBar

一、介绍

之前通过DefaultTabController组件实现了AppBar里面的顶部导航切换,但是实际项目中,有网络请求,上拉加载下拉刷新等操作DefaultTabController就不方便操作,因此提供了TabController实现TabBar。

二、TabController常用属性介绍

属性 说明
index 当前索引值
previousIndex 之前索引值
length tab的数量
indexIsChanging 是否在切换tab
点击条目切换tab为true
滑动切换tab为false
animation value表示TabBar的tab当前位置以及TabBar 和TabBarView的scrollOffsets

三、TabController常用方法介绍

方法 说明
addListener 添加监听
dispose 销毁
notifyListeners 激活所有监听
removeListener 清除监听

四、TabController实现TabBar的步骤(完整实现见demo)

1、TabController组件必须是在一个继承StatefulWidget的动态组件中

1111.png

2、必须实现SingleTickerProviderStateMixin

22222.png

3、组件初始化的时候,实例化TabController,实例化的时候,传两个参数,length:tab的个数,vsync:this(固定写法)

33333.png

4、在TabBar组件和TabBarView组件中的controller指定,实例化的TabController

4444.png

55555.png

五、TabController添加addListener,点击tab回调两次的解决方法(见demo)

1、点击tab回调一次,滑动切换tab不会回调

      if(_tabController.indexIsChanging){
          print("ysl--${_tabController.index}");
      }

2、 //点击tab时或滑动tab回调一次

      if(_tabController.index.toDouble() == _tabController.animation.value){
            print("ysl${_tabController.index}");
      }

六、TabController的demo

import 'package:flutter/material.dart';

void main() {
  runApp(TabControllerStu());
}


class TabControllerStu extends StatefulWidget {
  TabControllerStu({Key key}) : super(key: key);

  _TabControllerStuState createState() => _TabControllerStuState();
}

class _TabControllerStuState extends State<TabControllerStu> with SingleTickerProviderStateMixin{
  TabController _tabController;


  //销毁时调用
  @override
  void dispose() {
    super.dispose();
    _tabController.dispose();
  }

  //初始化调用
  @override
  void initState() {
    super.initState();
    _tabController = new TabController(length: 3, vsync: this);
    _tabController.addListener(() {
      //点击tab回调一次,滑动切换tab不会回调
      if(_tabController.indexIsChanging){
        print("ysl--${_tabController.index}");
      }

      //点击tab时或滑动tab回调一次
      if(_tabController.index.toDouble() == _tabController.animation.value){
        print("ysl${_tabController.index}");
      }

    });
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            //必须配置
            title: Text("TabController学习"),
            bottom: TabBar(
              controller: _tabController,
              tabs: [
                Tab(text: "页面A",),
                Tab(text: "页面B",),
                Tab(text: "页面C",)
              ],
            ),
          ),
          body: TabBarView(
            //必须配置
            controller: _tabController,
            children: [
              Center(child:Text("页面A")),
              Center(child:Text("页面B")),
              Center(child:Text("页面C"))
            ],
          )),
    );
  }
}
666666.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容