简介
底部导航栏是我们日常开发中经常用到的导航工具,用于切换到不同的展示页,比如微信、支付宝、淘宝等大厂APP都是使用底部导航栏设计,此设计也符合用户的使用习惯,下面我们使用flutter
创建一个简单的底部工具栏。
示例
在fluuter开发中,万物皆是Wdiget
, flutter
官方提供的一个底部导航组件BottomNavigationBar
,我们就使用BottomNavigationBar
创建。
方式一
import 'package:flutter/material.dart'; |
说明:
以上代码有国际化示例部分,本博主比较懒,国际化的内容没删除,直接从工程里Copy出来的。
方式二
创建模块
home_page 首页
dialogue_page 对话
record_page 录音
mine_page 我的
在home_page.dart
内添加模块组件
import 'package:flutter/material.dart'; |
其他模块同上,具体模块的Scaffold
内容根据具体业务来实现,本文直接复制home_page.dart
的内容,略微修改Container
的颜色以区分模块。
创建组件控制dart
导入模块dart
import 'package:flutter/material.dart';
import 'pages/home_page.dart';
import 'pages/dialogue_page.dart';
import 'pages/record_page.dart';
import 'pages/mine_page.dart';添加底部导航按钮及点击控制
class IndexPage extends StatefulWidget {
_IndexPageState createState() => _IndexPageState();
}
class _IndexPageState extends State<IndexPage> {
// 底部导航按钮数组
final List<BottomNavigationBarItem> bottomTabs = [
BottomNavigationBarItem(
// 使用asset图片,也可以使用系统提供的图片,如Icons.home等
icon: Image.asset(
'images/home_unselected.png',
width: 18,
height: 18,
),
activeIcon: Image.asset(
'images/home_selected.png',
width: 18,
height: 18,
),
label: '首页'),
BottomNavigationBarItem(
icon: Image.asset(
'images/dialogue_unselected.png',
width: 18,
height: 18,
),
activeIcon: Image.asset(
'images/dialogue_selected.png',
width: 18,
height: 18,
),
label: '对话翻译'),
BottomNavigationBarItem(
icon: Image.asset(
'images/record_unselected.png',
width: 18,
height: 18,
),
activeIcon: Image.asset(
'images/record_selected.png',
width: 18,
height: 18,
),
label: '录音翻译'),
BottomNavigationBarItem(
icon: Image.asset(
'images/mine_unselected.png',
width: 18,
height: 18,
),
activeIcon: Image.asset(
'images/mine_selected.png',
width: 18,
height: 18,
),
label: '我的')
];
// 模块容器数组
final List tabPages = [HomePage(), DialoguePage(), RecordPage(), MinePage()];
// 当前选择index
int currentIndex = 0;
// 当前页
var currentPage;
void initState() {
currentPage = tabPages[currentIndex];
super.initState();
}
Widget build(BuildContext context) {
return Scaffold(
bottomNavigationBar: BottomNavigationBar(
currentIndex: currentIndex,
backgroundColor: Colors.lightGreen,
type: BottomNavigationBarType.fixed,
// elevation: 0,
items: bottomTabs,
onTap: (idx) {
// 必须实现setState方法
setState(() {
currentIndex = idx;
currentPage = tabPages[idx];
});
},
),
appBar: AppBar(
backgroundColor: Colors.lightGreen,
title: Text(
bottomTabs[currentIndex].label,
style: TextStyle(color: Colors.orange),
),
elevation: .5,
),
body: currentPage,
);
}
}
实现main.dart
import 'package:flutter/material.dart'; |
特殊效果
- 凸出效果
在我们平时开发过程中不一定都是这种规则的底部导航,有时需要我们做出一些特殊处理,比如中间的item单元凸出显示。
在这里我们可以通过Scaffold
中的floatingActionButton
属性来实现这个效果
|
外弧效果
在凸出效果代码基础上做修改,打开index_page.dart
,修改为以下代码,
注释掉凸出效果的State代码
class _OuterArcState extends State<IndexPage> { |
#Demo
个人博客: 🏡 ForgetSou