Flutter底部导航动画插件animated_bottom_navigation的使用

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

Flutter底部导航动画插件animated_bottom_navigation的使用

简介

animated_bottom_navigation 是一个用于实现带有漂亮动画效果的底部导航栏的Flutter插件。它支持RTL布局、优雅的过渡动画,并且可以为每个导航项添加子项。

Gif

添加依赖

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

dependencies:
  animated_bottom_navigation: ^latest_version

请将 ^latest_version 替换为最新版本号。

如何使用

下面是一个完整的示例,展示了如何使用 AnimatedBottomNavigation 插件:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

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

  late List<Widget> widgets;

  @override
  void initState() {
    super.initState();
    widgets = [
      const Center(child: Text('Page1')),
      const Center(child: Text('Page2')),
      const Center(child: Text('Page3')),
      const Center(child: Text('Page4')),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: widgets[currentIndex],
      bottomNavigationBar: AnimatedBottomNavigation(
        context: context,
        items: [
          TabItem(
            icon: const Icon(Icons.hive_sharp),
            haveChildren: true,
            activeColor: Colors.white,
            inActiveColor: Colors.white60,
            children: [
              TabChildrenItem(
                icon: const Icon(Icons.call),
                title: 'Call',
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.photo_rounded),
                onTap: () {},
                title: 'Gallery',
              ),
              TabChildrenItem(
                icon: const Icon(Icons.add_road),
                onTap: () {},
              ),
            ],
          ),
          TabItem(
            icon: const Icon(Icons.library_add),
            haveChildren: true,
            activeColor: Colors.white,
            inActiveColor: Colors.white60,
            children: [
              TabChildrenItem(
                icon: const Icon(Icons.add_a_photo),
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.get_app),
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.settings),
                onTap: () {},
              ),
            ],
          ),
          TabItem(
            icon: const Icon(Icons.bookmark),
            activeColor: Colors.white,
            inActiveColor: Colors.white60,
          ),
          TabItem(
            icon: const Icon(Icons.camera_alt_rounded),
            haveChildren: true,
            activeColor: Colors.white,
            inActiveColor: Colors.white60,
            children: [
              TabChildrenItem(
                icon: const Icon(Icons.timer_10_select_rounded),
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.phone_iphone_rounded),
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.alarm),
                onTap: () {},
              ),
              TabChildrenItem(
                icon: const Icon(Icons.color_lens),
                onTap: () {},
              ),
            ],
          ),
        ],
        width: 30,
        direction: TextDirection.rtl,
        backgroundColor: Colors.blueAccent,
        animationCurve: Curves.easeIn,
        onChanged: (value) {
          setState(() {
            currentIndex = value;
          });
        },
      ),
    );
  }
}

属性说明

  • context: BuildContext 用于获取距离。
  • items: 显示图标的 TabItem 列表。
  • backgroundColor: 导航栏背景颜色,默认为白色。
  • onChanged: 处理项目点击的函数。
  • animationCurve: 按钮切换动画的曲线,默认为 Curves.easeIn
  • animationDuration: 按钮切换动画的持续时间,默认为 Duration(milliseconds: 150)
  • height: 导航栏的高度,最小值为0.0,最大值为75.0。
  • width: 导航栏中任何小部件的宽度,默认为40.0。
  • letIndexChange: 接受页面索引作为参数并返回布尔值的函数。如果函数返回false,则按钮点击时不会更改页面,默认返回true。
  • direction: 应用程序的方向,以处理旋转和布局,默认为 TextDirection.ltr
  • borderRadius: 上边缘的曲率,默认为20.0。
  • horizontalPadding: 周围的距离,默认为20.0。
  • margin: 小部件的边距。

特性

  • 支持RTL布局。
  • 优雅的过渡动画。
  • 能够为每个导航项添加子项。

通过以上示例代码和属性说明,您可以轻松地在您的Flutter应用中集成并自定义 animated_bottom_navigation 插件,以实现具有漂亮动画效果的底部导航栏。


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

1 回复

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


当然,下面是一个使用 animated_bottom_navigation 插件的 Flutter 示例代码。这个插件可以帮助你在应用中实现带有动画效果的底部导航栏。

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

dependencies:
  flutter:
    sdk: flutter
  animated_bottom_navigation: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个完整的示例代码,展示如何使用 animated_bottom_navigation

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

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

class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateMixin {
  int _selectedPageIndex = 0;
  final List<AnimatedNavItem> _navItems = [
    AnimatedNavItem(
      icon: Icons.home,
      title: "Home",
      route: "/",
    ),
    AnimatedNavItem(
      icon: Icons.search,
      title: "Search",
      route: "/search",
    ),
    AnimatedNavItem(
      icon: Icons.add,
      title: "Add",
      route: "/add",
    ),
    AnimatedNavItem(
      icon: Icons.profile,
      title: "Profile",
      route: "/profile",
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _getPage(),
      bottomNavigationBar: AnimatedBottomNavigation(
        icons: _navItems.map((item) => item.icon).toList(),
        activeColor: Colors.blue,
        inactiveColor: Colors.grey,
        backgroundColor: Colors.white,
        notchSmoothness: NotchSmoothness.softEdge,
        notchWidth: 24,
        selectedIndex: _selectedPageIndex,
        onTabSelectedIndexChanged: (index) {
          setState(() {
            _selectedPageIndex = index;
          });
        },
      ),
    );
  }

  Widget _getPage() {
    switch (_selectedPageIndex) {
      case 0:
        return Center(child: Text("Home Page"));
      case 1:
        return Center(child: Text("Search Page"));
      case 2:
        return Center(child: Text("Add Page"));
      case 3:
        return Center(child: Text("Profile Page"));
      default:
        return Center(child: Text("Unknown Page"));
    }
  }
}

class AnimatedNavItem {
  final IconData icon;
  final String title;
  final String route;

  AnimatedNavItem({required this.icon, required this.title, required this.route});
}

在这个示例中,我们创建了一个 HomeScreen 小部件,它包含一个 AnimatedBottomNavigation 底部导航栏和四个页面(Home、Search、Add、Profile)。AnimatedNavItem 类用于存储每个导航项的图标、标题和路由信息。

当用户点击底部导航栏中的不同图标时,onTabSelectedIndexChanged 回调函数会被调用,并更新 _selectedPageIndex 的值,从而通过 _getPage 方法显示相应的页面。

这个示例展示了如何使用 animated_bottom_navigation 插件来创建一个带有动画效果的底部导航栏,并处理页面切换。希望这对你有所帮助!

回到顶部