热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Flutter学习笔记仿闲鱼底部导航栏带有中间凸起图标

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标相关的知识,希望对你有一定的参考价值。










Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标


霸图镇楼



仿闲鱼底部导航栏带有中间凸起图标





需求情景:  需要实现一个类似闲鱼APP的底部导航栏的实现





Demo地址 :  https://github.com/hanlin19900610/flutter_bottom_navigation_bar



要实现的效果如图



Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标









好的,下面开始上代码了:


一. 在main.dart文件中,定义APP的入口信息

import 'package:flutter/material.dart';
import 'pages/MainPage.dart';
void main() => runApp(LightLanguageClient());
class LightLanguageClient extends StatelessWidget{  
 @override  Widget build(BuildContext context) {    
   return MaterialApp(      title: 'Demo',      theme: ThemeData(        primarySwatch: Colors.blue      ),      home: MainPage(),    );  } }


二. 我们需要定义三个页面,功能类似android的Fragment,分别为HomePage.dart, AssistantPage.dart,MinePage.dart, 这三个页面的代码很简单:

import 'package:flutter/material.dart';
class HomePage extends StatefulWidget{  
 @override  State createState() {    
   return _HomePageState();  } }
class _HomePageState extends State<HomePage>{
 @override  Widget build(BuildContext context) {    
   return MaterialApp(      home: Scaffold(        body: Center(          child: Text('这是首页'),        ),      ),    );  } }


 这个三个页面的代码都一样就没有都贴出来





三.现在我们就需要去创建我们的主页了,”MainPage.dart”文件

第一步,我们先去实现一个最简单的底部导航栏

import 'package:flutter/material.dart';
import 'HomePage.dart';import 'AssistantPage.dart';
import 'MinePage.dart';
class MainPage extends StatefulWidget {  
 @override
 State createState() {    
   return _MainPage();
 }
}
class _MainPage extends State<MainPage> with SingleTickerProviderStateMixin {
 PageController pageController;  
 int page = 0;  
 @override
 Widget build(BuildContext context) {    
   return MaterialApp(
     home: Scaffold(
       body: new PageView(
         children: [HomePage(), AssistantPage(), MinePage()],
         controller: pageController,
         onPageChanged: onPageChanged,
     ),
     bottomNavigationBar: BottomNavigationBar(
       items: [
         BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('首页')),
         BottomNavigationBarItem(icon: Icon(Icons.assessment), title: Text('助手')),
         BottomNavigationBarItem(icon: Icon(Icons.person), title: Text('我的')),
       ],
       onTap: onTap,
       currentIndex: page,
     ),
   ));
 }  
 @override
 void initState() {    
   super.initState();
   pageCOntroller= PageController(initialPage: this.page);
 }  
 @override
 void dispose() {
   super.dispose();
   pageController.dispose();  
 }  
   
 void onTap(int index) {
   pageController.animateToPage(index,
       duration: const Duration(milliseconds: 300), curve: Curves.ease);
 }  
 
 void onPageChanged(int page) {
   setState(() {      
     this.page = page;
   });
 }
}



在MainPage.dart中我们用到了几个控件:

1. PageView : 此控件类似Android的ViewPager,把之前创建的3个页面一次添加进去,之后需要给PageView设置一个控制器-PageController,给PageView设置一个onPageChanged页面切换监听方法,此方法的功能类似与Android中ViewPager中的OnPageChangeListener里的监听方法

2. BottomNavigationBar :此控件主要用于配置底部导航栏,详细用法请参见官方文档,在此控件的使用中,我们需要设置三个属性,


  1. items: 添加底部导航栏的每个Item


  2. onTap: 为底部导航栏设置点击事件


  3. currentIndex: 为底部导航设置当前选中项



Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标


四.我们要实现仿闲鱼的底部导航栏,需要重构一下底部导航栏,


重构方案:

    1.把中间的文字去掉

    2.在BottomNavigationBar控件的中上的位置放入一个图片

    3.重构底部导航的事件方法

    4.禁止PageView的滑动事件

现在开始重构:

1.要在BottomNavigationBar上面覆盖一个图片,我们需要用到一个布局Widget—-Stack,类似于Framelayout

class _MainPage extends State<MainPage> with SingleTickerProviderStateMixin {
 PageController pageController;
 int page = 0;  //添加图片地址,需要动态更换图片
 String bigImg = 'images/home_green.png';
 @override
 Widget build(BuildContext context) {    
   return MaterialApp(
     home: Scaffold(
     body: new PageView(
       children: [HomePage(), AssistantPage(), MinePage()],
       controller: pageController,
       onPageChanged: onPageChanged,
     ),      //重构bottomNavigationBar
     bottomNavigationBar: Stack(
       children: [
         Align(
           alignment: Alignment.bottomCenter,
           child: BottomNavigationBar(
             items: [
               BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('首页')),
               BottomNavigationBarItem(icon: Icon(Icons.assessment), title: Text('')),
               BottomNavigationBarItem(icon: Icon(Icons.person), title: Text('我的')),
             ],
             onTap: onTap,
             currentIndex: page,
           ),
         ),
         Align(
           alignment: Alignment.bottomCenter,
           child: InkWell(
             child: new Image.asset(bigImg,width: 80.0,height: 80.0,),
             onTap:onBigImgTap,
           ),
         )
       ],
     )
   ));
 }  
 @override
 void initState() {    
   super.initState();
   pageCOntroller= PageController(initialPage: this.page);
 }  
 @override
 void dispose() {
   super.dispose();
   pageController.dispose();    
 }
 //修改bottomNavigationBar的点击事件
 void onTap(int index) {    
   if (index != 1) {
     setState(() {        
       this.bigImg = 'images/home_green.png';
     });
   }
   pageController.animateToPage(index,
       duration: const Duration(milliseconds: 300), curve: Curves.ease);
 }
 //添加图片的点击事件
 void onBigImgTap() {
   setState(() {      
     this.page = 1;      
     this.bigImg = 'images/icon_home.png';
     onTap(1);
   });
 }  
 void onPageChanged(int page) {
   setState(() {      
     this.page = page;
   });
 }
}


