7、Flutter - 项目实战 - 仿微信(一)BottomNavigationBar 4个主页面显示

本文主要是介绍7、Flutter - 项目实战 - 仿微信(一)BottomNavigationBar 4个主页面显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目实战 - 仿微信(一)BottomNavigationBar 4个主页面显示

 

代码详细代码参见Demo

Demo地址 -> wechat_demo

 

其他相关联文章

7、Flutter - 项目实战 - 仿微信(一)BottomNavigationBar 4个主页面显示

8、Flutter - 项目实战 - 仿微信(二)发现页面

9、Flutter - 项目实战 - 仿微信(三)我的页面

10、Flutter - 项目实战 - 仿微信(四)数据准备

11、Flutter - 项目实战 - 仿微信(五)通讯录

12、Flutter - 项目实战 - 仿微信(六)聊天页面

 

 

要实现的效果就是如下图的  BottomNavigationBar 能点击并切换页面

 

代码详细代码参见Demo(目前还有点小问题,不影响本片文章所诉内容的功能。后面写文章的时候会处理掉)

Demo地址 -> wachat_demo

创建工程和创建文件就不在说明,同时为了后面优化和修改将 BottomNavigationBar 功能抽取到一个类中实现,其他实现方式不再讲解

 

1、main

import 'package:flutter/material.dart';
import 'package:wechat/root_page.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {// This widget is the root of your application.@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(//1, 0, 0, 0.0 设置为透明 0.0透明度 item长按highlightColor: Color.fromRGBO(1, 0, 0, 0.0),//tabbar item点击splashColor: Color.fromRGBO(1, 0, 0, 0.0),cardColor: Color.fromRGBO(1, 1, 1, 0.5),primarySwatch: Colors.blue,//点击的水波纹去掉。tabbar//visualDensity: VisualDensity.adaptivePlatformDensity,),home: RootPage(),);}
}

1.1、ThemeData

在Flutter中使用ThemeData来在应用中共享颜色和字体样式,Theme有两种:全局Theme和局部Theme。 全局Theme是由应用程序根MaterialApp创建的Theme 。

参考:https://www.jianshu.com/p/8d8ded72e673

  1. highlightColor: Color.fromRGBO(1, 0, 0, 0.0),   //bar 的长按背景颜色设置为透明
  2. splashColor: Color.fromRGBO(1, 0, 0, 0.0),    //bar的点击背景颜色设置为透明
  3. cardColor: Color.fromRGBO(1, 1, 1, 0.5),       // 用在卡片(Card)上的Material的颜色。
  4. primarySwatch: Colors.blue,                          //主题颜色,除了tabbar、navigationBar之外,还有其他地方的主题颜色

 

1.2、MaterialApp

MaterialApp 是符合MaterialApp Design设计理念的入口Widget,从源码可以看出该widget的构造方法中有多个参数,但是基本上大多数参数是可以省略的。

MaterialApp({Key key,this.title = '', // 设备用于为用户识别应用程序的单行描述this.home, // 应用程序默认路由的小部件,用来定义当前应用打开的时候,所显示的界面this.color, // 在操作系统界面中应用程序使用的主色。this.theme, // 应用程序小部件使用的颜色。this.routes = const <String, WidgetBuilder>{}, // 应用程序的顶级路由表this.navigatorKey, // 在构建导航器时使用的键。this.initialRoute, // 如果构建了导航器,则显示的第一个路由的名称this.onGenerateRoute, // 应用程序导航到指定路由时使用的路由生成器回调this.onUnknownRoute, // 当 onGenerateRoute 无法生成路由(initialRoute除外)时调用this.navigatorObservers = const <NavigatorObserver>[], // 为该应用程序创建的导航器的观察者列表this.builder, // 用于在导航器上面插入小部件,但在由WidgetsApp小部件创建的其他小部件下面插入小部件,或用于完全替换导航器this.onGenerateTitle, // 如果非空,则调用此回调函数来生成应用程序的标题字符串,否则使用标题。this.locale, // 此应用程序本地化小部件的初始区域设置基于此值。this.localizationsDelegates, // 这个应用程序本地化小部件的委托。this.localeListResolutionCallback, // 这个回调负责在应用程序启动时以及用户更改设备的区域设置时选择应用程序的区域设置。this.localeResolutionCallback, // this.supportedLocales = const <Locale>[Locale('en', 'US')], // 此应用程序已本地化的地区列表 this.debugShowMaterialGrid = false, // 打开绘制基线网格材质应用程序的网格纸覆盖this.showPerformanceOverlay = false, // 打开性能叠加this.checkerboardRasterCacheImages = false, // 打开栅格缓存图像的棋盘格this.checkerboardOffscreenLayers = false, // 打开渲染到屏幕外位图的图层的棋盘格this.showSemanticsDebugger = false, // 打开显示框架报告的可访问性信息的覆盖this.debugShowCheckedModeBanner = true, // 在选中模式下打开一个小的“DEBUG”横幅,表示应用程序处于选中模式
}) 

