Flutter水滴导航栏插件water_drop_nav_bar的使用
Flutter水滴导航栏插件water_drop_nav_bar的使用
插件简介
设计来源 & 屏幕录制
设计灵感来源于 Cuberto 的 Animated Tabbar。
使用方法
安装
在 pubspec.yaml
文件中添加依赖项,然后运行 flutter pub get
:
dependencies:
water_drop_nav_bar:
导入
在 Dart 文件中导入包:
import 'package:water_drop_nav_bar/water_drop_nav_bar.dart';
将 WaterDropNavBar()
作为 Scaffold()
的 bottomNavigationBar
,并设置 body
为带有 NeverScrollableScrollPhysics()
的 PageView()
。不要尝试通过 onPageChanged
更新选定索引,否则可能会出现一些奇怪的行为。也可以使用 Stack()
或 AnimatedSwitcher 来实现自定义页面过渡动画。
API 参考
API 参考
- **barItems** → `List<BarItem>`:水平显示的条目列表,最少2个最多4个。必填 - **onItemSelected** → `OnButtonPressCallback`:当单个条目被点击时的回调。必填 - **selectedIndex** → `int`:当前选中的条目索引。必填 - **backgroundColor** → `Color`:背景颜色,默认为白色。可选 - **waterDropColor** → `Color`:水滴颜色,也是激活图标的颜色,默认为 `Color(0xFF5B75F0)`。可选 - **inactiveIconColor** → `Color`:未激活图标颜色,默认与水滴颜色相同。可选 - **iconSize** → `double`:每个激活和未激活图标的大小,默认值为28。可选 - **bottomPadding** → `double`:底部额外的填充,默认使用 `MediaQuery.of(context).padding.bottom` 的值。可选
注意事项
- 不要使图标尺寸过大。
- 使用互补的填充和轮廓图标以获得最佳效果。
WaterDropNavBar()
的backgroundColor
和waterDropColor
必须与Scaffold()
的backgroundColor
(或你使用的任何小部件)不同(参见示例应用程序)。这将可视化水滴悬挂在顶部的效果。
示例代码
return Scaffold(
body: PageView(
physics: NeverScrollableScrollPhysics(),
controller: pageController,
children: [
Container(
alignment: Alignment.center,
child: Icon(
Icons.bookmark_rounded,
size: 56,
color: Colors.amber[400],
),
),
Container(
alignment: Alignment.center,
child: Icon(
Icons.favorite_rounded,
size: 56,
color: Colors.red[400],
),
),
Container(
alignment: Alignment.center,
child: Icon(
Icons.email_rounded,
size: 56,
color: Colors.green[400],
),
),
Container(
alignment: Alignment.center,
child: Icon(
Icons.folder_rounded,
size: 56,
color: Colors.blue[400],
),
),
],
),
bottomNavigationBar: WaterDropNavBar(
backgroundColor: Colors.white,
onItemSelected: (index) {
setState(() {
selectedIndex = index;
});
pageController.animateToPage(selectedIndex,
duration: const Duration(milliseconds: 400),
curve: Curves.easeOutQuad);
},
selectedIndex: selectedIndex,
barItems: [
BarItem(
filledIcon: Icons.bookmark_rounded,
outlinedIcon: Icons.bookmark_border_rounded,
),
BarItem(
filledIcon: Icons.favorite_rounded,
outlinedIcon: Icons.favorite_border_rounded),
BarItem(
filledIcon: Icons.email_rounded,
outlinedIcon: Icons.email_outlined,
),
BarItem(
filledIcon: Icons.folder_rounded,
outlinedIcon: Icons.folder_outlined,
),
],
),
);
解决问题
Android 问题
某些安卓手机可能会有黑色导航栏,看起来不好看。建议使用 AnnotatedRegion<SystemUiOverlayStyle>
包裹 Scaffold
以更改该黑色导航栏的颜色为 WaterDropNavBar
的 backgroundColor
。例如:
return AnnotatedRegion<SystemUiOverlayStyle>(
value: const SystemUiOverlayStyle(
systemNavigationBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.dark,
),
child: Scaffold(
// code here
)
);
iPhone 问题
没有滑动手势的 iPhone 可能会出现图标被推到下方的问题。可以提供一些 bottomPadding
。例如:
bottomPadding: 8.0,
FAQ
如何更改高度?
高度必须保持不变,因为动画是垂直方向的。根据我的经验,60 是完美的。如果你觉得需要减少,请创建一个带有截图的问题,我会看看是否可以做些什么。
如何添加阴影?
可以使用 DecoratedBox
或 Container
包裹 WaterDropNavBar
并传递 BoxDecoration
到 decoration
属性中添加阴影。例如:
DecoratedBox(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.2),
offset: Offset(0, 4),
blurRadius: 8.0
)
],
),
child: WaterDropNavBar()
)
如何更改导航栏的圆角半径?
可以使用 ClipRRect
包裹 WaterDropNavBar
并传递 BorderRadius
到 borderRadius
属性中更改圆角半径。例如:
ClipRRect(
borderRadius: const BorderRadius.vertical(
top: Radius.circular(16),
),
child: WaterDropNavBar()
)
希望这些信息能帮助你在 Flutter 项目中成功使用 water_drop_nav_bar
插件!如果有更多问题,请随时提问。
更多关于Flutter水滴导航栏插件water_drop_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter水滴导航栏插件water_drop_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用water_drop_nav_bar
插件的一个基本示例。这个插件允许你创建一个水滴形状的导航栏,通常用于模仿某些应用的底部导航风格。
首先,确保你已经在pubspec.yaml
文件中添加了water_drop_nav_bar
依赖:
dependencies:
flutter:
sdk: flutter
water_drop_nav_bar: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来获取依赖。
接下来,你可以在你的Flutter项目中使用这个插件。以下是一个完整的示例代码,展示了如何设置和使用water_drop_nav_bar
:
import 'package:flutter/material.dart';
import 'package:water_drop_nav_bar/water_drop_nav_bar.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Water Drop Nav Bar Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
int _selectedIndex = 0;
final List<Widget> _pages = [
Center(child: Text('Home Page')),
Center(child: Text('Search Page')),
Center(child: Text('Profile Page')),
];
@override
Widget build(BuildContext context) {
return Scaffold(
bottomNavigationBar: WaterDropNavBar(
currentIndex: _selectedIndex,
onTap: (index) {
setState(() {
_selectedIndex = index;
});
},
items: [
WaterDropNavBarItem(
icon: Icons.home,
title: 'Home',
),
WaterDropNavBarItem(
icon: Icons.search,
title: 'Search',
),
WaterDropNavBarItem(
icon: Icons.person,
title: 'Profile',
),
],
itemBackgroundColor: Colors.white,
itemActiveColor: Colors.blue,
itemInactiveColor: Colors.grey,
dotColor: Colors.blue,
dotActiveColor: Colors.red,
dotSize: 10.0,
dotOffset: Offset(0, 6),
),
body: _pages[_selectedIndex],
);
}
}
在这个示例中:
- 我们首先导入了
water_drop_nav_bar
包。 - 创建了一个
MyApp
和MyHomePage
小部件,其中MyHomePage
是一个状态小部件,用于处理页面切换。 - 在
MyHomePage
的build
方法中,我们构建了一个Scaffold
,其中包含一个WaterDropNavBar
作为底部导航栏,以及一个根据当前索引动态变化的body
。 WaterDropNavBar
的参数包括:currentIndex
:当前选中的索引。onTap
:点击事件处理函数,用于更新选中的索引。items
:一个包含导航项的列表,每个项包括图标和标题。- 其他参数如
itemBackgroundColor
、itemActiveColor
、itemInactiveColor
、dotColor
、dotActiveColor
、dotSize
和dotOffset
用于自定义导航栏的外观。
你可以根据实际需求调整这些参数来定制你的水滴导航栏。