首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter跨平台移动端开发丨顶部导航栏 TabBar Widget

Flutter跨平台移动端开发丨顶部导航栏 TabBar Widget

作者头像
码脑
发布于 2019-07-08 10:08:15
发布于 2019-07-08 10:08:15
2K00
代码可运行
举报
文章被收录于专栏:大前端大前端
运行总次数:0
代码可运行

支持左右滑动切换、不限 item 数量的 tabbar 是分类信息列表展示必不可少的组件,在 flutter 中可通过 AppBar + TabBar + PageView + ListView 完成这个需求


TabBar 部件

支持修改 tab 背景颜色、底部横线颜色,tab 上的按钮样式以及对应切换的页面,可通过 List 传入,这样可以支持更多拓展需求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:delongzhixuan/main/tab/MainTab.dart';
import 'package:flutter/material.dart';

/**
 * @des 顶部 tab 部件
 * @author liyongli 20190704
 * */
class TabWidget extends StatefulWidget{

  // item 组件
  List<Widget> tabItems;

  // item 组件对应的 widget
  List<Widget> tabItemWidgets;

  // tab 的背景颜色
  Color backgroundColor;

  // item 底部横线颜色
  Color indicatorColor;

  // item 对应的 widget 控制器
  PageController pageController;

  TabWidget({
    @required this.tabItems,
    @required this.tabItemWidgets,
    this.backgroundColor,
    this.indicatorColor,
    this.pageController
  }):super();

  @override
  State<StatefulWidget> createState() => _TabWidgetState();

}

/**
 * @des 顶部 tab 部件 State
 * @author liyongli 20190704
 * */
class _TabWidgetState extends State<TabWidget> with SingleTickerProviderStateMixin{

  TabController tabController;

  @override
  void initState() {
    super.initState();
    tabController = new TabController(length: widget.tabItems.length, vsync: this);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(

        // 顶部 TabBar
        title: Text(MainTabState.pageNameList[1], style: MainTabState.appbarTestStyle),
        backgroundColor: MainTabState.appbarBackgroundColor,
        centerTitle: true,
        bottom: TabBar(
          isScrollable: true, // 设置是否支持左右滑动
          controller: tabController, // 控制器
          indicatorColor: widget.indicatorColor, // item 底部横线颜色
          tabs: widget.tabItems, // 设置列表内容
        ),
      ),

      // TabBar 对应的 widget
      body: new PageView(
        controller: widget.pageController,
        children: widget.tabItemWidgets,
        onPageChanged: (index){
          tabController.animateTo(index);
        },
      ),
    );
  }

  @override
  void dispose() {
    tabController.dispose();
    super.dispose();
  }
}

TabBar 部件 item 对应的页面

也就是 ListView 部分,修改 initPageWidget 返回的 widget 为你需要的样式即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

/**
 * @des 顶部 tab 部件对应的 widget
 * @author liyongli 20190704
 * */
class TabItemWidget extends StatefulWidget {

  String itemIndex;

  TabItemWidget(this.itemIndex);

  @override
  State<StatefulWidget> createState() => _TabItemWidgetState();

}

/**
 * @des 顶部 tab 部件对应的 widget state
 * @author liyongli 20190704
 * */
class _TabItemWidgetState extends State<TabItemWidget> {

  @override
  Widget build(BuildContext context) {
    return initPageWidget();
  }

  /**
   * 初始化 page widget
   * */
  Widget initPageWidget(){
    return ListView.builder(itemBuilder: (context, i){
      return Container(
        alignment: Alignment.center,
        width: double.maxFinite,
        height: 100.0,
        decoration: BoxDecoration(
          border: Border(bottom: BorderSide(color: Color(0xff000000), width: 0.2))
        ),
        child: Text("${widget.itemIndex} - $i", style: TextStyle(color: Color(0xff000000), fontSize: 20.0),),
      );
    });
  }
}

TabBar 部件如何应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:delongzhixuan/utils/tab/TabWidget.dart';
import 'package:delongzhixuan/utils/tab/TabItemWidget.dart';
import 'package:flutter/material.dart';

/**
 * @des 产品首页
 * @author liyongli 20190704
 * */
class MainProduct extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => _MainProductState();

}

/**
 * @des 产品首页 State
 * @author liyongli 20190704
 * */
class _MainProductState extends State<MainProduct> {

  // 控制器
  PageController pageController;

  // 模拟数据
  List<String> items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10",];

  // tabbar 按钮集合
  List<Widget> tabItems = new List<Widget>();

  // tabbar 按钮对应的页面集合
  List<Widget> tabItemWidgets = new List<Widget>();

  @override
  void initState() {
    super.initState();
    pageController = new PageController();
    tabItems = _initTabItems(items, tabItems, false);
    tabItemWidgets = _initTabItemWidgets(items, tabItemWidgets);
    setState(() { });
  }