参考 :https://www.jianshu.com/p/20ce0fe051a1

 

 

2、root_page

这里用到的几个主页面引用,这几个页面后面再做介绍。这里不做详细说明,只要先创建这几个页面能显示出来即可

import 'package:flutter/material.dart';
import 'package:wechat/pages/chat/chat_page.dart';
import 'package:wechat/pages/discover/discover_page.dart';
import 'package:wechat/pages/friends.dart';
import 'package:wechat/pages/mine.dart';class RootPage extends StatefulWidget {@override_RootPageState createState() => _RootPageState();
}List<Widget> _pages = [ChatPage(),FriendsPage(),DiscoverPage(),MinePage(),
];class _RootPageState extends State<RootPage> {int _currentIndex = 0;final PageController _controller = PageController(initialPage: 0);@overrideWidget build(BuildContext context) {return Scaffold(body: PageView(//页面滚动变化时调用
//        onPageChanged: (int index){
//          _currentIndex = index;
//          setState(() {});
//        },physics: NeverScrollableScrollPhysics(), //禁止页面滚动,tabbar页面controller: _controller,children: _pages,),bottomNavigationBar: BottomNavigationBar(onTap: (index) {setState(() {_currentIndex = index;});_controller.jumpToPage(index);},//tabbar item字体大小selectedFontSize: 12.0,currentIndex: _currentIndex, //默认启动显示的item 从0开始fixedColor: Colors.green, //选中的颜色type: BottomNavigationBarType.fixed, //固定items: [BottomNavigationBarItem(icon: Image.asset('images/tabbar_chat.png',width: 20,height: 20,),activeIcon: Image.asset('images/tabbar_chat_hl.png',width: 20,height: 20,),title: Text('微信')),BottomNavigationBarItem(icon: Image.asset('images/tabbar_friends.png',width: 20,height: 20,),activeIcon: Image.asset('images/tabbar_friends_hl.png',width: 20,height: 20,),title: Text('通讯录')),BottomNavigationBarItem(icon: Image.asset('images/tabbar_discover.png',width: 20,height: 20,),activeIcon: Image.asset('images/tabbar_discover_hl.png',width: 20,height: 20,),title: Text('发现')),BottomNavigationBarItem(icon: Image.asset('images/tabbar_mine.png',width: 20,height: 20,),activeIcon: Image.asset('images/tabbar_mine_hl.png',width: 20,height: 20,),title: Text('我')),],),);}
}

 

2.1、Stateful

Stateful 里面 是树状结构,里面一旦build 是从头至尾全部重新渲染
尽可能的少用Stateful ,如果界面上只有少部分是需要变化的,就不需要全部都用stateful, 不需要变化的可以用 stateless

Scaffold 实现了基本的Material布局,只要是在 Material 中定义了的单个界面显示的布局控件元素,都可以使用Scaffold 来绘制。可以理解为布局的容器,用以绘制我们的界面

提供展示抽屉(drawers,比如:左边栏)、通知(snack bars) 以及底部按钮(bottom sheets)。


Scaffold 主要的属性说明

    appBar:显示在界面顶部的一个 AppBar
    相关连接:https://flutterchina.club/catalog/samples/

    body:当前界面所显示的主要内容

    floatingActionButton: 在 Material 中定义的一个功能按钮。

    persistentFooterButtons:固定在下方显示的按钮。https://material.google.com/components/buttons.html#buttons-persistent-footer-buttons

    drawer:侧边栏控件

    bottomNavigationBar:显示在底部的导航栏按钮栏。可以查看文档:Flutter学习之制作底部菜单导航

    backgroundColor:背景颜色

    resizeToAvoidBottomPadding: 控制界面内容 body
    是否重新布局来避免底部被覆盖了,比如当键盘显示的时候,重新布局避免被键盘盖住内容。默认值为 true。

 

2.2、资源配置

Flutter中使用功能的图片,并不想xcode 中直接拖入用图片名那么简单,是需要配置并且使用图片路径的。

2.2.1、首先将images文件夹及其资源文件,copy到工程中

 

2.2.2、配置安卓项目使用图片 和 icon

 

2.2.3、配置安卓启动图

 

2.2.4、配置 iOS的启动图和icon

配置ios,不过多说明。用xcode配置就行了

 

3、外部变量访问

 

目前先做了 BottomNavigationBar 的点击显示4个主要页面,后面会挨个实现这4个页面。主要是模仿微信的界面样式,熟悉Flutter的UI 及其布局。如文中有错误还望指正,共同进步。

 

这篇关于7、Flutter - 项目实战 - 仿微信(一)BottomNavigationBar 4个主页面显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431828

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10