flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar

tabbar在app中非常常见,底部BottomNavigationBar属性

在这里插入图片描述
在这里插入图片描述

一、BottomNavigationBar属性

BottomNavigationBar组件的常用属性:

  • type:tabbar样式,默认为白色不显示;
  • fixedColor:tabbar选中颜色;
  • currentIndex:当前选中的Item的index
  • selectedFontSize:选中的title的size (默认14.0)
  • unselectedFontSize:未选中的title的size (默认12.0)
  • backgroundColor:背景色
  • iconSize:icon图片的size (默认是24.0)
  • items

二、代码实现

这里我代码进行了拆分。

2.1、main_sub_pages.dart代码

main_sub_pages.dart

List<Widget> mainPages = <Widget>[HomePage(),QrScanEntryPage(),MinePage(),
];List<String> mainRouterNames = <String>[RouterName.home,RouterName.scanEntry,RouterName.mine,
];

2.2、main_tab_navigator.dart代码

main_tab_navigator.dart

// 在MainTabNavigator中,使用到了PageView.builder

PageView 是一个非常重要的组件,因为在移动端开发中很常用,比如大多数 App 都包含 Tab 换页效果、图片轮动以及抖音上下滑页切换视频功能等等

class MainTabNavigator extends StatefulWidget {const MainTabNavigator({Key? key}) : super(key: key);State<MainTabNavigator> createState() => _MainTabNavigatorState();
}class _MainTabNavigatorState extends State<MainTabNavigator> {PageController _pageController = PageController();int _selectedIndex = 0;late DateTime _lastPressed;List<Widget> subMainPages = [];void initState() {// 检查app更新checkAppUpdate();// 设置默认的subMainPages = mainPages;super.initState();}void checkAppUpdate() {}Widget build(BuildContext context) {return Scaffold(resizeToAvoidBottomInset: false,body: WillPopScope(onWillPop: () async {if (_lastPressed == null ||DateTime.now().difference(_lastPressed) > Duration(seconds: 1)) {//两次点击间隔超过1秒则重新计时_lastPressed = DateTime.now();return false;}return true;},child: PageView.builder(itemBuilder: (BuildContext context, int index) {return KeepAliveWrapper(child: subMainPages[index], keepAlive: true);},itemCount: subMainPages.length,controller: _pageController,physics: NeverScrollableScrollPhysics(),onPageChanged: (index) {setState(() {_selectedIndex = index;});},),),bottomNavigationBar: BottomNavigationBar(type: BottomNavigationBarType.fixed,items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home_outlined),label: S.of(context).home,),BottomNavigationBarItem(icon: Icon(Icons.qr_code_scanner_outlined),label: S.of(context).qrScan,),BottomNavigationBarItem(icon: Icon(Icons.nature_outlined),label: S.of(context).mine,),],currentIndex: _selectedIndex,onTap: (index) {_pageController.jumpToPage(index);},),);}
}

2.2、main_page.dart代码

main_page.dart

class MainPage extends StatefulWidget {const MainPage({Key? key}) : super(key: key);State<MainPage> createState() => _MainPageState();
}class _MainPageState extends State<MainPage> {Widget build(BuildContext context) {return Scaffold(body: MainTabContainer(),);}
}class MainTabContainer extends StatefulWidget {const MainTabContainer({Key? key}) : super(key: key);State<MainTabContainer> createState() => _MainTabContainerState();
}class _MainTabContainerState extends State<MainTabContainer> {Widget build(BuildContext context) {return MainTabNavigator();}
}

2.3、在App入口页面设置

return MaterialApp(theme: ThemeData(fontFamily: "PingFang SC",primarySwatch: themeModel.theme,),navigatorKey: OneContext().key,debugShowCheckedModeBanner: false,supportedLocales: S.delegate.supportedLocales,locale: localeModel.getLocale(),initialRoute: RouterName.main,	// 默认mainonGenerateRoute: RouterManager.generateRoute,
);

这里在router_manager配置main

class RouterManager {// ignore: missing_returnstatic Route<dynamic> generateRoute(RouteSettings settings) {LoggerManager().debug("generateRoute: ${settings}, name:${settings.name}");switch (settings.name) {case RouterName.agreement:{return NoAnimRouteBuilder(const ProtocolAgreementPage());}break;case RouterName.main:{return NoAnimRouteBuilder(const MainPage());}break;default:return MainTabNavigator();}}
}

至此实现了flutter开发实战-底部bottomNavigationBar➕PageView,tabbar切换效果

三、小结

flutter开发实战-底部bottomNavigationBar➕PageView,tabbar切换效果,配置MaterialApp的onGenerateRoute与initialRoute。

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp:实现在APP外点击复制,进入APP后,获取到复制内容

添加安卓权限 在android>permissions中新增以下权限 "<uses-permission android:name\"android.permission.READ_EXTERNAL_STORAGE\"/>", "<uses-permission android:name\"android.permission.WRITE_EXTERNAL_STORAGE\"/>…

S3C2440使用GPIO输入功能控制按键

文章目录 前言一、设置GPIO输入模式二、检测开关1.配置功能2.具体实现 总结 前言 由于上期分享的使用GPIO去控制引脚输出模式点亮LED&#xff0c;那么本期主要介绍一下使用GPIO设置为输入模式&#xff0c;用到的硬件有板载的按键&#xff1b;开发环境也是依赖于S3C2440开发板&…

TCP/IP网络编程 第十五章:套接字和标准I/O

标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义&#xff0c;至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…

DEEP LEARNING INTERVIEWS

DEEP LEARNING INTERVIEWS CRACKING THE MACHINE LEARNING INTERVIEW 225 Machine Learning Interview Questions with Solutions

【AI底层逻辑】——篇章3(下):信息交换信息加密解密信息中的噪声

续&#xff1a;【AI底层逻辑】——篇章3&#xff08;上&#xff09;&#xff1a;数据、信息与知识&香农信息论&信息熵 目录 三、信息是如何交换的 1、互联网与信息交换 2、哈夫曼和有效编码 四、信息的加密与解密 1、密码学的发展 2、可以被公开的密钥 五、信息…

FFmpeg —— 视频帧保存为RAW格式(附上源码)

效果 RAW RAW图像格式的目的是尽可能的捕捉(即特定传感器的最好性能)现场的拍摄特性,也就是说,包含有关场景的光照强度和颜色的物理信息。 最原始的图像文件格式存储的信息根据收到传感器的照片,接受元素,而不是点的最终图像(有时称为像素)的几何形状:六角形元素位移传…

python selenium.webdriver 爬取政策文件

文章目录 获取文章链接批量爬取政策文件应用selenium爬取文件信息数据处理导出为excel 获取文章链接 获取中央人民政府网站链接&#xff0c;进入国务院政策文件库&#xff0c;分为国务院文件和部门文件&#xff08;发改委、工信部、交通运输部、市场监督局、商务部等&#xff…

2023网络安全常见面试题汇总(附答案解析+配套资料)

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;所有的资料都整理成了PDF&#xff0c;面试题和答案将会持续更新&#xff0c;因为无论如何也不可能覆盖所有的面试题。 目录 一、渗透测试…

【Python】PyCharm中调用另一个文件的函数或类

&#x1f389;欢迎来到Python专栏~PyCharm中调用另一个文件的函数或类 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&…

Kafka 源码编译部署包

1. 版本 Java 版本: 1.7.0_80 Gradle 版本: 4.8.1 Kafka 版本: 0.11 2.打包 git clone https://github.com/apache/kafka.git cd kafka git checkout 0.11.0 编译整个工程的 tar 包&#xff0c;编译一次 5 分钟左右 gradle clean build releaseTarGz -x test cd core\build\di…

Linux Shell 脚本编程学习之【第2章 Linux文件系统和文本编辑器(第一部分)】

第2章 Linux文件系统和文本编辑器 1 用户和用户组1.1 概念1.2 命令用户组 (groupaddgroupdelgroupmod)用户 (useraddadduseruserdelusermod) 3 文件和文件夹3.1 概念3.2 文件操作命令文件清单命令(ls)文件复制命令(cp)文件移动命令(mv)文件删除目录(rm) 3.3 目录操作命令创建目…

数据分析案例-数据分析师岗位招聘信息可视化

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

LLM - Hugging Face 工程 BERT base model (uncased) 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131400428 BERT是一个在大量英文数据上以自监督的方式预训练的变换器模型。这意味着它只是在原始文本上进行预训练&#xff0c;没有人以…

MySQL:聚合函数(全面详解)

聚合函数 前言一、聚合函数介绍1、AVG和SUM函数2、 MIN和MAX函数3、COUNT函数 二、GROUP BY1、基本使用2、使用多个列分组3、 GROUP BY中使用WITH ROLLUP 三、HAVING1、基本使用2、WHERE和HAVING的对比 四、 SELECT的执行过程1、查询的结构2、SELECT执行顺序3、SQL 的执行原理 …

积分图像、图像分割、Harris角点检测

目录 1、积分图像 2、图像分割--漫水填充 3、图像分割--分水岭法 4、Harris角点检测 1、积分图像 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;//积分图像 int test() {//创建一个1616全为1的矩阵,因为2561616M…

Matlab实现周期卷积

周期卷积是信号处理中常用的一种操作&#xff0c;可以用于信号的滤波、调制、卷积等方面。在Matlab中&#xff0c;我们可以使用fft函数实现周期卷积。本文将介绍如何使用Matlab实现周期卷积。 首先&#xff0c;我们需要准备两个周期信号。周期信号是一种在一定时间间隔内重复的…

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图)

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图) 目录 分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图…

Antd List组件增加gutter属性后出现横向滚动,如何解决

第一次使用ant design的List列表组件&#xff0c;设置gutter间隔属性后&#xff0c;页面出现了横向滚动条&#xff0c;查阅文档发现是由于加间隔后导致容器宽度被撑开&#xff0c;ant design官方默认给外层容器加了margin-left和margin-right 解决方法是在外层容器预留一定的pa…

用宏定义完成整数的二进制位的奇偶位互换

代码如下&#xff1a; #include <stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1))int main() {int num 1010;printf("%d\n", num);printf("%d\n", SWAP(num));return 0; }思路如下&…

MySQL数据备份与还原、索引、视图

一.备份与还原 /***************************样例表***************************/ CREATE DATABASE booksDB; use booksDB; CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL …