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

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

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

1. 插件介绍

fancy_bottom_navigation 是一个用于创建美观的底部导航栏的Flutter插件。它提供了丰富的自定义选项,可以轻松地集成到您的应用中。以下是该插件的一些关键特性和使用方法。

2. 使用步骤

2.1 添加依赖

首先,在 pubspec.yaml 文件中添加 fancy_bottom_navigation 依赖:

dependencies:
  fancy_bottom_navigation: ^0.3.2
2.2 基本用法

接下来,我们可以通过以下代码在应用中使用 FancyBottomNavigation 小部件。这里提供了一个完整的示例,展示了如何创建一个带有三个标签页的底部导航栏,并根据用户选择的标签页显示不同的页面内容。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.deepOrange,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int currentPage = 0;

  GlobalKey bottomNavigationKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Fancy Bottom Navigation"),
      ),
      body: Container(
        decoration: BoxDecoration(color: Colors.white),
        child: Center(
          child: _getPage(currentPage),
        ),
      ),
      bottomNavigationBar: FancyBottomNavigation(
        tabs: [
          TabData(
              iconData: Icons.home, 
              title: "Home", 
              onclick: () {
                final FancyBottomNavigationState fState = bottomNavigationKey.currentState as FancyBottomNavigationState;
                fState.setPage(2);
              }),
          TabData(
              iconData: Icons.search, 
              title: "Search", 
              onclick: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => SecondPage()))),
          TabData(iconData: Icons.shopping_cart, title: "Basket")
        ],
        initialSelection: 1,
        key: bottomNavigationKey,
        onTabChangedListener: (position) {
          setState(() {
            currentPage = position;
          });
        },
      ),
      drawer: Drawer(
        child: ListView(
          children: <Widget>[
            Text("Hello"),
            Text("World"),
          ],
        ),
      ),
    );
  }

  // 根据当前页面索引返回相应的页面内容
  Widget _getPage(int page) {
    switch (page) {
      case 0:
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("这是主页"),
            RaisedButton(
              child: Text(
                "开始新页面",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => SecondPage()));
              },
            ),
            RaisedButton(
              child: Text(
                "切换到第3页",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).accentColor,
              onPressed: () {
                final FancyBottomNavigationState fState = bottomNavigationKey.currentState as FancyBottomNavigationState;
                fState.setPage(2);
              },
            )
          ],
        );
      case 1:
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("这是搜索页"),
            RaisedButton(
              child: Text(
                "开始新页面",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => SecondPage()));
              },
            )
          ],
        );
      default:
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("这是购物车页"),
            RaisedButton(
              child: Text(
                "开始新页面",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {},
            )
          ],
        );
    }
  }
}

3. 关键属性说明

  • tabs:这是一个 List<TabData> 类型的属性,用于定义底部导航栏中的标签页。每个 TabData 对象包含图标 (iconData) 和标题 (title),还可以通过 onclick 属性为标签页添加点击事件。

  • onTabChangedListener:这是一个回调函数,当用户点击某个标签页时会触发。它接收一个整数参数 position,表示当前选中的标签页索引。

  • initialSelection:用于设置默认选中的标签页索引,默认值为 0

  • circleColoractiveIconColorinactiveIconColortextColorbarBackgroundColor:这些属性用于自定义底部导航栏的样式,例如图标颜色、文本颜色、背景颜色等。如果不指定这些属性,插件会从当前主题中获取默认值。

  • key:用于程序化控制标签页的选择。通过 GlobalKey 可以访问 FancyBottomNavigation 的状态,并调用 setPage(position) 方法来切换标签页。

4. 自定义样式

FancyBottomNavigation 支持自定义样式,您可以根据应用的主题或需求调整导航栏的外观。插件会自动尝试使用当前主题的颜色和样式,但您也可以通过上述属性进行进一步的自定义。

5. 程序化选择标签页

如果您需要在代码中动态切换标签页,可以通过 GlobalKey 获取 FancyBottomNavigation 的状态,并调用 setPage(position) 方法。例如:

final FancyBottomNavigationState fState = bottomNavigationKey.currentState as FancyBottomNavigationState;
fState.setPage(2);  // 切换到第3个标签页

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

1 回复

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


当然,以下是如何在Flutter项目中使用fancy_bottom_navigation_2插件来实现底部导航栏的一个示例代码。这个插件提供了丰富的自定义选项,使底部导航栏更具吸引力和功能性。

首先,你需要在你的pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  fancy_bottom_navigation_2: ^0.6.0  # 请检查最新版本号

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

接下来,你可以在你的主dart文件中使用FancyBottomNavigation来创建一个底部导航栏。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _selectedIndex = 0;
  final List<TabData> _tabs = [
    TabData(iconData: Icons.home, title: "Home"),
    TabData(iconData: Icons.search, title: "Search"),
    TabData(iconData: Icons.add, title: "Add"),
    TabData(iconData: Icons.account_circle, title: "Profile"),
  ];

  void _onTabSelected(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fancy Bottom Navigation Demo'),
      ),
      body: Center(
        child: Text('You are on tab: ${_tabs[_selectedIndex].title}'),
      ),
      bottomNavigationBar: FancyBottomNavigation(
        tabs: _tabs,
        initialSelection: _selectedIndex,
        onTabChangedListener: _onTabSelected,
        settings: BehaviorSettings(
          animationDuration: Duration(milliseconds: 300),
          // You can customize other settings here
        ),
        borderRadius: BorderRadius.circular(30),
        backgroundColor: Colors.white,
        activeColor: Colors.blue,
        inactiveColor: Colors.grey,
        // Add more customization options as needed
      ),
    );
  }
}

class TabData {
  final IconData iconData;
  final String title;

  TabData({required this.iconData, required this.title});
}

代码解释

  1. 依赖导入:首先导入fancy_bottom_navigation_2包。
  2. TabData 类:定义了一个简单的TabData类来存储每个标签的图标数据和标题。
  3. MyHomePage 类:这是我们的主页面,它包含了一个状态变量_selectedIndex来跟踪当前选中的标签,以及一个标签列表_tabs
  4. _onTabSelected 方法:这个方法会在标签被点击时被调用,用来更新_selectedIndex
  5. FancyBottomNavigation:在ScaffoldbottomNavigationBar属性中使用FancyBottomNavigation,并传入标签列表、初始选中的标签索引、标签点击监听器和其他设置。

这个示例展示了如何使用fancy_bottom_navigation_2插件创建一个简单的底部导航栏,并处理标签之间的切换。你可以根据需要进一步自定义导航栏的样式和行为。

回到顶部