Flutter 底部导航栏bottomNavigationBar
实际上由于手机屏幕大小的限制,底部导航栏的功能标签一般在3到5个左右,如果太多,会比较拥挤,影响用户体验,实际上目前市面上大多数APP的底部导航标签都控制在4到5个左右。既美观、又不会让用户觉得功能繁杂。这个功能的实现需要用到flutter里的BottonNavigationBar这个控件。
属性名 | 类型 | 说明 |
currentIndex | int | 当前索引,用来切换按钮控制 |
fixedColor | Color | 选中按钮的颜色,如果没有指定值,则用系统主题色 |
iconSize | double | 按钮图标大小 |
items | List<BottomNavigationBarItem> | 底部导航条按钮集。每一项是一个BottomNavigationBarItem,有icon图标及title属性 |
onTap | ValueChanged<int> | 按下其中某一个按钮回调事件,需要根据返回的索引设置当前索引 |
import 'package:flutter/material.dart';
import './home.dart';
import './contacts.dart';
import './me.dart'; // 应用页面使用有状态Widget
class App extends StatefulWidget {
@override
AppState createState() => AppState();
}
//应用页面状态实现类
class AppState extends State<App> {
//当前选中页面索引
var _currentIndex = ;
//聊天页面
HomePage home;
//好友页面
Contacts contacts;
//我的页面
Personal me; //根据当前索引返回不同的页面
currentPage(){
switch(_currentIndex) {
case :
//返回聊天页面
if(home == null) {
home = new HomePage();
}
return home;
case :
//返回好友页面
if(contacts == null) {
contacts = new Contacts();
}
return contacts;
case :
//返回我的页面
if(me == null) {
me = new Personal();
}
return me;
}
} @override
Widget build(BuildContext context) { return Scaffold( //底部导航按钮
bottomNavigationBar: new BottomNavigationBar(
//通过fixedColor设置选中item的颜色
fixedColor:Colors.red,
type: BottomNavigationBarType.fixed,
//当前页面索引
currentIndex: _currentIndex,
//按下后设置当前页面索引
onTap: ((index){
setState(() {
_currentIndex = index;
});
}),
//底部导航按钮项
items: [
//导航按钮项传入文本及图标
new BottomNavigationBarItem(
title: new Text(
'聊天',
style: TextStyle(
color: _currentIndex == ? Color(0xFFF54343) : Color(0xff999999) //0x 后面开始 两位FF表示透明度16进制 后面是颜色
),
),
//判断当然索引做图片切换显示
icon: _currentIndex ==
? Image.asset(
'images/nav-icon-index.active.png',
width: 32.0,
height: 32.0,
)
: Image.asset(
'images/nav-icon-index.png',
width: 32.0,
height: 32.0,
)
),
new BottomNavigationBarItem(
title: new Text(
'好友',
style: TextStyle(
color: _currentIndex == ? Color(0xFFF54343) : Color(0xff999999)
),
),
//判断当然索引做图片切换显示
icon: _currentIndex ==
? Image.asset(
'images/nav-icon-cat.active.png',
width: 32.0,
height: 32.0,
)
: Image.asset(
'images/nav-icon-cat.png',
width: 32.0,
height: 32.0,
)
),
new BottomNavigationBarItem(
title: new Text(
'我的',
style: TextStyle(
color: _currentIndex == ? Color(0xFFF54343) : Color(0xff999999)
),
),
//判断当然索引做图片切换显示
icon: _currentIndex ==
? Image.asset(
'images/nav-icon-user.active.png',
width: 32.0,
height: 32.0,
)
: Image.asset(
'images/nav-icon-user.png',
width: 32.0,
height: 32.0,
)
),
],
), //中间显示当前页面
body: currentPage(), );
}
}
新建三个dart文件,分别用于新建3个主体展示页面,这三个页面都是带一个appbar和body,appbar用于显示对应的导航标签,body里显示标签大图标。三个文件的写法基本是一致的。
import 'package:flutter/material.dart'; class Personal extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return new PersonalState();
}
} class PersonalState extends State<Personal>{
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('我的'),
),
body: new Center(
child: Icon(Icons.mood,size: 130.0,color: Colors.blue,),
),
);
}
}
另外一种实现方法,重新initState()
方法:
List<Widget> blist = List();
@override
void initState(){
blist
..add(HomePage())
..add(Contacts())
..add(Personal());
super.initState();
}
这里的..add()
是Dart语言的..语法,如果你学过编程模式,你一定听说过建造者模式,简单来说就是返回调用者本身。这里list后用了..add(),还会返回list,然后就一直使用..语法,能一直想list里增加widget元素。 最后我们调用了一些父类的initState()
方法。
完整代码:
import 'package:flutter/material.dart';
import './home.dart';
import './contacts.dart';
import './me.dart'; class MyApp extends StatefulWidget {
@override
MyAppState createState() => MyAppState();
} class MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('底部导航示例')),
body: BottomNavigationWidget(),
);
}
} class BottomNavigationWidget extends StatefulWidget { _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();
} class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {
final _BottomNavigationColor = Colors.red;
int _currentIndex = ;
List<Widget> blist = List(); @override
void initState(){
blist
..add(HomePage()) //建造者模式,简单来说就是返回调用者本身。这里blist后用了..add(),还会返回blist
..add(Contacts())
..add(Personal());
super.initState();
} @override
Widget build(BuildContext context) {
return Scaffold(
bottomNavigationBar:BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home,color: _BottomNavigationColor,),
title:Text('Hmoe',style: TextStyle(color: _BottomNavigationColor),)
),
BottomNavigationBarItem(
icon: Icon(Icons.email,color: _BottomNavigationColor,),
title:Text('Email',style: TextStyle(color: _BottomNavigationColor),)
),
BottomNavigationBarItem(
icon: Icon(Icons.pages,color: _BottomNavigationColor,),
title:Text('Pages',style: TextStyle(color: _BottomNavigationColor),)
),
],
currentIndex: _currentIndex, //当前页面索引,高亮
onTap: (int index){
setState(() {
_currentIndex = index;
});
},
) ,
body: blist[_currentIndex],
);
}
}
Flutter 底部导航栏bottomNavigationBar的更多相关文章
- Android------底部导航栏BottomNavigationBar
Android 的底部导航栏 BottomNavigationBar 由Google官方Material design中增加的. Android底部导航栏的实现方式特别多,例如TabHost,TabL ...
- Flutter - BottomNavigationBar底部导航栏切换后,状态丢失
如果你用过BottomNavigationBar.TabBar.还有Drawer,你就会发现,在切换页面之后,原来的页面状态就会丢失. 要是上一页有一个数据列表,很多数据,你滚动到了下头,切换页面后, ...
- Flutter——BottomNavigationBar组件(底部导航栏组件)
BottomNavigationBar常用的属性: 属性名 说明 items List<BottomNavigationBarItem> 底部导航条按钮集合 iconSize icon c ...
- 【Flutter学习】基本组件之BottomNavigationBar底部导航栏
一,概述 BottomNavigationBar即是底部导航栏控件,显示在页面底部的设计控件,用于在试图切换,底部导航栏包含多个标签.图标或者两者搭配的形式,简而言之提供了顶级视图之间的快速导航. 二 ...
- Flutter - 创建底部导航栏
之前写过的一篇文章介绍了 Flutter - 创建横跨所有页面的侧滑菜单, 这次就一起来学习一下底部导航栏. 底部导航栏在ios平台上非常常见,app store就是这样的风格.还有就是大家最常用的微 ...
- Flutter移动电商实战 --(4)打通底部导航栏
关于界面切换以及底栏的实现可参考之前写的一篇文章:Flutter实 ViewPager.bottomNavigationBar界面切换 1.新建4个基本dart文件 在pages目录下,我们新建下面四 ...
- Flutter移动电商实战 --(3)底部导航栏制作
1.cupertino_IOS风格介绍 在Flutter里是有两种内置风格的: material风格: Material Design 是由 Google 推出的全新设计语言,这种设计语言是为手机.平 ...
- 底部导航栏使用BottomNavigationBar
1.github地址 https://github.com/zhouxu88/BottomNavigationBar 2.基本使用 2,1添加依赖 implementation 'com.ashokv ...
- Flutter实战视频-移动电商-03.底部导航栏制作
03.底部导航栏制作 material是谷歌退出的 还有另外的一种:cupertino是IOS的风格 我们底部的导航栏,静态的widget是不合适的,这垃圾我们用到动态的widget 这重新改成动态的 ...
随机推荐
- web后端开发语言Java和PHP的比较
理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果,尽管Java的数学计算和数据库访问都有优势,架构也相当完美,但是PHP却可以简单轻松地支持高强度Web访问,能够快速开发应用,支持 ...
- Python+request 分模块存放接口,多接口共用参数URL、headers的抽离,添加日志打印等《三》
主要介绍内容如下: 1.分模块存放接口 2.多接口共用参数URL.headers的抽离为配置文件 3.添加日志打印 4.一个py文件运行所有所测的接口 如上介绍内容的作用: 1.分模块存放接口:方便多 ...
- 2019HDU多校第六场1009 Three Investigators——杨表
题意 给定一个 n 个元素的数列,从前 k 个元素中取5次不下降子序列,求取得的和的最大值(k从1至n) 分析 考虑将数字 a[i] 拆成 a[i] 个 a[i],比如 “4,1,2”→“4,4,4, ...
- MySQL GROUP BY 语句
GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...
- 一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483
思想启发来自, 罗博士的根据递推公式构造系数矩阵用于快速幂 对于矩阵乘法和矩阵快速幂就不多重复了,网上很多博客都有讲解.主要来学习一下系数矩阵的构造 一开始,最一般的矩阵快速幂,要斐波那契数列Fn=F ...
- kill函数
kill函数/命令产生信号 kill命令产生信号:kill -SIGKILL pid kill函数:给指定进程发送指定信号(不一定杀死) int kill(pid_t pid, int sig); ...
- JavaWeb_(Spring框架)整合Mybatis加入事务操作数据库
整合Mybatis a)导包: i.Spring:基本包.aop.aspects.jdbc.tx.test: ii.Mybatis:mybatis-3.4.6 iii.整合包:mybatis-spri ...
- SpringMVC--DispatcherServlet
DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...
- JAVA基础知识|堆和栈
一.java六个存储数据的地方 1)寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直 ...
- Python语法 - 推导式
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 列表推导式(list comprehension)最擅长的方式就是对整个列表分别做相同的操作,并且返回得到一个新的列 ...