  @override
  Widget build(BuildContext context) {
    return _initPageWidget(context);
  }

  /**
   * 初始化 page widget
   * */
  Widget _initPageWidget(BuildContext context){
    return new TabWidget(
      tabItems: tabItems,
      tabItemWidgets: tabItemWidgets,
      pageController: pageController,
      indicatorColor: Colors.yellow,
    );
  }

  /**
   * 初始化 tab item 部件
   *
   * @params itemNameList 存储 tab item 名字的集合
   * @params itemWidgetList 转化完成后返回的集合
   * @params clear 是否需要在转化开始前,先行清空返回数组内的数据,主要用于应对分页加载刷新时的场景
   *
   * @return 已完成转化的 widget 集合
   * */
  List<Widget> _initTabItems(List<String> itemNameList, List<Widget> itemWidgetList, bool clear){

    // 检查传入的名字集合是否有数据,若没有数据则 return null
    if(null == itemNameList || itemNameList.length < 1){
      return null;
    }

    // 检查目标集合是否为空,为空则创建
    if(null == itemWidgetList){
      itemWidgetList = new List<Widget>();
    }

    // 检查是否需要先行清空 widget 集合数据
    if(clear && itemWidgetList.length > 0){
      itemWidgetList.clear();
    }

    // 开始转化
    for(var i = 0 ; i < itemNameList.length ; i++){
      itemWidgetList.add(
          new FlatButton(
              onPressed: (){pageController.jumpTo(MediaQuery.of(context).size.width * i);},
              child: Text(itemNameList[i], style: TextStyle(color: Color(0xffffffff)),)
          )
      );
    }

    return itemWidgetList;
  }

  /**
   * 初始化 tab item 对应的 widget(ListView 列表)
   *
   * @params itemNameList 存储 tab item 名字的集合
   * @params itemWidgetList 转化完成后返回的集合
   *
   * @return 已完成初始化的 tab item 对应的 widget 的数据集合
   * */
  List<Widget> _initTabItemWidgets(List<String> itemNameList, List<Widget> itemWidgetList){

    // 检查传入的名字集合是否有数据,若没有数据则 return null
    if(null == itemNameList || itemNameList.length < 1){
      return null;
    }

    // 检查目标集合是否为空,为空则创建
    if(null == itemWidgetList){
      itemWidgetList = new List<Widget>();
    }

    // 开始创建
    for(var i = 0 ; i < itemNameList.length ; i++){
      itemWidgetList.add(new TabItemWidget(itemNameList[i]));
    }

    return itemWidgetList;
  }

}