重构完成之后,效果图如下,我们发现这并不是我们想要的,底部导航栏我们是实现了,但是PageView被遮盖了


Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标


PageView被遮盖的解决办法,我们给Stack添加一个可以指定高度的父级—Container,修改的代码如下:

bottomNavigationBar: Container(
           height: 100.0,
           child: Stack(
             children: [
               Align(
                 alignment: Alignment.bottomCenter,
                 child: BottomNavigationBar(
                   items: [
                     BottomNavigationBarItem(
                         icon: Icon(Icons.home), title: Text('首页')),
                     BottomNavigationBarItem(
                         icon: Icon(Icons.accessibility_new), title: Text('')),
                     BottomNavigationBarItem(
                         icon: Icon(Icons.person), title: Text('我的')),
                   ],
                   onTap: onTap,
                   currentIndex: page,
                 ),
               ),
               Align(
                   alignment: Alignment.bottomCenter,
                   child: Padding(
                     padding: const EdgeInsets.only(bottom: 10.0),
                     child: InkWell(
                       child: new Image.asset(
                         bigImg,
                         width: 80.0,
                         height: 80.0,
                       ),
                       onTap: onBigImgTap,
                     ),
                   )),
             ],
           ),
         )

然后我们需要禁止PageView的滑动,我们只需要在给PageView设置一个属性就好了

physics: NeverScrollableScrollPhysics(),

在运行Flutter项目的时候出现了一个问题,运行时会出现一段时间的白屏,解决办法:


解决方案很简单,Android原生的白屏问题可以通过为 Launcher Activity 设置 windowBackground 解决,而 Flutter 也是基于此办法,同时优化了 Flutter 初始化阶段的白屏问题(覆盖一个launchView),只用两步设置便能解决 Flutter 中白屏问题。


在项目的 android/app/src/main/res/mipmap-xhdpi/ 目录下添加闪屏图片;


打开 android/app/src/main/res/drawable/launch_background.xml 文件,这个文件就是闪屏的背景文件,具体如何设置可以查阅 Android Drawable,我在 demo 中的设置如下:





"1.0" encoding="utf-8"?> "http://schemas.android.com/apk/res/android">  "@android:color/background_dark" />    "84dp">    "@mipmap/launch_image" />  



如此一来,我们就完成了,文章开始提出的需求了.



Demo地址 :  https://github.com/hanlin19900610/flutter_bottom_navigation_bar






刚开始接触Flutter,代码写的有些混乱,可能有些问题考虑不是很深入,有不足之处,还请各位大佬指出





推荐阅读


1. Flutter中文网   https://flutterchina.club/

2. 阿韦大神的Github   https://github.com/AweiLoveAndroid/Flutter-learning

3. Flutter学习笔记 - 底部导航栏  https://blog.csdn.net/u011045726/article/details/79583423














Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标






扫一扫






















点击阅读原文,了解更多精彩内容













推荐阅读
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 刷题笔记:探索乘积小于K的子数组问题 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 使用React与Ant Design 3.x构建IP地址输入组件
    本文深入探讨了利用React框架结合Ant Design 3.x版本开发IP地址输入组件的方法。通过详细的代码示例,展示了如何高效地创建具备良好用户体验的IP输入框,对于前端开发者而言具有较高的实践指导意义。 ... [详细]
  • MacBook上Vim基础个性化设置指南
    在MacBook上进行Vim的基础个性化设置,首先需要在终端中输入 `vim ~/.vimrc`。接着,将以下配置代码粘贴到 `.vimrc` 文件中:```vimset tabstop=4set numbersyntax oncolorscheme murphy```此外,Vim提供了多种配色方案供用户选择,建议自行探索并选择最适合自己的配色文件。通过这些简单的步骤,你可以显著提升Vim的使用体验。 ... [详细]
  • 开发技巧分享:利用套索与矩形选择工具高效选取绘图中的全部字形节点
    开发技巧分享:利用套索与矩形选择工具高效选取绘图中的全部字形节点 ... [详细]
  • 深入解析Android中图像资源的内存占用问题及其优化策略
    在Android开发过程中,图像资源的内存占用是一个值得关注的问题。本文将探讨图像内存占用与哪些因素相关,包括设备性能的影响,并提供一系列优化策略,帮助开发者有效管理图像资源,提升应用性能。 ... [详细]
  • 本文深入探讨了Linux内核网络协议栈中sk_buff结构体的操作函数,详细解析了其在数据包处理过程中的关键作用与实现机制,为开发者提供了深入了解和优化网络性能的宝贵资源。 ... [详细]
  • 效果预览1基本使用代码voidmain(){启动根目录runApp(MaterialApp(home:TestTipsPage(),));}classTestTipsPageext ... [详细]
author-avatar
mobiledu2502855777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有