Flutter仿头条顶部tab切换实现

微信公众号:[程序员指北]
关注可了解更多的教程。问题或建议,请公众号留言;

转载请注明出处: https://learnandfish.com/

概述

上篇我们讲了实现一个仿闲鱼底部导航栏的功能,今天主要实现一个仿头条顶部tab切换实现,这种效果在项目中同样经常用到,
接下来我们就从头开始实现。

效果图

老规矩,开局先上效果图。
ezgif.com-video-to-gif.gif

仿头条顶部tab切换实现

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

TabBar 和 TabBarView

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

TabBar构造方法及常用属性简介
const TabBar({
    Key key,
     this.tabs,
    this.controller,
    this.indicatorColor,
    this.labelColor,
    this.unselectedLabelColor,
  })
属性名属性值类型说明
tabsTab类型的控件集合要显示的所有tab子项
controllerTabController类型主要用来监听tab的切换
indicatorColorColortab子项指示器的颜色
labelColorColor子项文字的颜色
unselectedLabelColorColor未选中子项文字的颜色
TabBarView构造方法及常用属性简介
const TabBarView({
    Key key,
     this.children,
    this.controller,
  })
属性名属性值类型说明
childrenWidget的集合对应TabBar每个子项要显示的具体内容
controllerTabController类型主要用来监听tab的切换
简单使用

接下来我们将使用两种方式实现基本使用,第一种方式是配合DefaultTabController使用,另外一种是配合
TabController使用。在我们使用TabBar的时候必须放在Scaffold控件的AppBar中,如果我们的App中Scaffold无法修改,
那我们需要在想要实现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属性上。
1.PNG

TabController实现

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

TabController({ int initialIndex = 0,  this.length,  TickerProvider vsync });
属性名属性值类型说明
initialIndexint初始选择的tab下标
lengthinttab的个数
vsyncTickerProvider提供动画等行为

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

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

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

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

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

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

由于电脑限制,完整代码后续将上传仓库,急需请留言。

篇幅有限,下篇文章继续讲解其他的内容。
第一时间获取最新内容,请关注公众号:程序员指北。
关注公众号回复flutter,你懂的。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter实现Tab切换效果可以通过使用TabBarTabBarView组件来实现。首先创建一个TabBar,其中包含多个Tab,每个Tab对应一个页面。然后使用TabBarView来管理这些页面,通过切换Tab来显示相应的页面。具体步骤如下: 1. 导入所需的包: ``` import 'package:flutter/material.dart'; ``` 2. 创建一个StatefulWidget,并实现State类: ``` class TabSwitcher extends StatefulWidget { @override _TabSwitcherState createState() => _TabSwitcherState(); } class _TabSwitcherState extends State<TabSwitcher> { // 定义TabBar的控制器和页面列表 TabController _tabController; List<Widget> _pages; @override void initState() { super.initState(); // 初始化TabController和页面列表 _tabController = TabController(length: 2, vsync: this); _pages = [ // 第一个页面 Container( child: Center(child: Text('第一个页面')), ), // 第二个页面 Container( child: Center(child: Text('第二个页面')), ), ]; } @override void dispose() { // 释放TabController _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Tab切换'), bottom: TabBar( controller: _tabController, tabs: [ Tab(text: 'Tab 1'), Tab(text: 'Tab 2'), ], ), ), body: TabBarView( controller: _tabController, children: _pages, ), ); } } ``` 3. 在主页面中使用TabSwitcher组件: ``` class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: TabSwitcher(), ); } } ``` 以上是一种常见的实现Tab切换效果的方法,你可以根据自己的需求进行修改和扩展。你可以参考中提供的代码地址:https://gitee.com/fjjxxy/flutter-study.git,以及中提供的参考链接来获得更多关于FlutterTab切换效果实现方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Flutter学习日记之自定义AppBar&顶部Tab切换](https://blog.csdn.net/qq_40785165/article/details/117308118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [FlutterTab切换效果](https://blog.csdn.net/wanxiaofan/article/details/120015878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [flutter_tab_demo.zip](https://download.csdn.net/download/liuxingyuzaixian/21762033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值