背景

Flutter作为新晋 网红 ,虽然还没有在我们项目中商用,但是热度已经有赶超ReactNative的趋势。 为了体验其开发效率和能力验证,我们将项目主界面中的个人页面进行Flutter重构。

为什么不选其他更复杂的界面呢?因为首页已经被重构了,没必要重复劳作。

构思

高度还原原版效果,可以对其进行截图,标注各部大小。为了简化这个过程,我们对大部分的模块只做预估,保证基本样子一致就行,不做像素级别的复制。 当然如果设计稿标注图还有也是可以的。

首先搭建静态页面,我们需要将整个页面进行拆解,适当划分模块可以进行合理的代码组织并便于后续维护。

如图,可以大致分解为四块:

头部

头部运营位

腰部运营位

底部运营九宫格

界面抽象

基于前面的模块拆分,我们可以将每一块抽象为一个页面组件Widget,然后将四个组件按顺序组装在一起,就得到我们的效果图。 在学习了Flutter的技术文档之后,我们知道有很多基础的布局控件可以使用 Layout widgets 。

基本上通过该文介绍的组件我们就可以搭建出四个基础模块,下面逐一分析。

头部Widget

这里有一个底图是块大背景,然后有一个导航栏按钮,用户头像,昵称。由于Flutter中并不是每个组件都具备边距属性,因此为了精确实现效果,我们需要适当包裹一层边距,比如Container和Padding。

_stackHeader(BuildContext context) {

return Stack(

children: [

Container(

color: Colors.white,

width: 480,

child: Image.asset('assets/mycenter_head_bg.png', fit: BoxFit.cover),

),

Container(

margin: EdgeInsetsDirectional.only(top: 80, start: 15),

child: InkWell(

onTap: () => {

Scaffold.of(context).showSnackBar(SnackBar(

content: Text('点击用户信息'),

duration: Duration(seconds: 2),

))

},

child: _userInfo(),

),

),

],

);

}

头部运营控件

运营控件视觉上非常像一个表格,不过他的数量比较少,因此,我们可以直接通过 Row+Column 组合实现;

实现这个卡片表格,有几个点可以关注:

卡片的周边投影

圆角处理

点击的Ripple效果

屏幕高宽信息

参考代码如下:

Widget _gridCard(BuildContext context) {

double cardMargin = 15;

var width = MediaQuery.of(context).size.width - cardMargin * 2;

return Card(

margin: EdgeInsetsDirectional.only(

start: cardMargin, end: cardMargin, bottom: cardMargin),

shape: RoundedRectangleBorder(

side: BorderSide(

color: Colors.black12, width: 0.5, style: BorderStyle.solid),

borderRadius: BorderRadius.all(Radius.circular(3))),

elevation: 2,

child: Column(

children: [

Row(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: bean.icons

.map((i) => _item(context,

source: i.image, text: i.text, width: width / 4))

.toList(),

),

Container(

height: 0.5,

margin: EdgeInsetsDirectional.only(start: 20, end: 20),

color: Colors.black12,

),

Row(

children: [

_itemBottom(context,

label: bean.left.label,

text: bean.left.text,

tips: bean.left.tips,

width: (width - 0.5) / 2),

Container(

width: 0.5,

height: 18,

color: Colors.black12,

),

_itemBottom(context,

label: bean.right.label,

text: bean.right.text,

tips: bean.right.tips,

width: (width - 0.5) / 2),

],

),

],

),

);

}

腰部运营位

这个如果是轮播位还可以讲下,目前只是一个动态的图片位即可

// Banner

Widget _banner(BuildContext context) {

return Container(

height: 70,

margin:

EdgeInsetsDirectional.only(start: 15, top: 15, end: 15, bottom: 15),

child: InkWell(

onTap: () => {

Scaffold.of(context).showSnackBar(SnackBar(

content: Text('点击广告'),

duration: Duration(seconds: 2),

))

},

child: CachedNetworkImage(

placeholder: (context, url) => Container(

color: Colors.black12,

height: 70,

),

errorWidget: (context, url, error) => Container(

color: Colors.black12,

height: 70,

),

fit: BoxFit.cover,

imageUrl: bean.bannerImage,

)),

);

}

底部运营九宫格

九宫格由于数量较多,可以通过GridView来实现,由于数量还是有限的,不存在无限列表的情况。

这里的几个关注点:

横向个数控制

Item的高宽比

分隔间隙

由于Flutter里面没有列表的Item点击事件,因此需要每个视图单独设置一个监听器;

@override

Widget build(BuildContext context) {

return SliverGrid(

gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(

crossAxisCount: 4,

mainAxisSpacing: 1.0,

crossAxisSpacing: 1.0,

childAspectRatio: 1.2,

),

delegate: SliverChildBuilderDelegate(

(BuildContext context, int index) {

IconBean data = this.response[index];

return InkWell(

onTap: () => {

Scaffold.of(context).showSnackBar(SnackBar(

content: Text('点击:' + data.text),

duration: Duration(seconds: 2),

))

},

child: _item(source: data.image, text: data.text),

);

},

childCount: this.response.length,

),

);

}

细节优化

当整体搭建好了后,需要调整细节,比如点击效果和区域的调整,这种情况下会需要增加视图层级来包裹; 支持默认图的展示和背景色的处理,边距,也涉及到控件的包装。具体可以参考实现代码。

沉浸式

Android和 iOS 都有沉浸式效果,个人页面要支持沉浸式可以如下处理:

void main() {

SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(

statusBarColor: Colors.transparent));

runApp(MyApp());

}

圆角化

圆角化的方案有很多,常用的如下:

// 圆形头像 方案一 ClipOval

ClipOval(

child: _cacheImage(

'assets/personal_user_default_heade_img.png', this.avatarUrl),

),

