Flutter水滴导航栏插件water_drop_nav_bar的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter水滴导航栏插件water_drop_nav_bar的使用

插件简介

Water Drop Nav Bar

YouTube Badge Twitter Badge Patreon Badge pub package WateryDesert

设计来源 & 屏幕录制

设计灵感来源于 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()backgroundColorwaterDropColor 必须与 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 以更改该黑色导航栏的颜色为 WaterDropNavBarbackgroundColor。例如:

return AnnotatedRegion<SystemUiOverlayStyle>(
  value: const SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.white, 
    systemNavigationBarIconBrightness: Brightness.dark,
  ),
  child: Scaffold(
    // code here
  )
);

iPhone 问题

没有滑动手势的 iPhone 可能会出现图标被推到下方的问题。可以提供一些 bottomPadding。例如:

bottomPadding: 8.0,

FAQ

如何更改高度?

高度必须保持不变,因为动画是垂直方向的。根据我的经验,60 是完美的。如果你觉得需要减少,请创建一个带有截图的问题,我会看看是否可以做些什么。

如何添加阴影?

可以使用 DecoratedBoxContainer 包裹 WaterDropNavBar 并传递 BoxDecorationdecoration 属性中添加阴影。例如:

DecoratedBox(
  decoration: BoxDecoration(
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.2),
        offset: Offset(0, 4),
        blurRadius: 8.0
      )
    ],
  ),
  child: WaterDropNavBar()
)

如何更改导航栏的圆角半径?

可以使用 ClipRRect 包裹 WaterDropNavBar 并传递 BorderRadiusborderRadius 属性中更改圆角半径。例如:

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

1 回复

更多关于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],
    );
  }
}

在这个示例中:

  1. 我们首先导入了water_drop_nav_bar包。
  2. 创建了一个MyAppMyHomePage小部件,其中MyHomePage是一个状态小部件,用于处理页面切换。
  3. MyHomePagebuild方法中,我们构建了一个Scaffold,其中包含一个WaterDropNavBar作为底部导航栏,以及一个根据当前索引动态变化的body
  4. WaterDropNavBar的参数包括:
    • currentIndex:当前选中的索引。
    • onTap:点击事件处理函数,用于更新选中的索引。
    • items:一个包含导航项的列表,每个项包括图标和标题。
    • 其他参数如itemBackgroundColoritemActiveColoritemInactiveColordotColordotActiveColordotSizedotOffset用于自定义导航栏的外观。

你可以根据实际需求调整这些参数来定制你的水滴导航栏。

回到顶部