Flutter底部导航栏修复插件bottom_bar_fix的使用

Flutter底部导航栏修复插件bottom_bar_fix的使用

在Flutter开发中,底部导航栏是一个非常常见的UI组件。然而,Flutter官方的BottomAppBar只能显示一个带有缺口的浮动操作按钮(FAB),这在某些场景下可能无法满足需求。为了解决这一问题,我们可以使用convex_bottom_bar插件,它提供了多种风格的底部导航栏,并支持自定义主题、动画效果等。


插件简介

convex_bottom_bar 是一个功能强大的底部导航栏插件,灵感来源于 BottomAppBarNotchShape 的实现。它允许开发者创建更复杂的凸起形状和自定义样式。

功能特点:

  • 提供多种内置样式。
  • 支持更改 AppBar 的主题。
  • 提供构建器 API,可以自定义新的样式。
  • 可以在标签菜单上添加徽章。
  • 拥有优雅的过渡动画。
  • 提供钩子 API 来覆盖部分内部样式。
  • 支持 RTL(从右到左)布局。

如何使用

要开始使用 convex_bottom_bar 插件,首先需要将其添加到项目的依赖中。

1. 添加依赖

pubspec.yaml 文件中添加以下内容:

dependencies:
  convex_bottom_bar: ^最新版本号

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


2. 基本用法

ConvexAppBar 可以通过设置 ScaffoldbottomNavigationBar 属性来使用。它有两个构造函数:ConvexAppBar()ConvexAppBar.builder()。其中,ConvexAppBar() 使用默认样式简化了选项卡的创建。

示例代码:

import 'package:flutter/material.dart';
import 'package:convex_bottom_bar/bottom_bar_fix.dart';

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

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ConvexAppBar 示例'),
      ),
      body: Center(
        child: Text('点击导航栏切换页面'),
      ),
      bottomNavigationBar: ConvexAppBar(
        items: [
          TabItem(icon: Icons.home, title: '首页'),
          TabItem(icon: Icons.search, title: '搜索'),
          TabItem(icon: Icons.add, title: '发布'),
          TabItem(icon: Icons.chat, title: '消息'),
          TabItem(icon: Icons.person, title: '我的'),
        ],
        initialActiveIndex: 2, // 默认选中的索引
        onTap: (int index) => print('点击了第 $index 个选项'),
      ),
    );
  }
}

效果图:

appBar preview


自定义样式

如果默认样式不符合需求,可以通过 builder 方法来自定义每个选项卡的外观。

示例代码:

import 'package:flutter/material.dart';
import 'package:convex_bottom_bar/bottom_bar_fix.dart';

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

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('自定义导航栏'),
      ),
      body: Center(
        child: Text('自定义选项卡样式'),
      ),
      bottomNavigationBar: ConvexAppBar.builder(
        count: 5, // 总共有5个选项卡
        backgroundColor: Colors.blue,
        style: TabStyle.fixed, // 固定风格
        itemBuilder: (context, index, active) {
          return Text(
            'Tab $index',
            style: TextStyle(
              fontSize: active ? 18 : 16,
              fontWeight: active ? FontWeight.bold : FontWeight.normal,
            ),
          );
        },
      ),
    );
  }
}

添加徽章

如果需要在选项卡上显示徽章(如未读消息数量),可以使用 ConvexAppBar.badge() 方法。

示例代码:

import 'package:flutter/material.dart';
import 'package:convex_bottom_bar/bottom_bar_fix.dart';

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

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('带徽章的导航栏'),
      ),
      body: Center(
        child: Text('徽章示例'),
      ),
      bottomNavigationBar: ConvexAppBar.badge(
        {0: '99+', 1: Icons.notifications, 2: Colors.redAccent}, // 徽章数据
        items: [
          TabItem(icon: Icons.home, title: '首页'),
          TabItem(icon: Icons.chat, title: '消息'),
          TabItem(icon: Icons.settings, title: '设置'),
        ],
        onTap: (int index) => print('点击了第 $index 个选项'),
      ),
    );
  }
}

RTL 支持

convex_bottom_bar 插件原生支持 RTL(从右到左)布局。只需在应用中设置 TextDirection 即可。

示例代码:

import 'package:flutter/material.dart';
import 'package:convex_bottom_bar/bottom_bar_fix.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Directionality(
        textDirection: TextDirection.rtl,
        child: Scaffold(
          appBar: AppBar(
            title: Text('RTL 导航栏'),
          ),
          body: Center(
            child: Text('RTL 示例'),
          ),
          bottomNavigationBar: ConvexAppBar(
            items: [
              TabItem(icon: Icons.home, title: '主页'),
              TabItem(icon: Icons.search, title: '搜索'),
            ],
            initialActiveIndex: 0,
            onTap: (int index) => print('点击了第 $index 个选项'),
          ),
        ),
      ),
    );
  }
}
1 回复

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


bottom_bar_fix 是一个用于修复 Flutter 底部导航栏(Bottom Navigation Bar)常见问题的插件。它可以解决在切换页面时重新渲染底部导航栏的问题,提升用户体验。下面是如何使用 bottom_bar_fix 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  bottom_bar_fix: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 bottom_bar_fix 插件:

import 'package:bottom_bar_fix/bottom_bar_fix.dart';

3. 创建底部导航栏

使用 BottomBarFix 组件来创建底部导航栏。你可以通过 items 属性来定义导航栏的各个项目,并通过 onTap 来处理用户点击事件。

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

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

  final List<Widget> _pages = [
    Page1(),
    Page2(),
    Page3(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomBarFix(
        items: const <BottomBarFixItem>[
          BottomBarFixItem(
            icon: Icon(Icons.home),
            title: Text('Home'),
          ),
          BottomBarFixItem(
            icon: Icon(Icons.business),
            title: Text('Business'),
          ),
          BottomBarFixItem(
            icon: Icon(Icons.school),
            title: Text('School'),
          ),
        ],
        currentIndex: _currentIndex,
        onTap: (int index) {
          setState(() {
            _currentIndex = index;
          });
        },
      ),
    );
  }
}

4. 定义页面

在上面的代码中,_pages 是一个包含不同页面的列表。你需要定义这些页面:

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Home Page'),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Business Page'),
    );
  }
}

class Page3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('School Page'),
    );
  }
}

5. 运行应用

现在你可以运行你的 Flutter 应用,底部导航栏应该能够正常工作,并且在切换页面时不会重新渲染。

6. 自定义样式

你可以通过 BottomBarFix 的其他属性来自定义底部导航栏的样式,例如 backgroundColorselectedItemColorunselectedItemColor 等。

bottomNavigationBar: BottomBarFix(
  items: const <BottomBarFixItem>[
    BottomBarFixItem(
      icon: Icon(Icons.home),
      title: Text('Home'),
    ),
    BottomBarFixItem(
      icon: Icon(Icons.business),
      title: Text('Business'),
    ),
    BottomBarFixItem(
      icon: Icon(Icons.school),
      title: Text('School'),
    ),
  ],
  currentIndex: _currentIndex,
  onTap: (int index) {
    setState(() {
      _currentIndex = index;
    });
  },
  backgroundColor: Colors.blue,
  selectedItemColor: Colors.white,
  unselectedItemColor: Colors.grey,
),
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!