Flutter BottomNavigationBar组件(底部导航栏)

2023-11-19

Flutter BottomNavigationBar 组件

BottomNavigationBar 常见的属性

属性名 说明
items List 底部导航条按钮集合(页面集合)
iconSize icon
currentIndex 默认选中第几个(页面)
onTap 选中变化回调函数(点击后专跳指定页面)
fixedColor 选中的颜色
type BottomNavigationBarType.fixed
BottomNavigationBarType.shifting

使用过程中几点需要注意的:

  1. BottomNavigationBar用在Scaffold组件下

  2. 当底部导航页面超过三个时,必须要添加type属性(BottomNavigationBarType.fixed),否则的话底部导航会全白,看不到效果

  3. items中是一个BottomNavigationBarItem的集合,里面包含图片及文字标签,在视频教程中给的文字使用的是title属性,我在使用时提示被弃用,用烂了替换title
    在这里插入图片描述

  4. currentIndex是BottomNavigationBar 中的属性,是为底部导航页面编的号,从零开始

  5. 我们要改变页面时在onTap中获取点击页面的编号

onTap: (int index) {
            setState(() {
              currentIndex = index;
            });
          },

调用setState改变展示的页面
7. body中是我们展示的页面,我们将所有页面放在一个集合中,通过上一步中获取到的下标定位到指定页面

示例:

分类页面(Category.dart)

import 'package:flutter/material.dart';

class CategoryPage extends StatefulWidget {
  CategoryPage({Key? key}) : super(key: key);

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

class _CategoryPageState extends State<CategoryPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("这是分类页面"),
    );
  }
}

邮件页面(Email.dart)

import 'package:flutter/material.dart';

class EmailPage extends StatefulWidget {
  EmailPage({Key? key}) : super(key: key);

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

class _EmailPageState extends State<EmailPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("这是邮件页面"),
    );
  }
}

Home页面(Home.dart)

// ignore_for_file: prefer_const_constructors_in_immutables

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  HomePage({Key? key}) : super(key: key);

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

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return const Text("我是首页组件");
  }
}

设置页面(Setting.dart)

// ignore_for_file: prefer_const_literals_to_create_immutables

import 'package:flutter/material.dart';

class SettingPage extends StatefulWidget {
  SettingPage({Key? key}) : super(key: key);

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

class _SettingPageState extends State<SettingPage> {
  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        ListTile(
          title: Text("我是设置页面"),
        )
      ],
    );
  }
}

整合导航栏的页面(Tabs.dart)

import 'package:flutter/material.dart';
import 'tabs/Category.dart';
import 'tabs/Email.dart';
import 'tabs/Home.dart';
import 'tabs/Setting.dart';

class Tabs extends StatefulWidget {
  const Tabs({Key? key}) : super(key: key);

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

class _TabsState extends State<Tabs> {
  int currentIndex = 0;
  List _pageList = [HomePage(), CategoryPage(), SettingPage(), EmailPage()];
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Demo'),
        ),
        body: _pageList[currentIndex],
        bottomNavigationBar: BottomNavigationBar(
          type: BottomNavigationBarType.fixed,
          currentIndex: currentIndex,
          onTap: (int index) {
            setState(() {
              currentIndex = index;
            });
          },
          items: const [
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              label: "首页",
            ),
            BottomNavigationBarItem(
                icon: Icon(Icons.category), title: Text("分类")),
            BottomNavigationBarItem(icon: Icon(Icons.mail), title: Text("邮件")),
            BottomNavigationBarItem(
                icon: Icon(Icons.settings), title: Text("设置")),
          ],
        ),
      ),
      theme: ThemeData(
        primarySwatch: Colors.yellow,
      ),
    );
  }
}

在main.dart中运行

// ignore_for_file: prefer_const_constructors, prefer_collection_literals, deprecated_member_use, unused_local_variable, must_be_immutable, prefer_const_literals_to_create_immutables, avoid_print

import 'package:flutter/material.dart';
import 'pages/Tabs.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Tabs();
  }
}


文件结构及运行结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter BottomNavigationBar组件(底部导航栏) 的相关文章

