第五章、flutter怎么创建底部底部导航栏界面

flutter 怎么快速建立包含底部菜单栏的界面。

一、使用BottomNavigationBar

BottomNavigationBar 是 Flutter 框架中用于实现底部导航栏的核心组件,遵循Material Design规范,常用于在应用的不同页面或Tab之间进行切换。‌

BottomNavigationBar 的核心属性和用法包括: ‌ 它通常作为 Scaffold 的 bottomNavigationBar 参数进行配置,关键属性有:

  • items:一个 BottomNavigationBarItem 对象列表,定义每个 Tab 的图标和标签。
  • currentIndex:当前选中的 Tab 索引,用于控制高亮状态。
  • onTap:当用户点击 Tab 时触发的回调函数,通常用于更新 currentIndex 并切换页面。
  • type:决定导航栏的布局行为,可选值包括 BottomNavigationBarType.fixed(固定高度,适用于较少 Tab)和 BottomNavigationBarType.shifting(标签切换时背景色变化,适用于较多 Tab)。‌12

在页面切换中,BottomNavigationBar 常与 PageView 或 StatefulWidget 配合使用: ‌ 例如,通过 currentIndex 控制页面索引,动态更新 Scaffoldbody 部分来实现无刷新切换。‌12 此外,组件支持自定义图标大小、颜色等样式属性,如 iconSizefixedColor,以满足设计需求。‌1

BottomNavigationBar 是 Flutter 框架中用于实现底部导航栏的核心组件,遵循Material Design规范,常用于在应用的不同页面或Tab之间进行切换。‌

BottomNavigationBar 的核心属性和用法包括: ‌ 它通常作为 Scaffold 的 bottomNavigationBar 参数进行配置,关键属性有:

  • items:一个 BottomNavigationBarItem 对象列表,定义每个 Tab 的图标和标签。
  • currentIndex:当前选中的 Tab 索引,用于控制高亮状态。
  • onTap:当用户点击 Tab 时触发的回调函数,通常用于更新 currentIndex 并切换页面。
  • type:决定导航栏的布局行为,可选值包括 BottomNavigationBarType.fixed(固定高度,适用于较少 Tab)和 BottomNavigationBarType.shifting(标签切换时背景色变化,适用于较多 Tab)。‌12

在页面切换中,BottomNavigationBar 常与 PageView 或 StatefulWidget 配合使用: ‌ 例如,通过 currentIndex 控制页面索引,动态更新 Scaffoldbody 部分来实现无刷新切换。‌12 此外,组件支持自定义图标大小、颜色等样式属性,如 iconSizefixedColor,以满足设计需求。‌

二、BottomNavigationBarItem 设置底部bar的图标和文本

复制代码
BottomNavigationBarItem(
  icon: ImageIcon(
    AssetImage('assets/icons/icon_home.png'),
  ),
  activeIcon: ImageIcon(
    AssetImage('assets/icons/icon_home_fill.png'),
  ),
  label: '首页',
)

三、完整代码

复制代码
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:aieshop/ui/mall_homepage_route.dart';
import 'package:aieshop/ui/products/product_classification.dart';
import 'package:aieshop/ui/shoplive/shop_live_page_route.dart';
import 'package:aieshop/ui/shopcart/ShoppingcartPage.dart';
import 'package:aieshop/ui/usercenter/UserCenterPage.dart';

class WillPopScopeHome extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => WillPopScopeHomeState();
}

class WillPopScopeHomeState extends State<WillPopScopeHome> {
  int backCount = 0;
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
        child: MyHomePage(),
        onWillPop: () async {
          if (backCount==0) {
            Fluttertoast.showToast(msg: '再点一次即可退出');
            backCount = 1;
            return false;
          } else {
            return true;
          }
        });
  }
}

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


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

  List<Widget> _widgetOptions = [];

  @override
  Widget build(BuildContext context) {
    _widgetOptions.add(MallHomepageRoute());
    _widgetOptions.add(ProductClassificationRoute());
    _widgetOptions.add(ShopLivePageRoute(context));
    _widgetOptions.add(ShoppingcartPage());
    _widgetOptions.add(UserCenterPage());
    return Scaffold(
      body: Container(
        child: _widgetOptions.elementAt(_currentIndex),
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        currentIndex: _currentIndex,
        backgroundColor: Colors.white,
        selectedItemColor: Colors.redAccent,
        unselectedItemColor: Colors.black38,
        selectedFontSize: 12,
        unselectedFontSize: 12,
        onTap: (value) {
          setState(() {
            _currentIndex = value;
          });
        },
        items: [
          BottomNavigationBarItem(
            icon: ImageIcon(
              AssetImage('assets/icons/icon_home.png'),
            ),
            activeIcon: ImageIcon(
              AssetImage('assets/icons/icon_home_fill.png'),
            ),
            label: '首页',
          ),
          BottomNavigationBarItem(
            icon: ImageIcon(
              AssetImage('assets/icons/icon_classify.png'),
            ),
            activeIcon: ImageIcon(
              AssetImage('assets/icons/icon_classify_fill.png'),
            ),
            label: '分类',
          ),
          BottomNavigationBarItem(
            icon: ImageIcon(
              AssetImage('assets/icons/icon_record.png'),
            ),
            activeIcon: ImageIcon(
              AssetImage('assets/icons/icon_record_fill.png'),
            ),
            label: '直播',
          ),
          BottomNavigationBarItem(
            icon: ImageIcon(
              AssetImage('assets/icons/icon_cart.png'),
            ),
            activeIcon: ImageIcon(
              AssetImage('assets/icons/icon_cart_fill.png'),
            ),
            label: '购物车',
          ),
          BottomNavigationBarItem(
            icon: ImageIcon(
              AssetImage('assets/icons/icon_my.png'),
            ),
            activeIcon: ImageIcon(
              AssetImage('assets/icons/icon_my_fill.png'),
            ),
            label: '我的',
          ),
        ],
      ),
    );
  }
}
相关推荐
en.en..3 分钟前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
后台模板学习42 分钟前
从0到1用Vite构建电商订单系统前端性能优化方案
前端
Wang's Blog42 分钟前
Vibe Coding一人即团队系列58: HTML演示文稿自动生成
前端·人工智能·html
FoldWinCard1 小时前
基于k8s高可用web集群
前端·容器·kubernetes
神探小白牙1 小时前
海康视频在vue2.0中的使用
前端·音视频
Tanjia_kiki1 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
honkun61 小时前
vue 表格组件 vxe-table 实现拖拽列字段自动生成透视表汇总
前端·javascript·vue.js
新中地GIS开发老师2 小时前
WebGIS开发入门 | 从 Web 开发到地图开发,差别在哪儿?
前端·vue·webgis
IMPYLH2 小时前
HTML 的 <p> 元素
前端·javascript·html
leoZ2312 小时前
第 4 篇:布局骨架——页面壳、栅格、卡片
前端·javascript·vue.js·opencv·计算机视觉·数据挖掘·语音识别