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 这重新改成动态的 ...
随机推荐
- java基础:多态过程中的动态绑定
重刷java-core的chapter05,P158 重读多态,感觉又不一样了. 记录一下对象方法执行过程: 1. 编译器查看对象声明类型和方法名,如class.fuction(param),cla ...
- Height、clientHeight、scrollHeight、offsetHeight 、scrollTop、offsetTop
Height 返回当前文档中的<body>元素的高度 clientHeight 对于没有定义CSS或者内联布局盒子的元素为0,否则,它是元素内部的高度(单位像素),包含内边距,但不包括水平 ...
- 部署kibana节点
部署Kibana节点 1.查看系统环境: [root@Kibana ~]# hostname Kibana [root@Kibana ~]# cat /etc/redhat-release CentO ...
- tableviewer自动调整列宽
public void resizeTableColumn(TableColumn[] treeColumns) { for (TableColumn tc : treeColumns) tc.pac ...
- Android Studio 3.5.2添加依赖库
因为要连接服务器的数据库,百度了一下经验,需要添加一些mysql库,看了一下经验,没有找到3.5.2版本的添加依赖库的教程. 因为新版本的androidstudio有一些不同,作以记录. 比如我们要添 ...
- Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))
就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...
- 解压 .tar.xz 格式的压缩文件
第一种方法: xz -d mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz tar -xvf mysql-8.0.16-linux-glibc2.12-x86_64 ...
- DisplayModeProvider完成移动开发自动视图解析
MVC中新建视图命名:XXX.cshtml.XXX.mobile.cshtml:用手机访问会自动到xxx.mobile.cshtml 一.原理 MVC中是通过DisplayModeProvider实现 ...
- UDP c/s 模型
server.c /* udp server.c */ #include <string.h> #include <netinet/in.h> #include <std ...
- pandas入门之DataFrame
创建DataFrame - DataFrame是一个[表格型]的数据结构.DataFrame由按一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行 ...