Flutter底部导航栏插件sliding_clipped_nav_bar的使用

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

Flutter底部导航栏插件sliding_clipped_nav_bar的使用

插件简介

sliding_clipped_nav_bar 是一个用于Flutter应用程序的底部导航栏插件,它提供了滑动效果和剪切动画,使导航栏看起来更加美观和现代。以下是该插件的一些关键特性:

  • 滑动动画:当用户选择不同的导航项时,导航栏会有一个平滑的滑动动画。
  • 剪切效果:选中的导航项会有剪切效果,使其从其他项中脱颖而出。
  • 自定义颜色:支持全局或单个项的颜色设置。
  • 易于集成:只需几行代码即可将其集成到您的Flutter项目中。

Sliding Clipped Nav Bar

如何使用?

1. 添加依赖

pubspec.yaml 文件中添加 sliding_clipped_nav_bar 依赖:

dependencies:
  sliding_clipped_nav_bar: ^latest_version # 替换为最新版本号

或者从Git仓库获取最新版本(实验性):

dependencies:
  sliding_clipped_nav_bar:
    git:
      url: https://github.com/watery-desert/sliding_clipped_nav_bar  

然后运行 flutter pub get 来安装依赖。

2. 导入包

在 Dart 文件中导入插件:

import 'package:sliding_clipped_nav_bar/sliding_clipped_nav_bar.dart';

3. 使用示例

以下是一个完整的示例,展示了如何在Flutter应用中使用 sliding_clipped_nav_bar 插件:

import 'package:flutter/material.dart';
import 'package:sliding_clipped_nav_bar/sliding_clipped_nav_bar.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        canvasColor: Color.fromARGB(255, 232, 234, 222),
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late PageController _pageController;
  int selectedIndex = 0;
  bool _colorful = false;

  @override
  void initState() {
    super.initState();
    _pageController = PageController(initialPage: selectedIndex);
  }

  void onButtonPressed(int index) {
    setState(() {
      selectedIndex = index;
    });
    _pageController.animateToPage(selectedIndex,
        duration: const Duration(milliseconds: 400), curve: Curves.easeOutQuad);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          SafeArea(
              child: SwitchListTile(
            title: const Text('Colorful Nav bar'),
            value: _colorful,
            onChanged: (bool value) {
              setState(() {
                _colorful = !_colorful;
              });
            },
          )),
          Expanded(
            child: PageView(
              physics: const NeverScrollableScrollPhysics(),
              controller: _pageController,
              children: _listOfWidget,
            ),
          ),
        ],
      ),
      bottomNavigationBar: _colorful
          ? SlidingClippedNavBar.colorful(
              backgroundColor: Colors.white,
              onButtonPressed: onButtonPressed,
              iconSize: 30,
              selectedIndex: selectedIndex,
              barItems: <BarItem>[
                BarItem(
                  icon: Icons.event,
                  title: 'Events',
                  activeColor: Colors.blue,
                  inactiveColor: Colors.orange,
                ),
                BarItem(
                  icon: Icons.search_rounded,
                  title: 'Search',
                  activeColor: Colors.yellow,
                  inactiveColor: Colors.green,
                ),
                BarItem(
                  icon: Icons.bolt_rounded,
                  title: 'Energy',
                  activeColor: Colors.blue,
                  inactiveColor: Colors.red,
                ),
                BarItem(
                  icon: Icons.tune_rounded,
                  title: 'Settings',
                  activeColor: Colors.cyan,
                  inactiveColor: Colors.purple,
                ),
              ],
            )
          : SlidingClippedNavBar(
              backgroundColor: Colors.white,
              onButtonPressed: onButtonPressed,
              iconSize: 30,
              activeColor: const Color(0xFF01579B),
              selectedIndex: selectedIndex,
              barItems: <BarItem>[
                BarItem(
                  icon: Icons.event,
                  title: 'Events',
                ),
                BarItem(
                  icon: Icons.search_rounded,
                  title: 'Search',
                ),
                BarItem(
                  icon: Icons.bolt_rounded,
                  title: 'Energy',
                ),
                BarItem(
                  icon: Icons.tune_rounded,
                  title: 'Settings',
                ),
              ],
            ),
    );
  }
}