_cacheImage(String placeholder, String source) {

return CachedNetworkImage(

placeholder: (context, url) => _defaultImage(),

errorWidget: (context, url, error) => _defaultImage(),

imageUrl: source,

width: AVATAR_SIZE,

height: AVATAR_SIZE,

);

}

// 圆形头像 方案二 CircleAvatar

CircleAvatar(

radius: 30,

backgroundColor: Colors.white,

backgroundImage: NetworkImage(this.avatarUrl),

),

// 圆角图片 ClipRRect

ClipRRect(

borderRadius: BorderRadius.circular(10),

child: _cacheImage(

'assets/personal_user_default_heade_img.png', this.avatarUrl),

),

点击动效

点击效果,这里使用的是 InkWell ,对所有目标进行一次包裹

InkWell(

onTap: () => {

Scaffold.of(context).showSnackBar(SnackBar(

content: Text('点击用户信息'),

duration: Duration(seconds: 2),

))

},

child: _userInfo(),

);

小结

在开发常规页面是,Flutter还是非常趁手的,有一个差异点是,Flutter里面大量依赖 Widget 嵌套来实现效果,在开发 Android 时我们知道布局都是追求扁平化的。

这里嵌套是否会有性能问题?是一个可分析的点。

flutter 九宫格菜单_Flutter页面开发体验相关推荐

  1. flutter 九宫格菜单_flutter GridView 九宫格

    我收集了一些学习用的资料,其中包含了很多学习,面试,中高进阶fluuter资料,还有很多视频详解,如果有同学想进一步了解,详情请看文末.也欢迎各路大神门前来装X. 1 引言 GridView是常用可滚 ...

  2. flutter 九宫格菜单_flutter九宫格图片查看器

    一个九宫格图片查看器 Screenshot_1542963454.png Screenshot_1542963645.png import 'package:cached_network_image/ ...

  3. flutter 九宫格菜单_flutter九宫格看图加强版

    九宫格看图,效果如下图 Screenshot_1571750889.png import 'package:flutter/material.dart'; import 'dart:math'; // ...

  4. flutter 九宫格菜单_Flutter 仿微信/微博九宫格

    NineGridView 类似微博动态,微信朋友圈,展示图片的九宫格控件.支持单张大图预览. 同时也支持微信群组,钉钉群组头像效果. DragSortView 类似微博/微信发布动态选图九宫格.支持按 ...

  5. flutter 九宫格菜单_Flutter 九宫格及Hero动画

    class LXPhotosView extends StatefulWidget { //数据资源 final List list; //主轴间距 final double mainAxisPadd ...

  6. flutter 应用场景_Flutter混合开发的路由栈管理

    为了把 Flutter 引入到原生工程,我们需要把 Flutter 工程改造为原生工程的一个组件依赖,并以组件化的方式管理不同平台的 Flutter 构建产物,即 Android 平台使用 aar.i ...

  7. flutter 返回指定界面_Flutter页面路由导航及传参

    转载请注明出处: https://learnandfish.com/ 概述 每个应用都有很多个页面,在flutter中同样也有很多页面,被称之为路由(Router),页面之间的跳转通过导航器(Navi ...

  8. 移动端多页面APP(MPA)开发体验

    移动端多页面APP(MPA)开发体验 什么是移动端应用 多页面应用和单页面应用 开发环境准备 安装和配置Git VsCode中配置简体中文语言环境和git(windows环境) 建立MPA项目 开发示 ...

  9. Flutter 核心原理与混合开发模式

    作者:airingdeng,腾讯QQ前端开发工程师 本文将从 Flutter 原理出发,详细介绍 Flutter 的绘制原理,借由此来对比三种跨端方案:之后再进入第三篇章 Flutter 混合开发模式 ...

最新文章

  1. 数据结构实验之链表二:逆序建立链表
  2. 何时(不)使用Java抽象类
  3. notepad++安装
  4. mysql开启日志记录
  5. Java编程:排序算法——希尔排序
  6. 分享:架构师软技能之协商
  7. Java集合类和HashMap遍历
  8. 智能算法-模拟退火-粒子群-鱼群算法
  9. 如何理解封装,继承,多态?
  10. Thoughts On To The Moon
  11. echop 验证码不正确的解决办法
  12. 【图像配准】基于sift算法实现图像配准matlab源码
  13. BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)
  14. 几张表格怎么联动_在excel 中,怎样实现数据关联?:excel怎么把几个表格的数据联动...
  15. [交易日记]2016-11-24交易笔记
  16. Java基础之泛型简单讲解(通俗易懂)
  17. 倩女幽魂手游服务器维护时间,倩女幽魂手游12月29日在线维护公告
  18. android指纹解锁_Android指纹锁
  19. Java 设置PDF平铺图片背景(水印)
  20. 2014年新年PMP校友会

热门文章

  1. ORACLE 12c rac备份异机单实例恢复(RMAN recover database出现RMAN-06054)
  2. 深入理解Python元类(原创)
  3. 制作Windows To Go对U盘、移动硬盘具体要求
  4. BCN点击试剂1263166-90-0,endo BCN-OH,环丙烷环辛炔羟基
  5. 在日常中会用到的浏览器F12开发人员工具技巧
  6. IE8按F12开发人员工具不显示
  7. SpringBoot实现分页查询——基于SpringBoot和Vue的后台管理系统项目系列博客(七)
  8. 基于J2EE的B2C电子商务系统开发(论文+系统+开题报告+文献综述+任务书+答辩PPT+中期报表+外文文献+说明书)
  9. 浅谈持续集成的理解以及实现持续集成,需要做什么?
  10. css position fixed 居中,css中position:fixed实现div居中上下左右居中