flutter 自带的tabbar BottomNavigationBar有长按水波纹效果,不可以添加背景图片功能,如果有这方面的需求,就需要自定义tabbar了

自定义图片 我们使用BottomAppBar 设定宽高,内部的UI就可以完全自定义 测试了一下,基本能达到想要的效果

废话不多了,直接上代码了

import 'package:flutter/material.dart';
import 'home.dart';
import 'category.dart';
import 'activity.dart';
import 'mine.dart'; class TabbarPage extends StatefulWidget {
@override
_TabbarPageState createState() => _TabbarPageState();
} class _TabbarPageState extends State<TabbarPage> {
PageController _pageController; List images = [
['assets/tab_icon_home.png', 'assets/tab_icon_home_selected.png'],
['assets/tab_icon_category.png', 'assets/tab_icon_category_selected.png'],
['assets/tab_icon_collect.png', 'assets/tab_icon_collect_selected.png'],
['assets/tab_icon_profile.png', 'assets/tab_icon_profile_selected.png'],
]; final List _titles = ['首页', '好物', '双11', '我的']; final List<Widget> _tabBodies = [
HomePage(),
CategoryPage(),
ActivityPage(),
MinePage(),
]; int _currentIndex = 0; void initState() {
super.initState();
this._pageController =PageController(initialPage: _currentIndex, keepPage: true);
} @override
Widget build(BuildContext context) {
return Scaffold(
// body: IndexedStack(
// index: _currentIndex,
// children: _tabBodies,
// ),
body: PageView(
children: _tabBodies,
controller: _pageController,
// physics: NeverScrollableScrollPhysics(),
),
// bottomNavigationBar: BottomNavigationBar(
// backgroundColor: Colors.brown,
// type: BottomNavigationBarType.fixed,
// currentIndex: _currentIndex,
// items: getItems(),
// onTap: (index) {
// setState(() {
// _currentIndex = index;
// // _pageController.jumpToPage(index);
// });
// },
// ),
bottomNavigationBar: _bottomAppBar(),
);
} BottomAppBar _bottomAppBar() {
double width = MediaQuery.of(context).size.width;
double height = 60; return BottomAppBar(
child: Container(
//设置背景
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
image: AssetImage('assets/tab_festival_background_android.png'),
),
),
width: width,
height: height,
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: _customItems(),
),
),
);
} /*获取tab图片*/
Widget getTabIcon(int index) {
if (_currentIndex == index) {
return Image.asset(
images[index][1],
width: 30,
fit: BoxFit.fitHeight,
);
}
return Image.asset(images[index][0], width: 30, fit: BoxFit.fitHeight);
} /*获取tab文字*/
Text getTabText(int index) {
if (_currentIndex == index) {
return Text(
_titles[index],
style: TextStyle(color: Color(0xFFEA164B), fontSize: 11),
);
} return Text(
_titles[index],
style: TextStyle(color: Color(0xFF8228CF), fontSize: 11),
);
} /*获取tabbatItem*/
List<BottomNavigationBarItem> getItems() {
return [
BottomNavigationBarItem(
icon: getTabIcon(0),
title: getTabText(0),
),
BottomNavigationBarItem(icon: getTabIcon(1), title: getTabText(1)),
BottomNavigationBarItem(icon: getTabIcon(2), title: getTabText(2)),
BottomNavigationBarItem(icon: getTabIcon(3), title: getTabText(3)),
];
} List<Widget> _customItems() {
double width = MediaQuery.of(context).size.width;
//均分成4分
double itemWidth = width / 4.0;
return images.map((img) {
int index = images.indexOf(img);
return GestureDetector(
onTap: () {
setState(() {
_currentIndex = index;
_pageController.jumpToPage(index);
});
},
child: Container(
color: Colors.transparent,
width: itemWidth * 0.8,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getTabIcon(index),
getTabText(index),
],
),
),
);
}).toList();
}
}

tabbar中通过pageView来实现页面的持久保存,细节参考