随机推荐

  • 智慧煤矿技术理论篇1-5G与WiFi6技术

    5G VS WiFi6 5G技术 第五代移动通信技术 英语 5th generation mobile networks或5th generation wireless systems 5th Generation 简称5G或5G技术 是最
  • 数据结构-栈和队列(C/C++)

    栈和队列 一 实验目的 熟练掌握栈以及队列的结构特点 二 实验内容 运用栈和队列的结构特点完成相应的基本操作和实例 三 实验步骤 过程以及运行程序截图 栈 问题1 栈的基本操作 在插入栈元素的时候做一个统一输入 达到一次性任意输入0 Sta
  • 【每日一练】79—CSS实现扫描二维码动画

    二维码的应用越来越普通 加个好友 付个款 做个核酸 想去一个地方 还要扫个场所码 总之 需要二维码的地方越来越多 因此 在这样的大环境里 如何让你的码与众不同 引人注意 就显得非常重要 今天我们就来练习一个二维码的动画效果 具体效果如下 看
  • html5自带属性验证表单必填

    html5自带属性验证表单必填 2014年02月25日 Html5 共 366字 字号 小 中 大 6条评论 阅读 6 515 次 为了防止恶意注册 通常会验证表单必填 实现方法以js为主 略微麻烦 今天才发现 html5如今已自带验证表单
  • 注册表常用键值意义

    HKEY CURRENT USER Software Policies Microsoft Internet Explorer Control Panel Internet Explorer选项类 HomePage dword 000000
  • IDEA下java程序的简单调试

    一 本次任务实现的是一个java的程序调试 首先本次进行调试的一个程序是实现从1累加到100的功能 是在IDEA下进行编写的 如图所示 将其运行之后得到的结果如图所示 把第12行的输出语句给取消掉注释之后再运行一次得到的结果如图所示 这里由
  • day15

    文章目录 一 平衡二叉树 二 回溯小难 二叉树的所有路径 三 左叶子之和 一 平衡二叉树 110 平衡二叉树 依旧是使用后序遍历来统计高度 递归过程中 发现某节点的左右子树的高度差超过了1 我们就直接返回 1 不返回节点的高度了 递归函数的
  • CentOS安装Docker详细步骤

    一 简介 Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 然后发布到任何流行的 Linux 或 Windows 操作系统的机器上 也可以实现虚拟化 容器是完全使用沙箱机制 相互之间不会有任何
  • ubuntu下搭建elasticsearch集群

    在Ubuntu 18 04 1 LTS搭建一个简单的elasticsearch集群demo 具体情况如下 集群名称 elasticsearch cluster demo 主节点 1个 node master one 数据节点 2个 node
  • 【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现

    前言 在开发一款无线射频产品的时候 软件是一部分 硬件也是一部分 而决定无线收发性能的 首先是硬件的匹配电路 然后才到软件部分的优化 一款无线射频产品 首先需要先决定是在那个频率范围内 当然是国家允许的范围内 然后硬件则需要在基于这个频点范
  • 逻辑综合——工艺库

    一 库文件的设置 运行DC时需要用到的库文件有 目标库 target library 链接库 link library 符号库 symbol library 算术运算库 synthetic library 1 目标库 目标库是综合后电路网表
  • xml转义字符

    在mybatis在编写sql时不能在XML里直接使用 lt 或者是 gt 在这里需要使用转义字符替换 下面列举常用的xml转义对应 1 lt lt 小于号 2 gt gt 大于号 3 amp 和 4 apos 单引号 5 quot 双引号
  • 【前端知识点总结】Vue(一) 脚手架 及 ESlint

    Vue 前端攻城狮必备技能 1 什么是 Vue 渐进式 javacript 框架 渐进式 按需添加功能 逐渐集成 框架 拥有自己的语法规则 例 Vue 项目对其依赖很高 业务开发中如果选择了框架最好不要轻易更换框架 否则需要重构的地方很多
  • 软件版本详细对比alpha,beta,Gamma,RC,RT

    开源软件发布的时候 经常有alpha beta RC1 RC2 RC3等等 看得云里雾里 不知道啥意思 做了个简单总结 缩写 全称 中文意思 详细说明 功能与bug alpha 内测 开发团队内部测试的版本或者有限用户体验测试版本 功能不全
  • SylixOS IDE工具使用

    1 问题描述 使用RealEvo IDE 以下简称IDE 开发程序时 误操作输入错误的函数名称时 编译器不会报错 输入错误的函数名示例代码如程序清单1 1所示 程序清单 1 1 示例代码 include
  • 软件自动化测试对软件产品起到什么作用?有什么注意事项?

    自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程 通常 在设计了测试用例并通过评审之后 由测试人员根据测试用例中描述的规程一步步执行测试 得到实际结果与期望结果的比较 一 软件自动化测试的作用 1 提高测试效率 自动化测试可以大幅
  • 小记MAC安装GIT

    MAC安装GIT教程 0 安装方式说明 MAC安装软件的时候 有一个很好用的工具 叫 homebrew 大家可以试一下 我这里采用下载安装包的方式进行 1 下载git 我这里就暂且选择git最新版本 2 36 1 正常情况下 我们一般不选择
  • 经典的笔试题解析《高质量C/C++编程》

    对于 高质量C C 编程 想必这个已经是早已成名的经典书籍了 在此 笔者借用两三个题目 解析下面代码 错误示列 请勿模仿 正确的代码 在后面部分 include
  • 快排 + 二分

    一直觉得快排跟二分很像 大家也都有很多变种 在此整理一下 快排的特点是 需要一个pivort 让左边比他大 右边比他小 反之亦然 每次排序都有一个数的位置被确定 两种写法其实是一种 经典partition写在一个函数里 class Solu
  • Flutter BottomNavigationBar组件(底部导航栏)

    Flutter BottomNavigationBar 组件 BottomNavigationBar 常见的属性 属性名 说明 items List 底部导航条按钮集合 页面集合 iconSize icon currentIndex 默认选