// icon size:24 for fontAwesomeIcons
// icons size: 30 for MaterialIcons

List<Widget> _listOfWidget = <Widget>[
  Container(
    alignment: Alignment.center,
    child: const Icon(
      Icons.event,
      size: 56,
      color: Colors.brown,
    ),
  ),
  Container(
    alignment: Alignment.center,
    child: const Icon(
      Icons.search,
      size: 56,
      color: Colors.brown,
    ),
  ),
  Container(
    alignment: Alignment.center,
    child: const Icon(
      Icons.bolt,
      size: 56,
      color: Colors.brown,
    ),
  ),
  Container(
    alignment: Alignment.center,
    child: const Icon(
      Icons.tune_rounded,
      size: 56,
      color: Colors.brown,
    ),
  ),
];

4. API参考

以下是 SlidingClippedNavBar 的主要API参数:

参数名 类型 描述
barItems List<BarItem> 导航栏项列表,最少2项,最多4项
selectedIndex int 当前选中的索引
iconSize double 图标大小,默认30
fontSize double 文本字体大小,默认16
fontWeight FontWeight 文本字体粗细,默认FontWeight.bold
fontStyle FontStyle 文本字体样式,默认null
activeColor Color 选中项的颜色
inactiveColor Color? 非选中项的颜色,默认null
onButtonPressed OnButtonPressCallback 点击导航项时的回调
backgroundColor Color 导航栏背景色,默认白色

5. FAQ

如何更改高度?

高度必须保持恒定,因为动画是垂直方向的。根据设计,60是理想的高度。如果您认为需要调整,请创建一个问题并附上截图。

如何添加阴影?

可以使用 DecoratedBoxContainer 包裹 SlidingClippedNavBar 并设置 boxShadow 属性:

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

如何更改导航栏的圆角?

可以使用 ClipRRect 包裹 SlidingClippedNavBar 并设置 borderRadius 属性:

ClipRRect(
  borderRadius: const BorderRadius.vertical(
    top: Radius.circular(16),
  ),
  child: SlidingClippedNavBar(),
)

通过以上步骤,您可以在Flutter应用中轻松实现带有滑动和剪切效果的底部导航栏。希望这些信息对您有所帮助!


更多关于Flutter底部导航栏插件sliding_clipped_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter底部导航栏插件sliding_clipped_nav_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用sliding_clipped_nav_bar插件来创建底部导航栏的示例代码。这个插件允许你创建一个具有滑动动画效果的底部导航栏。

首先,确保你已经将sliding_clipped_nav_bar添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  sliding_clipped_nav_bar: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用SlidingClippedNavBar来创建底部导航栏。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:sliding_clipped_nav_bar/sliding_clipped_nav_bar.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sliding Clipped 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 _currentIndex = 0;
  final List<Widget> _children = [
    Center(child: Text('Home')),
    Center(child: Text('Search')),
    Center(child: Text('Profile')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _children[_currentIndex],
      bottomNavigationBar: SlidingClippedNavBar(
        items: [
          SlidingClippedNavBarItem(
            icon: Icons.home,
            title: 'Home',
          ),
          SlidingClippedNavBarItem(
            icon: Icons.search,
            title: 'Search',
          ),
          SlidingClippedNavBarItem(
            icon: Icons.person,
            title: 'Profile',
          ),
        ],
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        backgroundColor: Colors.white,
        borderRadius: BorderRadius.circular(16),
        elevation: 8,
        activeColor: Colors.blue,
        inactiveColor: Colors.grey,
        labelStyle: TextStyle(fontSize: 12),
        iconSize: 24,
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个底部导航栏。SlidingClippedNavBar用于实现具有滑动动画效果的底部导航栏。我们定义了三个导航项:Home、Search和Profile。当用户点击不同的导航项时,_currentIndex会更新,并且body部分会显示相应的内容。

你可以根据需要自定义SlidingClippedNavBar的样式,例如更改backgroundColoractiveColorinactiveColorborderRadiuselevation等属性。

希望这个示例代码能帮助你更好地理解和使用sliding_clipped_nav_bar插件!

回到顶部