android仿闲鱼二级菜单,GitHub - shijia2118/flutter_bottom_navigation_bar: Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标...

本文主要是介绍android仿闲鱼二级菜单,GitHub - shijia2118/flutter_bottom_navigation_bar: Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

刚接触Flutter,需要实现一个类似闲鱼APP的底部导航栏的实现

要实现的效果如图:

687474703a2f2f69312e6276696d672e636f6d2f3635353639322f313234666330623535356165666530612e706e67

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

一. 在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{

@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 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() {

pageController.dispose();

super.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 :此控件主要用于配置底部导航栏,详细用法请参见官方文档,在此控件的使用中,我们需要设置三个属性,

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

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

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

3. BottomNavigationBarItem: 此控件是底部导航栏的Item

至此,我们实现了最基本的底部导航栏的实现,效果图如下:

687474703a2f2f69322e6276696d672e636f6d2f3635353639322f626464316431393362363539633563302e676966

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

重构方案:

1.把中间的文字去掉

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

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

4.禁止PageView的滑动事件

现在开始重构:

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

class _MainPage extends State 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() {

pageController.dispose();

super.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被遮盖了

687474703a2f2f69342e6276696d672e636f6d2f3635353639322f383639643661333934653661643336632e676966

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 中的设置如下:

android:bottom="84dp">

android:src="@mipmap/launch_image" />

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

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

推荐阅读

这篇关于android仿闲鱼二级菜单,GitHub - shijia2118/flutter_bottom_navigation_bar: Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn