flutter实现底部Tab和顶部导航条切换

【Flutter】自定义Tab的切换动画取巧实现 系统的TabBar并没有很好的自定义能力,为了满足设计的需求自己稍微写了一个取巧的Tab切换动画。 先看一下实现效果,没有搞动图和视频所以看不了动画。 主要需求点是: 1.点选Tab时字体需要变大,但是要保持Tab之间的间距不变。 2.底部的indicator可以自定义样式。 3.切换Tag时indicator有一个平滑(自定义)过渡动画。 4.当Tab数量过多时应该支持滑动(此项未实现,主要涉及取巧实现里的问题) 实现思路 首先先一个顶部Tab的Widget,一个简单的L. 阅读详情

目录

 

底部Tab:使用BottomNavigationBar来实现。

顶部Tab(DefaultTabController实现方式):

还有另一种实现方式:实现SingleTickerProviderStateMixin(适用于已确定要显示Tab标签)

如果是动态添加标签,就需要实现TickerProviderStateMixin,注意:不是SingleTickerProviderStateMixin,接口请求结束后,在setState中仍需要再初始化一遍TabController

有些需求会要求实现某部分布局滑到顶部后吸顶悬浮


底部Tab:使用BottomNavigationBar来实现。

class IndexPage extends StatefulWidget {
  @override
  _IndexPageState createState() => _IndexPageState();
}

class _IndexPageState extends State<IndexPage> {
  List<BottomNavigationBarItem> tabs = [
    BottomNavigationBarItem(
      icon: Image.asset("images/home_unactive.png", width: 24, height: 24),
      activeIcon: Image.asset("images/home_active.png", width: 24 height: 24),
      title: Text("首页"),
    ),
    BottomNavigationBarItem(
      icon: Image.asset("images/home_unactive.png", width: 24, height: 24),
      activeIcon: Image.asset("images/home_active.png", width: 24 height: 24),
      title: Text("分类"),
    ),
    BottomNavigationBarItem(
      icon: Image.asset("images/home_unactive.png", width: 24, height: 24),
      activeIcon: Image.asset("images/home_active.png", width: 24 height: 24),
      title: Text("购物车"),
    ),
    BottomNavigationBarItem(
      icon: Image.asset("images/home_unactive.png", width: 24, height: 24),
      activeIcon: Image.asset("images/home_active.png", width: 24 height: 24),
      title: Text("我的"),
    ),
  ];

  List<Widget> pages = [
    HomePage(),
    CategoryPage(),
    ShoppingCartPage(),
    MyPage(),
  ];

  int currentIndex = 0;
  PageController _controller = PageController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        controller: _controller,
        children: pages,
        physics: NeverScrollableScrollPhysics(), //禁止页面滚动
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: currentIndex,
        items: tabs,
        unselectedFontSize: 13,
        selectedFontSize: 13,
        type: BottomNavigationBarType.fixed,
        onTap: (index) {
          _controller.jumpToPage(index);
          setState(() {
            currentIndex = index;
          });
        },
      ),
    );
  }
}

顶部Tab(DefaultTabController实现方式):

body: DefaultTabController(
          length: 3,//项的数量
          initialIndex: 0,//默认选择第一项
          child: Column(
            children: <Widget>[
              Container(
                color: Colors.lightBlue,
                child: AspectRatio(
                  aspectRatio: 8.0,
                  child: TabBar(
//                    isScrollable: true,//项少的话,无需滚动(自动均分屏幕宽度),多的话,设为true
                    indicatorColor: Colors.red,
                    indicatorWeight: 2,
                    unselectedLabelColor: Colors.white,
                    labelColor: Colors.red,
                    tabs: [
                      Tab(
                        text: "科技",
                      ),
                      Tab(
                        text: "汽车",
                      ),
                      Tab(
                        text: "金融",
                      ),
                    ],
                  ),
                ),
              ),
              Expanded(
                child: TabBarView(
                  children: [
                    TechFragment(),
                    CarFragment(),
                    FinanceFragment(),
                  ],
                ),
              )
            ],
          ),
        ),

还有另一种实现方式:实现SingleTickerProviderStateMixin(适用于已确定要显示Tab标签)

initState中:

tabController = TabController(length: list.length, vsync: this);

如果是动态添加标签,就需要实现TickerProviderStateMixin,注意:不是SingleTickerProviderStateMixin,接口请求结束后,在setState中仍需要再初始化一遍TabController

setState(() {
   tabController = TabController(length: list.length, vsync: this);
});

有些需求会要求实现某部分布局滑到顶部后吸顶悬浮

可以是一个tabbar,也可以是一个别的组件,但是目的都是让其吸顶悬浮在那,示例代码如下:

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: PreferredSize(
        child: AppBar(
          backgroundColor: Colors.red,
        ),
        preferredSize: Size.fromHeight(0),
      ),
      body: NestedScrollView(
        headerSliverBuilder: (_, innerBoxIsScrolled) {
          return [
            SliverToBoxAdapter(//其他内容用SliverToBoxAdapter包裹
              child: Container(
                height: 150,
                color: Colors.greenAccent,
                alignment: Alignment.center,
                child: Text(
                  "头部",
                  style: TextStyle(
                    fontSize: 50,
                    color: Colors.white,
                  ),
                ),
              ),
            ),
            SliverPersistentHeader(//悬浮区
              pinned: true,
              delegate: _SliverAppBarDelegate(
                minHeight: 70,
                maxHeight: 70,
                child: Container(
                  child: Row(
                    children: <Widget>[
                      Expanded(
                        child: InkWell(
                          onTap: () {
                            print("Tab1");
                          },
                          child: Container(
                            alignment: Alignment.center,
                            child: Text("Tab1"),
                            color: Colors.red,
                          ),
                        ),
                      ),
                      Container(
                        width: 1,
                        height: 70,
                        color: Colors.white,
                      ),
                      Expanded(
                        child: InkWell(
                          onTap: () {
                            print("Tab2");
                          },
                          child: Container(
                            alignment: Alignment.center,
                            child: Text("Tab2"),
                            color: Colors.lightBlue,
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ];
        },
        body: ListView.builder(//列表区
          itemCount: 30,
          itemBuilder: (_, index) {
            return Container(
              height: 60,
              alignment: Alignment(0, 0),
              child: Text("数据$index"),
            );
          },
        ),
      ),
    );
  }
}

class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  _SliverAppBarDelegate({
    @required this.minHeight,
    @required this.maxHeight,
    @required this.child,
  });

  final double minHeight;
  final double maxHeight;
  final Widget child;

  @override
  double get minExtent => minHeight;

  @override
  double get maxExtent => maxHeight;

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return SizedBox.expand(child: child);
  }

  @override
  bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
    return maxHeight != oldDelegate.maxHeight ||
        minHeight != oldDelegate.minHeight ||
        child != oldDelegate.child;
  }
}

 

 

【Flutter】三十四、Flutter常用组件——Tab导航栏 在Flutter中完成一个导航栏有两种方式:一种是通过DefaultTabController,另一种是通过TabController: 一、使用DefaultTabController import 'package:flutter/material.dart'; class TabDemo extends StatelessWidget { @override Widget buil... 阅读详情

相关推荐

Flutter组件--TabBar使用详情(分段控制器)

TabBar使用详情, TabController,分段控制器,左右滑动试图

eastWind1101的博客 1万+

Flutter控件之Tab选项卡封装

而在Flutter当中呢,可以很负责任的告诉大家,也是很简单的就可以实现,主要使用到了TabBar和TabBarView

知足常乐 3463

Flutter教程_Flutter实现底部tab切换_ Flutter BottomNavigationBar 自定义底部导航条实现底部页面tab切换

BottomNavigationBar 是底部导航条,可以让我们定义底部Tab切换,bottomNavigationBar是Scaffold组件的参数。 这是Flutter BottomNavigationBar 自定义底部导航条实现底部页面tab切换的效果 看视频的话去B站找 Dart Flutter教程,或者百度搜索 大地老师Flutter教程 BottomNavigationBar 常见...

xiaoyuan188的博客 2038

Flutter学习:关于Tab导航栏

Flutter关于Tab导航栏: 包括以下几种情况: 1、 底部Tab切换 2、 自定义顶部Tab 3、 使用TabController实现顶部Tab切换 1. 底部Tab切换 使用bottomNavigationBar实现底部Tab栏,这里需要注意控制切换的currentIndex,另外大于三个tab进行设置,type: BottomNavigationBarType.fixed配置底部tabs可以有多个按钮。 import 'package:flutter/material.dart'; import

qq_40206575的博客 1860

Flutter中BottomNavigationBar 定义底部导航条

本文介绍了Flutter中BottomNavigationBar的使用方法,用于实现底部导航栏功能。通过Scaffold组件的bottomNavigationBar属性配置,可以设置items导航按钮、图标大小、选中颜色等属性。示例代码展示了如何在main.dart中引入Tabs组件,并在Tabs.dart中实现包含首页、分类、设置三个页面的底部导航,通过currentIndex控制页面切换。每个子页面(Home、Category、Setting)都是简单的文本展示组件。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 2787

TMC5130/TMC5160步进电机驱动芯片深度解析与工程实践

步进电机驱动芯片是精密运动控制系统的物理执行核心,其性能直接决定定位精度、运行噪声与系统鲁棒性。基于电流闭环控制与电压前馈调制的混合驱动原理,现代智能驱动芯片如TMC51X0系列实现了微步插补、堵转检测和片上运动规划等关键技术突破。这类芯片通过SPI寄存器级配置实现StealthChop静音驱动与SpreadCycle高动态响应模式的无缝切换,在3D打印、CNC、机器人关节等场景中显著提升能效比与控制带宽。本文围绕TMC5130与TMC5160的硬件架构差异、寄存器操作时序、驱动模式物理机制及FreeRTO

weixin_35797963的博客 410

Flutter 底部导航栏(Tab 页)的快速实现

Flutter 底部导航栏(Tab 页)的快速实现 我们知道 Scaffold 实现了基本的 Material 布局。只要是在 Material 中定义了的单个界面显示的布局控件元素,都可以使用 Scaffold 来绘制。 如果我们想实现底部 Tab 页切换的效果,应该如何做呢? bottomNavigationBar Scaffold 的 bottomNavigationBar 属性是一个 BottomNavigationBar 类型的对象。BottomNavigationBar 是底部导航条,可以帮助

卜大爷的博客 2万+

单细胞分析R包monocle3服务器安装教程

由于centos7系统yum只能安装到低版本gdal,而monocle3依赖包需要 gdal>2 版本,从gdal官网下载2.4.4版本编译安装。monocle3的安装是通过cole-trapnell-lab安装的,该包挂在github上,需要通过github先安装leidenbase包,需要提前安装devtools包下载工具。接着利用BiocManager安装相应的依赖包,由于这些包的特殊性,所以不要切换到国内Bio_Mirror镜像,否则会找不到,如果一次不成功,缺啥补啥即可。运行 ldconfig。

qq_36608036的博客 1万+

Flutter之自定义底部导航条以及页面切换实例——Flutter基础系列

三只松鼠

houruoyu3的博客 1065

Dataworks实现接口调用

在本地linux虚拟机(不用在意linux版本),安装Anaconda后配置对应的虚拟环境,将虚拟环境的python包整体打包(路径一般为:~/anaconda/envs/env_name/lib/pyyhon3.7/site-packages):上传资源,将第三方包上传至dataworks(注意:所有上传文件均要打包上传,直接上传文件会乱码导致无法使用):PyODPS,其中PyODSP2的python版本为2.7,PyODSP3的python版本为3.7。:在PyODPS中引用资源,然后开发接口。

hutc_Alan的博客 1681

大疆C板使用C610电调驱动M2006电机(hal库)

大疆C板使用C610电调驱动M2006电机,以及遇到代码没问题,但是电机死活不转的处理

qq_46210601的博客 6020

Futter基础11篇: 实现自定义AppBar 定义顶部Tab切换、底部Tab结合顶部Tab实现类似头条页面布局

效果图: Home.dart AppBarDemo.dart Categroy.dart 底部导航基本架构参考:flutter实现底部导航 main.dart import 'package:flutter/material.dart'; import 'routes/Routes.dart'; void main() => runApp(MyApp()); class MyAp...

qq_27494201的博客 744

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

Flutter之自定义顶部Tab——Flutter基础系列

需求: 顶部导航条的功能实现。 效果图: DefaultTabController( length: 2, //配置顶部tab的数量 child: Scaffold( appBar: AppBar( title: Text("普通顶部导航栏"), bottom: TabBar( tabs: <Widget>[ Tab(text: "热.

houruoyu3的博客 2248

Android功耗系列专题理论之六:外设功耗问题分析方法

本文介绍了移动设备功耗问题的分析方法,重点针对传感器和GPU两大模块。传感器部分详细讲解了通过ADB命令获取日志、状态差异分析和单传感器隔离测试的排查方法,并给出优化建议。GPU部分从基础功耗测量、场景测试到功能模块拆解进行多维度分析。同时阐述了GNSS/GPS功耗的测试方法,包括前后台对比、星座双频拆解及SAP/DPO等特殊功能的电流分析,为移动设备功耗优化提供系统性的诊断思路。

372

SAP CPI 如何代理第三方接口?

代理接口是指在系统 A 和系统 B 之间引入一个中间层(如 SAP CPI),由中间层负责接收来自系统 A 的请求,进行必要的处理或转换,然后将请求转发给系统 B。由于 OData 服务通常使用 JSON 格式的数据,而某些内部系统可能需要 XML 格式,因此我们添加一个 JSON 到 XML 的转换器,以确保数据格式的兼容性。为了确保返回的数据格式符合内部系统的要求,添加一个 XML 到 JSON 的转换器,将 OData 服务的响应从 XML 转换为 JSON。在集成包中,添加一个新的集成流,命名为。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1748

Flutter BottomNavigationBar 自定义底部导航栏,实现页面切换

Flutter BottomNavigationBar组件 BottomNavigationBar是底部导航条,可以让我们定义底部Tab切换,bottomNatigationBar是Scaffold组件的参数。 BottomNavigationBar常见属性 属性 说明 items List<BottomNavigationBarItem> 底部导航条按钮集合 iconSize icon currentIndex 默认选中第几个 onTap.

达帮主 2395

【项目实战】使用Python - Mediapipe、OpenCV进行手部面部检测(Python源码)

本文介绍了使用MediaPipe和OpenCV库进行实时面部和手部关键点检测的方法。通过MediaPipe的Holistic模型,可以获取468个面部特征点及每只手21个特征点。文章详细说明了环境配置、模型初始化参数设置,并提供了完整的代码实现,包括视频流处理、关键点绘制和FPS计算等功能。这套方案可应用于手语识别、疲劳检测等计算机视觉场景,为开发者提供了一套高效的开箱即用解决方案。

梦想起飞的地方 481

Flutter BottomNavigationBar:底部导航条实现页面切换

3.items中是一个BottomNavigationBarItem的集合,里面包含图片及文字标签,视频教程中给的文字使用的是title,我在使用时提示被弃用,但可以使用label直接给文字。4.currentIndex是BottomNavigationBar 中的属性,是为底部导航页面编的号,从零开始。6. body中是我们展示的页面,我们将所有页面放在一个集合中,通过上一步中获取到的下标定位到指定页面。然后调用setState改变展示的页面。之后在body处遍历List即可。这是一个比较普遍的思路。

weixin_46136019的博客 1894

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化

效果: /** *FlutterBottomNavigationBar自定义底部导航条、以及实现页面切换: *BottomNavigationBar是底部导航条,可以让我们定义底部Tab切换, *bottomNavigationBar是Scaffold组件的参数。 *BottomNavigationBar常见的属性: itemsList&lt...

weixin_30522095的博客 205

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Flutter 自定义底部导航条及切换

未抽离代码 import 'package:flutter/material.dart'; import 'package:untitled1/res/data.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return ..

qq_42572245的博客 561

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Flutter StatefulWidget 有状态组件 、 页面上绑定数据、改变页面数据、 BottomNavigationBar 自定义 底部导航条、以及实现页面切换

Flutter StatefulWidget 有状态组件 、 页面上绑定数据、改变页面数据、 BottomNavigationBar 自定义 底部导航条、以及实现页面切换

manerzi的博客 345

BottomNavigationBar 自定义 底部导航条

在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数。 BottomNavigationBar 常见的属性 items :List底部导航条按钮集合 iconSize :icon currentIndex :默认选中第几个 onTap:选中变化回调函...

weixin_30443075的博客 441

Futter基础第7篇: 实现底部导航

效果图: main.dart: import 'package:flutter/material.dart'; import 'pages/Tabs.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget{ @override Widget build(BuildContext cont...

qq_27494201的博客 592

Flutter组件学习九-BottomNavigationBar(底部导航栏)

1、BottomNavigationBar 是底部导航条,可以让我们定义底部Tab切换,bottomNavigationBar是Scaffold组件的参数 1.1、属性 属性 说明 items List底部导航条按钮集合 iconSize 图标大小 currentIndex 默认选中第几个 onTap 选中变化回调函数 fixedColor 选中的颜色 type...

wmd看海的博客 318

Flutter组件--BottomNavigationBar,底部tabbar,FloatingActionButton

FloatingActionButton,tabbar,底部tabbar

eastWind1101的博客 1025
上一篇: Android热修复Tinker
下一篇: flutter状态管理---provider
尘彦
博客等级 码龄11年 92粉丝 22原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值