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 这重新改成动态的 ...
随机推荐
- CCPC 2016 杭州 E. Master of Subgraph(点分治+bitset优化DP)
题目链接:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 题意:给定一棵有 n 个结点的树和一个数 m,对于 i ∈ ...
- ES6模块
1. ES6模块是什么? ES6在语言层级上出现了“模块”的概念. javascript中一个文件就是一个模块,如果模块中使用了ES6的语法import或者export, 这个文件就是一个ES6模块. ...
- Oracle 后台进程(二)DBWR进程
一.DBWR进程介绍 DBWR进程执行将数据块缓冲区写入数据文件的工作,是负责缓冲存储管理的一个Oracle后台进程.在修改DB Cache中的某个缓冲区时,会将它标志为“DIRTY”,DBWR的主要 ...
- CF940F Machine Learning 带修改莫队
题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...
- [Luogu] 区间统计Tallest Cow
https://www.luogu.org/problemnew/show/P2879 差分 | 线段树 #include <iostream> #include <cstdio&g ...
- 【组合数学】OI内的排列与组合(简单版)
§1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...
- Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数
Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...
- 【概率论】4-3:方差(Variance)
title: [概率论]4-3:方差(Variance) categories: - Mathematic - Probability keywords: - Variance - Standard ...
- codeforces#1234F. Yet Another Substring Reverse(子集dp)
题目链接: https://codeforces.com/contest/1234/problem/F 题意: 给出一个只包含前20个小写字母的字符串,一次操作可以让一段字符颠倒顺序 最多一次这样的操 ...
- k8s之yaml详解
k8s之yaml详解 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数 ...