Flutter自定义导航栏插件curved_nav_bar的使用

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

Flutter自定义导航栏插件curved_nav_bar的使用

curved_nav_bar 是一个Flutter插件,用于创建带有浮动操作按钮(FAB)和中心文本的底部导航栏。你可以将FAB用作中间标签,或者执行其他操作,如打开弹出窗口或相机。

Screenshots

GIF Image

Usage

添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  curved_nav_bar:

导入包

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

import 'package:curved_nav_bar/curved_bar/curved_action_bar.dart';
import 'package:curved_nav_bar/fab_bar/fab_bottom_app_bar_item.dart';
import 'package:curved_nav_bar/flutter_curved_bottom_nav_bar.dart';

使用 CurvedNavBar

CurvedNavBar 提供了多种配置选项,以下是一些主要的属性:

属性 类型 描述
appBarItems List<FABBottomAppBarItem> 导航栏项列表,长度应与 bodyItems 相等
bodyItems List<Widget> 页面内容列表,长度应与 appBarItems 相等
extendBody bool 默认值为 true
actionButton CurvedActionBar 通常是一个 FloatingActionButton
activeColor Color 选中的标签颜色,默认为 Colors.black
inActiveColor Color 未选中的标签颜色,默认为 Colors.black26
navBarBackgroundColor Color 导航栏背景颜色,默认为 Colors.white
actionBarView Widget actionButton 被选中时设置为 Scaffold 的 body

FABBottomAppBarItem 配置

属性 类型 描述
activeIcon Widget 选中的图标
inActiveIcon Widget 未选中的图标
text String 导航栏项的标签

CurvedActionBar 配置

属性 类型 描述
activeIcon Widget 选中的图标
inActiveIcon Widget 未选中的图标
text String 按钮的标签
onTab ValueChanged<bool> 点击按钮时返回一个布尔值

示例代码

以下是一个完整的示例代码,展示了如何使用 CurvedNavBar

import 'package:flutter/material.dart';
import 'package:curved_nav_bar/curved_bar/curved_action_bar.dart';
import 'package:curved_nav_bar/fab_bar/fab_bottom_app_bar_item.dart';
import 'package:curved_nav_bar/flutter_curved_bottom_nav_bar.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(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return CurvedNavBar(
      actionButton: CurvedActionBar(
        onTab: (value) {
          /// 执行操作
          print(value);
        },
        activeIcon: Container(
          padding: EdgeInsets.all(8),
          decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle),
          child: Icon(
            Icons.camera_alt,
            size: 50,
            color: Colors.orange,
          ),
        ),
        inActiveIcon: Container(
          padding: EdgeInsets.all(8),
          decoration: BoxDecoration(color: Colors.white70, shape: BoxShape.circle),
          child: Icon(
            Icons.camera_alt_outlined,
            size: 50,
            color: Colors.orange,
          ),
        ),
        text: "Camera",
      ),
      activeColor: Colors.blue,
      navBarBackgroundColor: Colors.limeAccent,
      inActiveColor: Colors.black45,
      appBarItems: [
        FABBottomAppBarItem(
          activeIcon: Icon(
            Icons.home,
            color: Colors.blue,
          ),
          inActiveIcon: Icon(
            Icons.home,
            color: Colors.black26,
          ),
          text: 'Home',
        ),
        FABBottomAppBarItem(
          activeIcon: Icon(
            Icons.wallet_giftcard,
            color: Colors.blue,
          ),
          inActiveIcon: Icon(
            Icons.wallet_giftcard,
            color: Colors.black26,
          ),
          text: 'Wallet',
        ),
      ],
      bodyItems: [
        Container(
          height: MediaQuery.of(context).size.height,
          color: Colors.blue,
        ),
        Container(
          height: MediaQuery.of(context).size.height,
          color: Colors.pinkAccent,
        ),
      ],
      actionBarView: Container(
        height: MediaQuery.of(context).size.height,
        color: Colors.orange,
      ),
    );
  }
}

Pull Requests

欢迎提交 Pull Requests。通常我会在 24-48 小时内响应任何问题或请求。

  1. 请保持 PR 标题简洁易读且描述性强,这将使它们更容易合并。
  2. PR 必须针对 develop 分支。除非维护者另有指定,否则其他分支的 PR 将被拒绝。

Created & Maintained By

Boffin Coders Pvt. Ltd.

如果你觉得这个项目有帮助或从源代码中学到了东西,并想感谢我,可以考虑请我喝一杯 ☕。

License

Copyright 2018 Boffin Coders Pvt. Ltd.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用curved_nav_bar插件来创建自定义导航栏的示例代码。curved_nav_bar 是一个流行的 Flutter 插件,用于创建具有曲线效果的底部导航栏。

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

dependencies:
  flutter:
    sdk: flutter
  curved_navigation_bar: ^1.0.3  # 请检查最新版本号

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

接下来,你可以按照以下步骤在你的Flutter应用中实现自定义导航栏:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Curved Navigation Bar Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _selectedIndex = 0;

  final List<Widget> _widgetOptions = [
    Text('Home Page'),
    Text('Search Page'),
    Text('Profile Page'),
    Text('Settings Page'),
  ];

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Curved Navigation Bar Demo'),
      ),
      body: Center(
        child: _widgetOptions.elementAt(_selectedIndex),
      ),
      bottomNavigationBar: CurvedNavigationBar(
        index: _selectedIndex,
        height: 50.0,
        color: Colors.white,
        backgroundColor: Colors.blue,
        buttonBackgroundColor: Colors.blue.withOpacity(0.2),
        animationCurve: Curves.easeInOut,
        animationDuration: Duration(milliseconds: 600),
        onTap: _onItemTapped,
        pages: [
          Icon(Icons.home, color: Colors.black),
          Icon(Icons.search, color: Colors.black),
          Icon(Icons.person, color: Colors.black),
          Icon(Icons.settings, color: Colors.black),
        ],
      ),
    );
  }
}

代码解释:

  1. 依赖引入

    • 确保在pubspec.yaml中添加了curved_navigation_bar依赖。
  2. 主应用

    • MyApp类作为主应用入口,定义了应用的主题和主页。
  3. 主页

    • HomeScreen是一个有状态的小部件,用于管理导航栏的当前选中项。
    • _widgetOptions列表包含了不同页面的内容(这里为了简单起见,只是文本)。
    • _onItemTapped方法用于处理导航栏项的点击事件,更新当前选中项。
  4. 导航栏

    • CurvedNavigationBar小部件用于创建底部导航栏。
    • index属性表示当前选中的导航项索引。
    • height属性定义了导航栏的高度。
    • colorbackgroundColor属性分别定义了按钮和背景的颜色。
    • buttonBackgroundColor属性定义了未选中按钮的背景颜色。
    • animationCurveanimationDuration属性定义了动画效果和持续时间。
    • onTap属性绑定了点击事件处理函数。
    • pages属性包含了导航项的图标。

通过这种方式,你可以轻松地在Flutter应用中实现一个具有曲线效果的自定义底部导航栏。如果需要更多自定义选项,比如添加标签或者更改图标的颜色,可以参考curved_navigation_bar的文档进行进一步配置。

回到顶部