Flutter底部导航栏美化插件sz_fancy_bottom_navigation的使用

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

Flutter底部导航栏美化插件sz_fancy_bottom_navigation的使用

FancyBottomNavigation

此插件基于tunitowen的fancy_bottom_navigation。

开始使用

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  ...
  sz_fancy_bottom_navigation: ^0.3.2

限制

目前该插件仅支持2到4个标签页。

基本用法

添加底部导航栏组件:

bottomNavigationBar: FancyBottomNavigation(
    tabs: [
        TabData(iconData: Icons.home, title: "Home"),
        TabData(iconData: Icons.search, title: "Search"),
        TabData(iconData: Icons.shopping_cart, title: "Basket")
    ],
    onTabChangedListener: (position) {
        setState(() {
        currentPage = position;
        });
    },
)

TabData

  • iconData -> 用于标签的图标
  • title -> 用于标签的字符串
  • onclick -> 当点击活动标签的圆圈时可选的回调函数

属性

必须属性

  • tabs -> TabData对象列表
  • onTabChangedListener -> 处理标签点击的函数,接收int position

可选属性

  • initialSelection -> 默认为0
  • circleColor -> 默认为null,从Theme中获取
  • activeIconColor -> 默认为null,从Theme中获取
  • inactiveIconColor -> 默认为null,从Theme中获取
  • textColor -> 默认为null,从Theme中获取
  • barBackgroundColor -> 默认为null,从Theme中获取
  • key -> 默认为null

主题化

该组件会尝试使用当前主题。你也可以自定义主题。

程序化选择

要程序化地选择一个标签页,你需要给组件分配一个GlobalKey。当你想改变标签页时,你需要通过这个键访问状态,并调用setPage(position)

请参见示例项目main.dart的第75行作为示例。

展示

如果你正在使用此插件在实际应用中,请告知我,我会将你的应用添加到这里。

启发灵感

该插件的设计灵感来源于Manoj Rajput在Dribbble上的设计: https://dribbble.com/shots/5419022-Tab

贡献

欢迎贡献,可以提交PR。


示例代码

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

import 'second_page.dart';

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

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  GlobalKey bottomNavigationKey = GlobalKey();

  late 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(
      appBar: AppBar(
        title: Text("Fancy Bottom Navigation"),
      ),
      body: PageView(
        controller: _pageController,
        children: [
          _getPage(0),
          _getPage(1),
          _getPage(2),
        ],
      ),
      bottomNavigationBar: FancyBottomNavigation(
          pageController: _pageController,
          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,
          hidden: false,
          gradient: LinearGradient(colors: [
            Color.fromRGBO(253, 110, 106, 1),
            Color.fromRGBO(255, 198, 0, 1)
          ])),
      drawer: Drawer(
        child: ListView(
          children: [Text("Hello"), Text("World")],
        ),
      ),
    );
  }

  _getPage(int page) {
    switch (page) {
      case 0:
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text("This is the home page"),
            MaterialButton(
              child: Text(
                "Start new page",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => SecondPage()));
              },
            ),
            MaterialButton(
              child: Text(
                "Change to page 3",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {
                final FancyBottomNavigationState fState = bottomNavigationKey
                    .currentState as FancyBottomNavigationState;
                fState.setPage(2);
              },
            )
          ],
        );
      case 1:
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text("This is the search page"),
            MaterialButton(
              child: Text(
                "Start new page",
                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: [
            Text("This is the basket page"),
            MaterialButton(
              child: Text(
                "Start new page",
                style: TextStyle(color: Colors.white),
              ),
              color: Theme.of(context).primaryColor,
              onPressed: () {},
            )
          ],
        );
    }
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter插件sz_fancy_bottom_navigation来美化底部导航栏的代码示例。这个插件允许你自定义底部导航栏的外观,包括颜色、图标和标签等。

首先,确保你已经在pubspec.yaml文件中添加了该插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sz_fancy_bottom_navigation: ^最新版本号  # 请替换为最新版本号

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

以下是一个完整的示例代码,展示了如何使用sz_fancy_bottom_navigation插件来创建一个美化的底部导航栏:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Bottom Navigation Demo',
      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> _widgetOptions = <Widget>[
    Text('Home'),
    Text('Search'),
    Text('Library'),
    Text('Profile'),
  ];

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bottom Navigation Bar Example'),
      ),
      body: Center(
        child: _widgetOptions.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: SZFancyBottomNavigation(
        currentIndex: _selectedIndex,
        onTabSelected: _onItemTapped,
        tabs: [
          SZFancyTabData(
            iconData: Icons.home,
            title: "Home",
            color: Colors.blue,
            inactiveColor: Colors.grey,
            iconSize: 24,
          ),
          SZFancyTabData(
            iconData: Icons.search,
            title: "Search",
            color: Colors.green,
            inactiveColor: Colors.grey,
            iconSize: 24,
          ),
          SZFancyTabData(
            iconData: Icons.library_books,
            title: "Library",
            color: Colors.amber,
            inactiveColor: Colors.grey,
            iconSize: 24,
          ),
          SZFancyTabData(
            iconData: Icons.person,
            title: "Profile",
            color: Colors.red,
            inactiveColor: Colors.grey,
            iconSize: 24,
          ),
        ],
        settings: SZFancyBottomNavigationSettings(
          backgroundColor: Colors.white,
          activeBackgroundColor: Colors.transparent,
          inactiveLabelStyle: TextStyle(fontSize: 10),
          activeLabelStyle: TextStyle(fontSize: 12, fontWeight: FontWeight.bold),
          labelPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
          borderRadius: 25,
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个底部导航栏。我们使用SZFancyBottomNavigation小部件来自定义导航栏的外观,并设置了不同的标签、图标颜色以及非激活状态下的颜色。此外,还调整了标签的字体大小和样式,并设置了背景颜色和圆角。

这个示例展示了如何使用sz_fancy_bottom_navigation插件来创建一个具有吸引力的底部导航栏。你可以根据自己的需求进一步调整这些设置。

回到顶部