怎么把一个控件放到tab页面上去?_使用Flutter技术实现今日头条顶部tab切换

218835a3cac3c3e2c3c820a4b1fac428.png

概述

今天主要实现一个仿头条顶部tab切换实现,这种效果在项目中同样经常用到, 接下来我们就从头开始实现。

效果图

老规矩,开局先上效果图。

7bfc8955bd215d48efc5932e5ecec79e.png

仿头条顶部tab切换实现

要实现这样的效果,需要使用TabBar进行实现。我们先讲一下TabBar的基本属性。

TabBar 和 TabBarView

TabBar是属于AppBar中的一个组件,通常和TabBarView结合使用。

TabBar构造方法及常用属性简介

const TabBar({
    Key key,
    @required this.tabs,
    this.controller,
    this.indicatorColor,
    this.labelColor,
    this.unselectedLabelColor,
  })

属性名属性值类型说明tabsTab类型的控件集合要显示的所有tab子项controllerTabController类型主要用来监听tab的切换indicatorColorColortab子项指示器的颜色labelColorColor子项文字的颜色unselectedLabelColorColor未选中子项文字的颜色

TabBarView构造方法及常用属性简介

const TabBarView({
      Key key,
      @required this.children,
      this.controller,
    })

属性名属性值类型说明childrenWidget的集合对应TabBar每个子项要显示的具体内容controllerTabController类型主要用来监听tab的切换

简单使用

接下来我们将使用两种方式实现基本使用,第一种方式是配合DefaultTabController使用,另外一种是配合 TabController使用。在我们使用TabBar的时候必须放在Scaffold控件的AppBar中,如果我们的AppScaffold无法修改, 那我们需要在想要实现tab效果的页面上包裹一层Scaffold组件,要使用TabBar组件,必须为其指定TabController,要不然 会报错,我们先看第一种实现方式,在Scaffold组件外面包裹DefaultTabController实现。

DefaultTabController实现

首先,我们先准备需要切换的tab子项的集合和对应tab子项的具体显示内容。

// 需要显示的tab子项集合
  final tabs = <Tab>[
    Tab(
      text: "热门",
    ),
    Tab(
      text: "新闻",
    ),
  ];

  // 对应上述tab切换后具体需要显示的页面内容
  final tabBarViews = <Widget>[
    Center(
      child: Text("热门Tab对应的界面"),
    ),
    Center(
      child: Text("新闻Tab对应的界面"),
    ),
  ];

然后再HomePage页面定义一个TabBar实现。

DefaultTabController(
        length: tabs.length, // tab的个数
        child: Scaffold(
          appBar: AppBar(
            title: TabBar(
              tabs: tabs,
            ),
          ),
          body: TabBarView(
            children: tabBarViews,
          ),
        ),
      );

正常情况下,我们的TabBar应该是对应appBar中的bottom属性的,但此处我们卸载了title属性下,是因为我们上层已经 有了一个appBar了,如果再把TabBar对应的写在appBar的bottom属性上,就会导致appBar留有一个空白非常难看,效果如下。 所以我们定义在了title属性上。

5ffcb0fcffd4618b56a5f90bb5fd6785.png

TabController实现

上述实现方式有个局限,就是我们点击切换tab的时候,往往需要监听同时更改页面状态。所以我们以TabController实现。 首先先看一下TabController的构造方法及属性。

TabController({ int initialIndex = 0, @required this.length, @required TickerProvider vsync });

属性名属性值类型说明initialIndexint初始选择的tab下标lengthinttab的个数vsyncTickerProvider提供动画等行为

要实现能动态改变状态的tab切换效果必须先继承StatefulWidget,因为TabController需要TickerProvider,所以我们同时 让我们stateMixins SingleTickerProviderStateMixin这个类。从而更容易的实现TabController,看一下具体的代码实现。

class ThirdPage extends StatefulWidget {
    @override
    State createState() => _ThirdPageState();
  }

  class _ThirdPageState extends State<ThirdPage>
      with SingleTickerProviderStateMixin {
    TabController _tabController;

    @override
    void initState() {
      super.initState();
      _tabController = TabController(length: tabs.length, vsync: this);
      _tabController.addListener(() => print("当前点击的是第${_tabController.index}个tab"));
    }

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: TabBar(
            controller: _tabController,
            tabs: tabs,
          ),
        ),
        body: TabBarView(
          controller: _tabController,
          children: tabBarViews,
        ),
      );
    }
  }

至此,我们的仿头条tab切换效果已经实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值