Flutter底部导航栏插件botton_nav_bar的使用
Flutter底部导航栏插件botton_nav_bar的使用
概述
botton_nav_bar
库是一个自定义实现的 Flutter 底部导航栏。该库提供了一个可定制的底部导航栏小部件,允许用户在应用程序的不同屏幕之间进行导航。它设计灵活,可以适应任何应用的设计。
botton_nav_bar
库包含两个主要类:
-
BottomBarItem
: 一个表示底部导航栏单个项目的模型类。BottomBarItem
类具有多个参数,包括当项目被选中时要显示的屏幕、未选中时要显示的图标、选中时要显示的图标以及要为项目显示的标签。 -
BottomNavBar
: 一个表示底部导航栏的状态小部件。BottomNavBar
小部件接受一个BottomBarItem
对象列表作为输入,并将它们显示为一行项目。该小部件还包括一个可以自定义图标的浮动操作按钮。
BottomNavBar
小部件允许用户自定义底部导航栏的多个方面,包括图标的大小和颜色、浮动操作按钮的位置以及项目标签的字体粗细。
BottomBarItem 参数
BottomBarItem
类具有以下参数:
BottomBarItem({
required Widget screen,
required Widget icon,
required String label,
required IconData selectedIcon,
Color bottomItemSelectedColor = Colors.blue,
Color bottomItemUnSelectedColor = Colors.grey,
double bottomNavItemSelectedIconSize = 24,
double bottomNavItemunSelectedIconSize = 24,
double bottomNavItemSelectedLabelSize = 12,
double bottomNavItemunSelectedLabelSize = 12,
double bottomNavItemLabelHeight = 30,
double bottomNavItemIconHeight = 24,
double bottomNavItemHeight = 60,
FontWeight bottomItemLabelFontWeight = FontWeight.bold,
})
screen
: 当此项目被选中时应显示的屏幕。icon
: 此项目的未选中图标。label
: 要在此项目下方显示的标签。selectedIcon
: 该项目选中时的图标。bottomItemSelectedColor
: 选中项目在底部导航栏中的颜色。bottomItemUnSelectedColor
: 未选中项目在底部导航栏中的颜色。bottomNavItemSelectedIconSize
: 底部导航栏项目选中时图标的大小。bottomNavItemunSelectedIconSize
: 底部导航栏项目未选中时图标的大小。bottomNavItemSelectedLabelSize
: 底部导航栏项目选中时标签的字体大小。bottomNavItemunSelectedLabelSize
: 底部导航栏项目未选中时标签的字体大小。bottomNavItemLabelHeight
: 底部导航栏项目标签的高度。bottomNavItemIconHeight
: 底部导航栏项目图标的高度。bottomNavItemHeight
: 底部导航栏项目的高度。bottomItemLabelFontWeight
: 底部导航栏项目标签的字体粗细。
特性
- 可自定义的底部导航栏。
- 支持浮动操作按钮。
- 易于实现。
- 带有演示应用。
开始使用
在 pubspec.yaml
文件中添加依赖项:
dependencies:
botton_nav_bar: ^1.0.1
然后运行 flutter pub get
来安装依赖项。
示例代码
不带凹槽的底部导航栏
import 'package:flutter/material.dart';
import 'package:bottom_navy_bar/bottom_navy_bar.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _currentIndex = 0;
PageController _pageController;
[@override](/user/override)
void initState() {
super.initState();
_pageController = PageController();
}
[@override](/user/override)
void dispose() {
_pageController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<Widget>(
future: _getScreen(_currentIndex),
builder: (context, snapshot) {
if (snapshot.hasData) {
return snapshot.data;
} else {
return Center(child: CircularProgressIndicator());
}
},
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
onTap: (index) {
setState(() {
_currentIndex = index;
_pageController.animateToPage(index, duration: Duration(milliseconds: 300), curve: Curves.ease);
});
},
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
label: 'Search',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
),
],
),
);
}
Future<Widget> _getScreen(int index) async {
switch (index) {
case 0:
return Text('Home Screen');
case 1:
return Text('Search Screen');
case 2:
return Text('Profile Screen');
default:
return Text('Home Screen');
}
}
}
带凹槽的底部导航栏
import 'package:flutter/material.dart';
import 'package:bottom_navy_bar/bottom_navy_bar.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _currentIndex = 0;
PageController _pageController;
[@override](/user/override)
void initState() {
super.initState();
_pageController = PageController();
}
[@override](/user/override)
void dispose() {
_pageController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<Widget>(
future: _getScreen(_currentIndex),
builder: (context, snapshot) {
if (snapshot.hasData) {
return snapshot.data;
} else {
return Center(child: CircularProgressIndicator());
}
},
),
bottomNavigationBar: BottomNavBar(
fabChild: Text(
'scan',
style: TextStyle(color: Colors.amber),
),
notchedRadius: 30,
centerNotched: true,
fabIcon: Icon(Icons.qr_code),
bottomItems: [
BottomBarItem(
bottomItemSelectedColor: Colors.green,
label: 'Screen 1',
screen: Center(child: Text('A')),
selectedIcon: Icons.collections_bookmark_outlined,
),
BottomBarItem(
bottomItemSelectedColor: Colors.green,
label: 'Screen 2',
screen: Center(child: Text('B')),
selectedIcon: Icons.search_rounded,
),
BottomBarItem(
bottomItemSelectedColor: Colors.green,
label: 'Screen 3',
selectedIcon: Icons.menu_open_rounded,
screen: Center(child: Text('C')),
),
BottomBarItem(
bottomItemSelectedColor: Colors.green,
label: 'Screen 4',
screen: Center(child: Text('D')),
selectedIcon: Icons.notifications_active,
)
],
),
);
}
Future<Widget> _getScreen(int index) async {
switch (index) {
case 0:
return Text('Screen 1');
case 1:
return Text('Screen 2');
case 2:
return Text('Screen 3');
case 3:
return Text('Screen 4');
default:
return Text('Screen 1');
}
}
}
更多关于Flutter底部导航栏插件botton_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter底部导航栏插件botton_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用bottom_nav_bar
插件实现底部导航栏的代码示例。需要注意的是,bottom_nav_bar
并不是Flutter官方提供的widget,而是一个第三方包。通常,Flutter开发者会使用BottomNavigationBar
来实现底部导航功能。不过,假设你提到的bottom_nav_bar
是一个第三方包(实际中请确保该包存在并正确安装),下面是一个假设性的示例,展示如何使用一个类似的第三方包来创建底部导航栏。
首先,确保你已经在pubspec.yaml
文件中添加了该第三方包(这里以假设的包名bottom_nav_bar
为例):
dependencies:
flutter:
sdk: flutter
bottom_nav_bar: ^x.y.z # 替换为实际版本号
然后,运行flutter pub get
来安装该包。
接下来,是一个使用假设的bottom_nav_bar
包的示例代码:
import 'package:flutter/material.dart';
import 'package:bottom_nav_bar/bottom_nav_bar.dart'; // 假设的包导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Bottom Nav Bar Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BottomNavDemo(),
);
}
}
class BottomNavDemo extends StatefulWidget {
@override
_BottomNavDemoState createState() => _BottomNavDemoState();
}
class _BottomNavDemoState extends State<BottomNavDemo> {
int _currentIndex = 0;
final List<Widget> _pages = [
HomeScreen(),
SearchScreen(),
ProfileScreen(),
];
void _onItemTapped(int index) {
setState(() {
_currentIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bottom Navigation Bar Demo'),
),
body: _pages[_currentIndex],
bottomNavigationBar: BottomNavBar( // 假设的BottomNavBar使用
items: [
BottomNavBarItem(
icon: Icon(Icons.home),
title: Text('Home'),
),
BottomNavBarItem(
icon: Icon(Icons.search),
title: Text('Search'),
),
BottomNavBarItem(
icon: Icon(Icons.person),
title: Text('Profile'),
),
],
currentIndex: _currentIndex,
onItemSelected: _onItemTapped,
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Home Screen'),
);
}
}
class SearchScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Search Screen'),
);
}
}
class ProfileScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Profile Screen'),
);
}
}
注意:上面的代码示例是基于一个假设的bottom_nav_bar
包的结构编写的。实际上,Flutter中更常用的是官方的BottomNavigationBar
。如果你实际上是想使用官方的BottomNavigationBar
,代码会略有不同,如下所示:
// ... 省略了部分代码,与上面相同 ...
class _BottomNavDemoState extends State<BottomNavDemo> {
int _currentIndex = 0;
final List<Widget> _pages = [
HomeScreen(),
SearchScreen(),
ProfileScreen(),
];
void _onItemTapped(int index) {
setState(() {
_currentIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bottom Navigation Bar Demo'),
),
body: _pages[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
label: 'Search',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
),
],
currentIndex: _currentIndex,
onTap: _onItemTapped,
),
);
}
}
// ... 省略了部分代码,与上面相同 ...
使用官方的BottomNavigationBar
是更推荐的做法,因为它得到了Flutter社区的广泛支持和维护。如果你确实需要使用一个第三方包,请确保该包是活跃维护的,并且查看其文档以获取正确的使用方法。