Flutter侧边导航插件side_nav的使用

Flutter侧边导航插件side_nav的使用

本仓库由作者@Tri7Ratops创作的flutter_side_navbar而来,对这个组件进行了二次修改从而得到了这个组件。

一个仿点餐菜单的边栏导航,自动滚动高亮。

开始

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

dependencies:
  ...
  side_nav: any

在你的组件中引入:

import 'package:side_nav/side_nav.dart';

使用

首先,在Scaffold中添加SideNavbar:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        backgroundColor: Colors.white70,
        body: SideNavbar(
          pages: [],
        ),
      ),
    );
  }
}

然后,将不同的pages作为SideItemModel列表添加进去:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        backgroundColor: Colors.white70,
        body: SideNavbar(
          pages: [
            SideItemModel(
              defaultIconColor: Colors.blue,
              onTap: () {},
              page: Column(
                children: [
                  Container(
                    height: 800,
                    width: double.infinity,
                    color: Colors.green,
                  ),
                ],
              ),
              icon: Icons.home_filled,
            ),
            SideItemModel(
              defaultIconColor: Colors.blue,
              onTap: () {},
              page: Column(
                children: [
                  Container(
                    height: 1000,
                    width: double.infinity,
                    color: Colors.red,
                  ),
                ],
              ),
              icon: Icons.verified_user,
            ),
          ],
        ),
      ),
    );
  }
}

现在你已经可以运行了!

自定义

SideItemModel

  /// 显示的Widget
  final Widget? page;

  /// 导航中对应的图标
  final IconData icon;

  /// 图标的补充说明文字
  final String? iconTitle;

  /// 用户点击导航项时触发的回调
  final Function()? onTap;

  /// 当前页面最突出时触发的回调
  final Function()? onMostVisible;

  /// 页面失去焦点时触发的回调
  final Function()? lostFocus;

  /// 页面未聚焦时图标的默认颜色
  final Color defaultIconColor;

  /// 当前页面聚焦时导航项的背景颜色
  final Color focusBackgroundColor;

  /// 当前页面聚焦时图标的颜色
  final Color focusIconColor;

  /// 当前页面聚焦时文字的颜色
  final Color focusTextColor;

SideNavbar

  /// 需要展示的所有页面
  final List<SideItemModel> pages;

  /// 导航栏的宽度
  final double navigationWidth;

  /// 导航栏的背景颜色
  final Color navigationBackgroundColor;

  /// 用于个性化导航按钮容器的装饰
  final BoxDecoration decorationItem;

  /// 用于改变导航栏的位置
  ///
  /// reversed = false => 导航栏在右侧
  /// reversed = true => 导航栏在左侧
  final bool reversed;

  /// 用于指定是否显示AppBar
  final bool appBarIsShown;

  /// 用于设置页面的内边距
  final EdgeInsets? padding;

  /// 用于设置导航栏的内边距
  final EdgeInsets? paddingNavigation;

  /// 如果ScrollView不启用shrinkWrap,则ScrollView会扩展到允许的最大大小
  final bool shrinkWrap;

  /// 用于设置包的滚动控制器
  final AutoScrollController? controller;

  /// 用于设置包的滚动物理属性
  final ScrollPhysics? physics;

  /// 用于设置用户点击导航项并滚动时动画的持续时间
  final Duration duration;

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

1 回复

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


side_nav 是一个用于 Flutter 的侧边导航插件,可以帮助你轻松地在应用中添加侧边导航栏。以下是如何使用 side_nav 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  side_nav: ^0.0.1 # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 side_nav

import 'package:side_nav/side_nav.dart';

3. 使用 SideNav 组件

SideNav 是一个可以自定义的侧边导航栏组件。你可以通过传递参数来定制它的外观和行为。

以下是一个简单的使用示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SideNav Example'),
        ),
        body: Row(
          children: [
            SideNav(
              items: [
                SideNavItem(
                  icon: Icons.home,
                  label: 'Home',
                  onTap: () {
                    print('Home tapped');
                  },
                ),
                SideNavItem(
                  icon: Icons.settings,
                  label: 'Settings',
                  onTap: () {
                    print('Settings tapped');
                  },
                ),
                SideNavItem(
                  icon: Icons.person,
                  label: 'Profile',
                  onTap: () {
                    print('Profile tapped');
                  },
                ),
              ],
              selectedIndex: 0,
            ),
            Expanded(
              child: Center(
                child: Text('Main Content'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

4. 自定义 SideNav

SideNav 提供了多个参数,允许你自定义导航栏的外观和行为。以下是一些常用的参数:

  • items: 导航项列表,每个导航项都是一个 SideNavItem
  • selectedIndex: 当前选中的导航项索引。
  • backgroundColor: 导航栏的背景颜色。
  • selectedColor: 选中项的颜色。
  • unselectedColor: 未选中项的颜色。
  • iconSize: 图标的大小。
  • itemSpacing: 导航项之间的间距。
  • onItemSelected: 当导航项被选中时的回调函数。

5. 处理导航项点击事件

你可以在 SideNavItemonTap 回调中处理导航项的点击事件。例如:

SideNavItem(
  icon: Icons.home,
  label: 'Home',
  onTap: () {
    // 处理点击事件
    print('Home tapped');
  },
),

6. 动态更新选中项

你可以通过 setState 动态更新 selectedIndex 来改变选中的导航项:

int _selectedIndex = 0;

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

SideNav(
  items: [
    SideNavItem(
      icon: Icons.home,
      label: 'Home',
      onTap: () {
        _onItemTapped(0);
      },
    ),
    SideNavItem(
      icon: Icons.settings,
      label: 'Settings',
      onTap: () {
        _onItemTapped(1);
      },
    ),
  ],
  selectedIndex: _selectedIndex,
),

7. 完整示例

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

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

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

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

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SideNav Example'),
      ),
      body: Row(
        children: [
          SideNav(
            items: [
              SideNavItem(
                icon: Icons.home,
                label: 'Home',
                onTap: () {
                  _onItemTapped(0);
                },
              ),
              SideNavItem(
                icon: Icons.settings,
                label: 'Settings',
                onTap: () {
                  _onItemTapped(1);
                },
              ),
              SideNavItem(
                icon: Icons.person,
                label: 'Profile',
                onTap: () {
                  _onItemTapped(2);
                },
              ),
            ],
            selectedIndex: _selectedIndex,
          ),
          Expanded(
            child: Center(
              child: Text('Page ${_selectedIndex + 1}'),
            ),
          ),
        ],
      ),
    );
  }
}
回到顶部