运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VRay5.1 for 3ds Max:打造逼真的3D建筑视觉效果的完美解决方案
VRay5.1 for 3ds Max是一款专业的渲染软件,适用于3D建筑可视化领域,旨在提供高质量的渲染效果和高效的工作流程,从而帮助建筑师和其它设计人员呈现更加逼真的建筑效果图。该软件与3ds Max完美结合,提供了全面的渲染和制作解决方案,有助于用户完成复杂的建筑场景和室内设计。
用户10313071
2023/04/05
1K0
VRay5.1 for 3ds Max:打造逼真的3D建筑视觉效果的完美解决方案
VRay相比3Dmax自带的渲染器,优势在哪里?-Renderbus云渲染
3Dmax三维软件有很多渲染器,其中Scanline和Mental Ray是3Dmax自带的渲染器,还有部分渲染器是插件式的需要安装到3Dmax中才可以使用,比如:VRay、FinalRender、Corona Renderer、redshift等等。每个渲染器都有自己的优势,选择不同渲染器所达到效果也会不同。
Renderbus云渲染农场
2018/06/15
2.4K0
VRay相比3Dmax自带的渲染器,优势在哪里?-Renderbus云渲染
三维动画渲染制作软件3Ds Max 2023中文版,3Ds Max软件安装过程
3Ds Max是一款强大的三维建模软件,它可以让你在电脑上创造出各种各样的三维模型,比如建筑、汽车、人物等等。它的操作界面非常友好,可以让你快速地学会如何使用它。
用户10413399
2023/03/23
8710
三维动画渲染制作软件3Ds Max 2023中文版,3Ds Max软件安装过程
维度升华—Vray 6.0 for SketchUp带你走入真实建模世界+全版本安装包
Vray 6.0 for SketchUp是一款高级渲染器,由世界著名CG制作公司ChaosGroup开发,旨在为SketchUp用户提供快速且高质量的渲染效果,实现真实的光照和材质细节效果。
用户10480228
2023/04/18
8360
维度升华—Vray 6.0 for SketchUp带你走入真实建模世界+全版本安装包
Rhino之光—Vray 6.00为你的建模注入无限可能+全版本安装包
Vray 6.00 for Rhino是一款专为Rhino用户打造的高级渲染器。随着建模技术的不断进步,Rhino已经成为了多个领域中不可或缺的建模软件之一,而Vray 6.00给了Rhino用户更多的创作自由和无限可能性。
用户10480228
2023/04/18
5980
Rhino之光—Vray 6.00为你的建模注入无限可能+全版本安装包
VRay6.02 for SketchUp为用户提供更加易用和高效的渲染解决方案
VRay6.02 for SketchUp 是一款功能强大的渲染引擎软件,专门面向 SketchUp 用户提供高效、易用的渲染解决方案。该软件是由著名的渲染引擎开发公司 Chaos Group 公司开发,为数以万计的建筑、景观、室内、产品、工程设计等行业用户提供了高质量、真实感十足的 3D 渲染体验。
用户10480228
2023/04/08
7670
VRay6.02 for SketchUp为用户提供更加易用和高效的渲染解决方案
好用的3dsmax插件分享
3ds max本身已经是一款非常强大的三维动画渲染和制作软件了,但为了提高CG输出质量并加快工作流程,还是有不错的插件可以用作3ds max本地工具的替代品,还可提供3ds max所没有的功能以及增强原本的功能。下面列出几种个人认为还不错的较为常用的3dsmax插件,更多答案可以补充探讨~
Renderbus云渲染农场
2018/05/23
3.4K0
好用的3dsmax插件分享
VRay 5.0 for 3D MAX让3D MAX更加真实高质量渲染器+全版本安装包
VRay是一款广泛应用于CG艺术、室内设计、建筑可视化等领域的渲染软件。随着VR技术的不断发展,VRay也不断引领着渲染技术的发展方向。其中,VRay 5.0 for 3D MAX可以说是这个系列软件的全新升级,它带来了更高的性能和更多新功能。
用户10480228
2023/04/13
6830
VRay 5.0 for 3D MAX让3D MAX更加真实高质量渲染器+全版本安装包
三维建模 Rhino软件犀牛中文版安装包下载,Rhino犀牛下载安装
Rhino是一款由美国Robert McNeel与Associates公司开发的三维建模软件,也称为Rhino 3D,它在建筑、工业设计、产品设计、航空航天及汽车等行业中得到广泛应用。作为一款专业级三维建模软件,Rhino具有强大的建模能力,可以帮助用户快速地创建各种复杂的三维模型,并且还可以进行渲染、动画和布局等操作。
用户10413399
2023/04/19
8070
Vray 6.00 for Rhino:打造更真实精细的建筑渲染效果
Vray 6.00 for Rhino是目前Rhino渲染中最为先进和成熟的渲染引擎之一。它充分利用了Rhino网格模型的强大建模能力,提供高质量的渲染图像和快速的渲染速度。用户可以通过Vray 6.00 for Rhino轻松创建出具有高度真实感和艺术感的图像和动画。
用户10480228
2023/04/08
6710
Vray 6.00 for Rhino:打造更真实精细的建筑渲染效果
SketchUp中文版,SketchUp三维建筑设计软件下载安装,特色功能
SketchUp是一款功能强大的三维建模工具,其适用于建筑、室内设计、景观设计等多个领域。它充分发挥了Google的优势,使用户可以方便地通过Google Earth和Google Maps来获取各种现成的3D模型和贴图。除此之外,SketchUp还有很多独特的功能,下面就让我们来看看。
优木软件
2023/05/07
3990
3Dsmax丨3dsmax2023软件下载安装教程(含全版本安装包)_永久使用
3DS MAX是一款功能强大的三维建模、动画和渲染软件,其中提供了多种高质量的渲染工具,包括Arnold渲染器、mental ray渲染器等,可以帮助用户生成高质量的图像和动画。用户可以通过自定义光照、材质、阴影等参数来调整渲染效果,以达到理想的渲染结果。此外,3DS MAX还支持多种渲染模式,包括扫描线渲染、光线跟踪渲染、分布式渲染等,可以根据用户的需要进行选择。3DS MAX还提供了强大的材质编辑器,可以帮助用户创建各种材质效果,例如金属、玻璃、皮革等。总之,3DS MAX的高质量渲染工具和可调整的渲染效果使其成为三维渲染中不可或缺的工具。
资源牛牛
2023/04/20
1.9K0
3Dsmax丨3dsmax2023软件下载安装教程(含全版本安装包)_永久使用
VRay3.0-6.2 for 3dmax2014-2024软件下载及安装教程
1.安装VRay 3.0【vr 3.0】 for 3dsmax2014 (64位) 英文官方破版,双击打开VRay 3.0的安装程序。
知识兔下载
2023/03/11
2.8K0
ISUX译文 | The PBR Guide基于物理的渲染指引(下)
腾讯ISUX isux.tencent.com 社交用户体验设计 近日在研究3D-TO-H5工作流及学习PBR的过程中,发现Substance官方新版的《The PBR Guide》尚未有完整的中文翻译,所以把心一横,斗胆翻译了一波,希望能抛砖引玉,让大家更深入浅出地了解3D材质贴图及PBR技术。 PBR,Physically-Based Rendering,意为基于物理的渲染,是一种能对光在物体表面的真实物理反应提供精确渲染的方法,也是近年来极其生猛的3D工业趋势。 《The PBR Gu
腾讯ISUX
2020/03/23
1.6K0
Vray 5.2 for Rhino:高品质渲染的专业建模插件+全版本安装包
Vray 5.2 for Rhino 是 Chaos Group 公司的一款专业建模插件,它支持全平台去重,并且可以在 Windows 和 macOS 等操作系统下运行。该插件具有强大的渲染和建模功能,可用于创建各种类型的建筑、室内设计和产品设计等。下面我将从不同的角度为大家介绍这款优秀的插件。
用户10521990
2023/04/21
4941
Vray 5.2 for Rhino:高品质渲染的专业建模插件+全版本安装包
VRay6.02 for SketchUp再次突破渲染技术的新版本+全版本安装包
VRay6.02 for SketchUp是一款强大的渲染软件,专门为SketchUp用户打造。SketchUp是一款流行的3D建模软件,而VRay则是这个行业中最受欢迎和最具代表性的渲染插件之一。在VRay的不断完善和更新之下,它的渲染效果和速度一直处于行业领先的水平。VRay6.02 for SketchUp是这一系列软件的全新升级版本,让它的渲染效果和速度再次实现了突破。
用户10480228
2023/04/13
8440
VRay6.02 for SketchUp再次突破渲染技术的新版本+全版本安装包
SketchUp Pro 2022 Mac激活版(su草图大师)
Sketchup Pro 2022中文草图大师2022,是一套十分出色的三维建模绘图软件,SketchUp拥有绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图等,并且草图大师2022拥有成千上万的精致像素、动态和矢量画笔可以满足你的各种需求。SketchUp不仅仅是3D模型。绘图计划、海拔、细节、标题栏等都可以排版布局。当你的模型改变时这些内容也会改变,非常简单。
Mac小小
2022/08/26
6300
SketchUp Pro 2022 for Mac(草图大师)中文版
Sketchup Pro 2022中文草图大师2022,是一套十分出色的三维建模绘图软件,SketchUp Pro 2022 for Mac中文版拥有绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图等,并且草图大师2022拥有成千上万的精致像素、动态和矢量画笔可以满足你的各种需求。
小草莓
2022/09/15
1.5K0
SketchUp Pro 2022 for Mac(草图大师)中文版
V-Ray 6.0 for Rhino:使Rhino变得更加真实的高质量渲染器
V-Ray 6.0 for Rhino是由Chaos Group公司推出的Rhino三维模型渲染插件。该软件能够让Rhino变得更加具有真实感,可以在渲染中提供出色的性能和高品质的渲染,从而使用户可以更好地展示自己的设计和想法。V-Ray 6.0 for Rhino具有多平台兼容性,可以在Windows和Mac OS等操作系统上运行,因此,在不同设备之间进行工作和交换数据也变得一致和便捷。
用户10313071
2023/04/12
6200
V-Ray 6.0 for Rhino:使Rhino变得更加真实的高质量渲染器
3DS Max渲染器V-ray最新版6.0:Chaos V-Ray for 3ds max 2020-2023版安装教程
3ds Max是一款功能强大的三维制作软件,它还支持与其他Autodesk产品进行协作,如Revit、AutoCAD和Maya等,可以通过导入和导出数据进行互操作。这意味着用户可以在不同的Autodesk产品之间无缝切换,方便快捷地进行三维制作和设计。同时,3ds Max还支持各种脚本和插件,用户可以通过编写脚本和使用插件来扩展软件的功能和性能。用户可以根据自己的需要来选择合适的脚本和插件,例如用于自动化建模的脚本、用于增强渲染质量的插件等。这些脚本和插件可以帮助用户提高工作效率,缩短制作周期,从而更好地满足用户的需求。总的来说,3ds Max是一款非常强大的三维制作软件,它不仅自身功能丰富,而且与其他Autodesk产品协作无缝,支持各种脚本和插件,为用户提供了更多的选择和可能性。
用户10507785
2023/04/18
1K0
3DS Max渲染器V-ray最新版6.0:Chaos V-Ray for 3ds max 2020-2023版安装教程
推荐阅读
相关推荐
VRay5.1 for 3ds Max:打造逼真的3D建筑视觉效果的完美解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档