flutter 自定义tabbar 给tabbar添加背景功能的更多相关文章

  1. AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮

    AJ分享,必须精品 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这 ...

  2. iOS 自定义UITabBarController的tabBar

               #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDeleg ...

  3. sharepoint 2010 如何给文档库或自定义列表添加评论功能

    转:http://www.cfanz.cn/?c=article&a=read&id=40924 最近公司在知识库中,有一个需求,就是想要给文档添加评论功能,在sharepoint 2 ...

  4. SharePoint 2007 文档库中的文档添加评论功能

    背景:接到一个项目,要求文档管理,当然文档库就可以了,但是要求文档需要大家去读,读完以后还可以发表评论,这Moss貌似就有点困难了.和同事一起合计,想来想去也没有太好的办法,后来想到传统开发,两个表的 ...

  5. Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

    android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...

  6. 在VC中,为图片按钮添加一些功能提示(转)

    在VC中,也常常为一些图片按钮添加一些功能提示.下面讲解实现过程:该功能的实现主要是用CToolTipCtrl类.该类在VC  msdn中有详细说明.首先在对话框的头文件中加入初始化语句:public ...

  7. Egret 位图,纹理,添加背景 学习

    1,重新设置舞台大小,可以直接到VS中的 "解决方案"中,找到 launcher->egret_loader.js中,找到setDesignSize方法,修改其中大小即可:有 ...

  8. 为HTML表格添加交互功能------DataTables

    DataTables是一个功能强大的Javascript库,用于为HTML表格添加交互功能,虽然简单性是整个项目的核心设计原则,但入门看起来相当艰巨.但是,采取这些第一步并在您的网站上运行DataTa ...

  9. 为CSDN博客添加打赏功能

    随着移动支付在国内的兴起,越来越多的付费内容越多如雨后春笋般的冒了出来.其中以<逻辑思维>.罗振宇.李笑来为主要代表作品和人物. 现在很多博客或者个人网站里面都有打赏功能,这算是对博主的劳 ...

随机推荐

  1. Djnago模板与标签

    1.模版系统 基本语法 {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. python基础的基本数据类型可以通 ...

  2. python笔记:学习设置Python虚拟环境+配置 virtualenvwarpper+创建Python3.6的虚拟环境+安装numpy

    虚拟环境它是一个虚拟化,从电脑独立开辟出来的环境.就是借助虚拟机docker来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互 ...

  3. Python 爬虫实现天气查询(可视化界面版)

    github项目地址:StarMan Python 实现天气查询的程序早已完成,近日开学无课,昨晚心血来潮想做一个较为友好的界面版本,便匆忙行动了起来. 在之前已有的程序的基础上使用Tkinter 模 ...

  4. Maven编译指定(跳过)Module

    今天在项目里新添加了一个Module, 但是在jenkins编译的时候会将这个Module也编译, 问题是这个Module根本不需要编译而且巨慢. 因此我只想编译指定模块 ModuleA以及它依赖的必 ...

  5. Unrecognized SSL message, plaintext connection? 将https 换为http 即可

    请求链接:https://59********* 升级后的项目地址有https换为了http  ,出现这个错误,改为http请求即可

  6. 题解 [BZOJ1925][SDOI2010] 地精部落

    题面 解析 这个似乎并不好讲啊 设\(f[i][j]\)表示有\(i\)座山, 最后一座山到达高度是\(i\)座中第\(j\)大的, 且最后一座山是山谷. 注意,\(i\)是代表有\(i\)座山,并不 ...

  7. 2 MVC设计模式

    0 基础知识 (1)B/S与C/S结构 C/S(客户机/服务器 client/service):分为客户机和服务器两层,应用软件安装在客户端通过网络与服务器通信 B/S(liulanq/服务器 bro ...

  8. 传统Spring配置JTA 实现多数据源事务的统一管理

    分布式事务是指事务的参与者.支持事务的服务器.资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算机资源上访问并且更新数据,将两个或多个网络计算机的数据进行的多次操作作为一个整 ...

  9. Luogu P1951 收费站_NOI导刊2009提高(2) 二分 最短路

    思路:二分+最短路 提交:1次 题解: 二分最后的答案. $ck()$: 对于每次的答案$md$跑$s,t$的最短路,但是不让$c[u]>md$的点去松弛别的边,即保证最短路不经过这个点.最后$ ...

  10. js中showModalDialog的使用

    基本介绍:          showModalDialog()         (IE 4+ 支持)          showModelessDialog()      (IE 5+ 支持)    ...