前言

Google推出flutter这样一个新的高性能跨平台(Android,ios)快速开发框架之后,被业界许多开发者所关注。我在接触了flutter之后发现这个确实是一个好东西,好东西当然要和大家分享,对吧。

今天要跟大家分享的是底部导航功能的实现。我认为flutter的就是在传达一种最简设计,一个部件只关注它本身,达到低耦合高内聚。所以本文讲解底部导航将只关注该功能的实现,并对布局思路进行介绍。

你将学到什么

  • 如何将部件拆分
  • 如何构建flutter布局
  • 如何创建底部导航

首先让大家看看效果。

这是一个最简单的底部导航案例,我不希望引入过多其他东西,把初学者的脑子搞得很乱(这也是我在学习中所遇到的)。

建立布局

第一步:绘制布局视图

将布局分解为基本元素:

  • 页面是由哪些元素构成的
  • 哪些控件会因为用户的交互而发生变化,哪些不会

在这个应用中我们期望能够通过点击底部导航栏就能切换上面的整个页面。这个行为触发了页面的刷新。

这里我们需要思考一个问题,刷新的范围在哪里?

用过手机app的同学都知道,我们可以点击底部导航栏,底部是不会刷新的,而刷新的只有上面部分。所以我们可以把整个页面拆成两部分。

第一个部分是橘色框里的页面部分,第二个部分是我们底部的导航器部分。而导航器是一直不变的,所以导航器应该是在它们之中处于父级widget层次。

第二步:开始构造底部导航


class BottomNavigationWidget extends StatefulWidget {@overrideState<StatefulWidget> createState() => BottomNavigationWidgetState();
}class BottomNavigationWidgetState extends State<BottomNavigationWidget> {final _bottomNavigationColor = Colors.blue;int _currentIndex = 0;@overrideWidget build(BuildContext context) {return Scaffold(bottomNavigationBar: BottomNavigationBar(items: [BottomNavigationBarItem(icon: Icon(Icons.home,color: _bottomNavigationColor,),title: Text('HOME',style: TextStyle(color: _bottomNavigationColor),)),BottomNavigationBarItem(icon: Icon(Icons.email,color: _bottomNavigationColor,),title: Text('Email',style: TextStyle(color: _bottomNavigationColor),)),BottomNavigationBarItem(icon: Icon(Icons.pages,color: _bottomNavigationColor,),title: Text('PAGES',style: TextStyle(color: _bottomNavigationColor),)),BottomNavigationBarItem(icon: Icon(Icons.airplay,color: _bottomNavigationColor,),title: Text('AIRPLAY',style: TextStyle(color: _bottomNavigationColor),)),],currentIndex: _currentIndex,onTap: (int index) {setState(() {_currentIndex = index;});},),);}
}
复制代码

我们这里使用了Scaffold布局,它默认提供了一个bottomNavigationBar的属性,我们在这里给它一个BottomNavigationBar,并在这个BottomNavigationBar中放了四个BottomNavigationBarItem(一下简称item)。每个item就是底部的一个导航按钮。

BottomNavigationBar的items是一个数组,那么就会存在下标。BottomNavigationBar为我们提供了一个currentIndex属性,默认是0,我们进去看看这个方法。

 /// The index into [items] of the current active item.final int currentIndex;
复制代码

currentIndex代表了当前再items中被选中的index。

BottomNavigationBar还提供了一个onTap方法。我们再看看这个方法。

  /// The callback that is called when a item is tapped./// The widget creating the bottom navigation bar needs to keep track of the/// current index and call `setState` to rebuild it with the newly provided/// index.final ValueChanged<int> onTap;
复制代码

当底部导航的一个item被点击时,它会调用此方法,并传入当前item的index值,这样就能改变焦点到当前的index上的item了。

我们来看看效果:

创建切换页面

然后我们需要分别创建四个页面,对映四个item,由于四个页面极为相似这里只放一个。建议大家对这四个页面分别创建一个dart文件。

import 'package:flutter/material.dart';class HomeScreen extends StatefulWidget {@overrideState<StatefulWidget> createState() => HomeScreenState();
}class HomeScreenState extends State<HomeScreen> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('HOME'),),);}
}
复制代码

每个页面都是一个Scaffold布局,有一个appBar。

将页面显示在界面上

我们再回到底部导航这个控件中。 由于我们是通过currentIndex这个变量来控制跳转的,页面要想同步也必须依赖于这个变量。这里我们使用一个List来与items对应。

List<Widget> pages = List<Widget>();final _bottomNavigationBarItemColor = Colors.teal;int _currentIndex = 0;@overridevoid initState() {pages..add(HomeScreen())..add(EmailScreen())..add(AlarmsScreen())..add(ProfileScreen());}
复制代码

然后让我们的BottomNavigation的Scaffold布局中body部分为List中的页面。

body: pages[_bottomNavigationIndex],
复制代码

我们让_currentIndex来控制我们到底再body这个位置上显示哪个页面。这样就能够通过Tap我们的bottomNavigationItem来达到控制页面跳转的作用啦。

