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

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

button_navigation_bar 是一个提供替代默认菜单栏样式的导航栏小部件。实现简单,并且可以自定义样式。

使用

当使用此小部件作为导航栏时,可以通过 Scaffold()floatingactionbutton 属性来定位该小部件,如以下两个示例所示。

示例截图

Floating Navbar Docked Navbar Expandable Demo
Floating Navbar Docked Navbar Expandable Demo

对于基本的导航栏,可以在 floatingActionButton: 属性中放置一个 ButtonNavigationBar,并填充一个或多个 ButtonNavigationItem

return Scaffold(
     appBar: appBar(context),
     body: body(context),
     floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
     floatingActionButton: ButtonNavigationBar(
       borderRadius: BorderRadius.all(Radius.circular(10)),
       children: [
         ButtonNavigationItem(
             icon: Icon(Icons.map_outlined),
             onPressed: () {
               Navigator.push(
                   context,
                   MaterialPageRoute(
                       builder: (BuildContext context) => SubPageOne()));
             }),
         ButtonNavigationItem(
             icon: Icon(Icons.add),
             label: "Add a card",
             width: 140,
             onPressed: () {
               setState(() {
                 cardCounter++;
               });
             }),
         ButtonNavigationItem(
             icon: Icon(Icons.search),
             onPressed: () {
               Navigator.push(
                   context,
                   MaterialPageRoute(
                       builder: (BuildContext context) => SubPageTwo()));
             }),
       ],
     ),
);

更多高级代码片段(例如上面显示的两个导航栏)可以在 这里 查看。

贡献到这个插件

这个插件仍处于开发的早期阶段,因此任何形式的插件开发、示例或测试的贡献都受到欢迎。有关更多信息,请参阅我们的 GitHub

完整示例代码

import 'package:button_navigation_bar/button_navigation_bar.dart';
import 'package:button_navigation_bar/button_navigation_expandable.dart';
import 'package:example/card_service.dart';
import 'package:example/sub_pages/subpage1.dart';
import 'package:example/sub_pages/subpage2.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Button Nav Bar Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: MyHomePage(title: 'Demo App'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int example = 1;
  int cardCounter = 2;

  [@override](/user/override)
  Widget build(BuildContext context) {
    switch (example) {
      case 1:
        return example1(context);
      case 2:
        return example2(context);
      default:
        throw "Example nr. $example is not implemented";
    }
  }

  Scaffold example1(BuildContext context) {
    return Scaffold(
      appBar: appBar(context),
      body: body(context),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      floatingActionButton: ButtonNavigationBar(
        borderRadius: BorderRadius.only(
            topRight: Radius.circular(10), topLeft: Radius.circular(10)),
        children: [
          ButtonNavigationItem(
              icon: Icon(Icons.map_outlined),
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (BuildContext context) => SubPageOne()));
              }),
          ButtonNavigationItem(
              icon: Icon(Icons.add),
              onPressed: () {
                setState(() {
                  cardCounter++;
                });
              }),
          ButtonNavigationItem.expandable(
              expandableSpacing: 48.0,
              verticalOffset: 56.0,
              icon: Icon(Icons.expand_less),
              collapseButton: ButtonNavigationItem(
                  onPressed: () {},
                  color: Colors.blueGrey,
                  icon: Icon(Icons.close)),
              children: [
                ButtonNavigationExpandable(
                  onPressed: () {},
                  label: "Option 1",
                  height: 40,
                  width: 128,
                  icon: Icon(Icons.info),
                ),
                ButtonNavigationExpandable(
                    onPressed: () {}, height: 40, width: 96, label: "Option 2"),
              ]),
          ButtonNavigationItem(
              icon: Icon(Icons.remove),
              onPressed: () {
                setState(() {
                  if (cardCounter > 1) {
                    cardCounter--;
                  }
                });
              }),
          ButtonNavigationItem(
              icon: Icon(Icons.view_stream_sharp),
              onPressed: () {
                setState(() {
                  cardCounter = 2;
                });
              }),
        ],
      ),
    );
  }

  Scaffold example2(BuildContext context) {
    return Scaffold(
      appBar: appBar(context),
      body: body(context),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      floatingActionButton: ButtonNavigationBar(
        borderRadius: BorderRadius.all(Radius.circular(10)),
        children: [
          ButtonNavigationItem(
              icon: Icon(Icons.map_outlined),
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (BuildContext context) => SubPageOne()));
              }),
          ButtonNavigationItem(
              icon: Icon(Icons.add),
              label: "Add a card",
              width: 140,
              onPressed: () {
                setState(() {
                  cardCounter++;
                });
              }),
          ButtonNavigationItem(
              icon: Icon(Icons.search),
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (BuildContext context) => SubPageTwo()));
              }),
        ],
      ),
    );
  }

  AppBar appBar(BuildContext context) {
    return AppBar(
      title: Text(widget.title),
      actions: [
        PopupMenuButton(
          itemBuilder: (BuildContext context) {
            return [
              PopupMenuItem(
                  onTap: () {
                    setState(() {
                      example = 1;
                    });
                  },
                  child: InkWell(
                    splashColor: Colors.grey,
                    child: Text("Example 1"),
                  )),
              PopupMenuItem(
                  onTap: () {
                    setState(() {
                      example = 2;
                    });
                  },
                  child: InkWell(
                    splashColor: Colors.grey,
                    child: Text("Example 2"),
                  ))
            ];
          },
        ),
      ],
    );
  }

  Widget body(BuildContext context) {
    return SingleChildScrollView(
        padding: EdgeInsets.all(8),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: CardService().returnCards(cardCounter),
        ));
  }
}

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

1 回复

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


button_navigation_bar 是一个用于 Flutter 的第三方插件,用于创建底部导航栏。它提供了丰富的自定义选项,可以帮助你轻松构建美观的底部导航栏。以下是使用 button_navigation_bar 插件的基本步骤和示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  button_navigation_bar: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 button_navigation_bar 包:

import 'package:button_navigation_bar/button_navigation_bar.dart';

3. 使用 ButtonNavigationBar

ButtonNavigationBar 是一个小部件,可以在你的应用底部创建一个导航栏。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BottomNavigationExample(),
    );
  }
}

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

class _BottomNavigationExampleState extends State<BottomNavigationExample> {
  int _currentIndex = 0;

  final List<Widget> _pages = [
    Center(child: Text('Home Page', style: TextStyle(fontSize: 24))),
    Center(child: Text('Search Page', style: TextStyle(fontSize: 24))),
    Center(child: Text('Profile Page', style: TextStyle(fontSize: 24))),
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: ButtonNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        items: [
          ButtonNavigationItem(
            icon: Icons.home,
            label: 'Home',
          ),
          ButtonNavigationItem(
            icon: Icons.search,
            label: 'Search',
          ),
          ButtonNavigationItem(
            icon: Icons.person,
            label: 'Profile',
          ),
        ],
      ),
    );
  }
}
回到顶部