相关链接:

完整代码: github.com/Vadaski/Vad…

Youtube教学视频: www.youtube.com/watch?v=iYD…

bilibili教学视频: www.bilibili.com/video/av280…

之后将持续分享一些flutter经验,有任何问题的话欢迎回复,我会很快更新的!

从 0 到 1:我的 Flutter 技术实践 | 掘金技术征文,征文活动正在进行中

Flutter 底部导航——BottomNavigationBar | 掘金技术征文相关推荐

  1. Flutter实现动画卡片式Tab导航 | 掘金技术征文

    前言 本人接触Flutter不到一个月,深深感受到了这个平台的威力,于是不断学习,Flutter官方Example中的flutter_gallery,很好的展示了Flutter各个widget的功能 ...

  2. Flutter完整开发实战详解(二、 快速开发实战篇) | 掘金技术征文

     作为系列文章的第二篇,继<Flutter完整开发实战详解(一.Dart语言和Flutter基础)>之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速 ...

  3. Flutter入门三部曲(3) - 数据传递/状态管理 | 掘金技术征文

    Flutter数据传递 分为两种方式.一种是沿着数的方向从上向下传递状态.另一种是 从下往上传递状态值. 沿着树的方向,向下传递状态 按照Widgets Tree的方向,从上往子树和节点上传递状态. ...

  4. Flutter底部导航栏BottomNavigationBar页面状态保持解决方案

    网易云[玩转大前端]配套课程 EDU配套 教程 Flutter开发的点滴积累系列文章 一行代代码置灰应用?对就是这么干 在实际应用开发中,一般应用的首页面会有这种结构,在Flutter应用开发中,有多 ...

  5. Flutter - 底部导航详解与案例示范

    Flutter - 底部导航栏解析与示范 作者: jcLee95 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm ...

  6. Android 集成 Agora SDK 快速体验 RTC 版多人视频聊天|掘金技术征文

    RTC (Real-Time Communication) 作为实时通讯领域的"新贵",在互动直播.远程控制.多人视频会议.屏幕共享等领域广受好评,如果你还不了解 RTC ,Tak ...

  7. 2万5千字大厂面经 | 掘金技术征文

    以下面试题来自腾讯.阿里.网易.饿了么.美团.拼多多.百度等等大厂综合起来常考的题目. 如何写一个漂亮的简历 简历不是一份记流水账的东西,而是让用人方了解你的亮点的. 平时有在做一些修改简历的收费服务 ...

  8. Flutter 底部导航栏(Tab 页)的快速实现

    Flutter 底部导航栏(Tab 页)的快速实现 我们知道 Scaffold 实现了基本的 Material 布局.只要是在 Material 中定义了的单个界面显示的布局控件元素,都可以使用 Sc ...

  9. 那些年你踩过的坑,都在这里了~| 掘金技术征文

    前言 前段时间面试(包括阿里巴巴的电话面试),遇到过一些试题,且面试中出现机率较高的提问/笔试,有些答的不是很好挂掉了,今天终于有时间整理出来分享给大家,内容主要分为两部分:面试中遇到的.在复习过程中 ...

最新文章

  1. 心中的象牙塔:怎样才能拿到理想的教职offer?
  2. [case39]聊聊jdk httpclient的executor
  3. C++中的inline用法
  4. DataGrid 导出到 Excel 的帮助类
  5. gatsby_使用TinaCMS + Gatsby编辑Markdown的3种方法
  6. 元素属性、类名、内容、获取和设置、删除
  7. Git成立14周年快乐:您对Git钟爱什么?
  8. 第一:MySQL+MyBatis实现对测试用例数据的读取(接口自动化落地)
  9. 中文分词软件SCWS
  10. 嵌入式Linux系统优化的那些事儿
  11. linux透明桥,linux透明防墙(网桥模式).doc
  12. Gartner 魔力四象限 -- 应用安全检测
  13. Android 知识点——Method put in org.json.JSONObject not mocked
  14. [安卓开发] Broadcast 三种广播的使用总结
  15. 7-2 愿天下有情人都是失散多年的兄妹
  16. MySQL、PostgreSQL、NoSQL、CynosDB,究竟谁是数据库王者?
  17. 给真的想【卷】的你们
  18. 哈工大软件构造第一章总结
  19. 计算机专业助我成长400字作文,成长作文400字
  20. 【区块链技术与应用】(二)

热门文章

  1. Ubuntu 14.04安装mysql
  2. BZOJ4943 [NOI2017] 蚯蚓
  3. 将用户名保存至cookie中
  4. 关于 Bootstrap的知识
  5. 一. DotNet MVC4.0+EasyUI Web简单框架-前言
  6. 一步步学习SPD2010--第十章节--SP网站品牌化(9)--理解SP的CSS继承
  7. linux 管理命令 之 管理时间
  8. java学习笔记(三)----成员权限,构造函数,this用法
  9. system , DOS 命令
  10. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )