Flutter Web网站之Jetpack成型

往期

上期回顾

上期我们做了一个能兼容不同屏幕大小的主页,来适配Web、Android等平台。主要用到了MediaQuery来动态获取屏幕的宽度,来动态适配UI。

本期内容

好消息,我申请的域名jetpack.net.cn已经下来了,这次的目标就是让网站正式成型,完善网站的内容。

  • 完成Jetpack UI设计以及实现

啰嗦几句

读过我之前博客一个在线的Jetpack模版项目生成工具应该知道,我做了一个在线的Android Jetpack模版代码生成器,而这次我申请的域名jetpack.net.cn,也是为了让它有一个好的归宿,毕竟我自己的网站ibaozi.cn当初的用意是展示简历,博客,博主推荐位等等,跟Jetpack并没有血缘关系,后来,经过公司项目的Flutter转型,突然发现,我们构建Android项目的时候,用官方提供的Jetpack套库,可以轻松的创建一个稳定的项目,可Flutter并没有这样一个套库,于是我自发的想做这样一件事情,去收集目前github中开源的库,并提供相关简介和用例,辅助你去构建一个完整的Flutter项目。说完我的目的,就不啰嗦了,接下来,让我们开始开发。

分包处理

随着代码量的增加,业务的复杂,逐渐导致项目维护困难,简单的做一下分包处理,提高维护的效率,现在项目较小,分包处理方式如下


  • data 创建基础的Bean对象,和处理数据的来源
  • pages 创建各个界面的包
  • styles 颜色以及文本样式等主题配置管理
  • util 工具
  • widgets 自定义widgets
    这个分包只适合初期,有一个很凸显的问题就是如果page页面越来越多后,页面不太好区分,特别是需要抽离某个页面的时候可能不太好处理依赖,这样我们就引入模块化的概念,将一组业务的相关依赖放到一起,这样就可以轻松的做的抽离。有些人喜欢从一开始就设计的很完美,我的经验告诉我,一切先从简设计,保证满足业务的同时,尽量的做到更简单,决定业务成败的是产品,而不是技术,技术只是打辅助,打得好才能赢的更漂亮。同意的留言扣1,哈哈😄

Jetpack UI

大屏UI

Flutter Jetpack

中屏UI

小屏幕UI

Jetpack 实现

下面我来说下UI实现的一些细节,在本次页面的组建过程中主要用到如下组件

  • Align 负责控制子view的位置,左上、左下,右中等
  • TabBar 跟Android中的tabBar一样,一个按钮选择器
  • Expanded 尽可能的占用最大空间,可以用flex控制比例
  • PageView 左右或者上下滑动的页面
  • SingleChildScrollView 让子view可以滑动的容器
  • Column 纵向容器
  • Row 横向容器
  • SizedBox 固定宽度或者高度的盒子,组件之间增加间距用
  • InkWell 给子组件添加onTap点击事件处理
  • Card 卡片样式

Home主页代码

/// Column 纵向展示 TabBar、Body
 @override
  Widget build(BuildContext context) {
    return Container(
      color: tabBarBgColor,
      child: Column(
        children: <Widget>[_buildTabBar(), _buildBody()],
      ),
    );
  }
///构建TabBar
/// Align 控制子组件局左
/// TabBar 构建选择器
/// _tabController 用来控制TabBar的index属性
/// isScrollable 设置为true,这样TabBar会默认包裹内容,关闭等比分配子组件
  _buildTabBar() {
    return Align(
      alignment: Alignment.topLeft,
      child: TabBar(
        indicatorColor: titleColor,
        labelColor: labelColor,
        controller: _tabController,
        isScrollable: true,
        tabs: _tabs
            .map((e) => Tab(
                  text: e,
                ))
            .toList(),
      ),
    );
  }
/// Expanded 用来撑满剩余的屏幕空间
/// PageView 用来构建横向滑动View,根据index构建不同页面
/// scrollDirection 控制滑动方向
/// physics :NeverScrollableScrollPhysics 关闭横向滑动,因为我们的Flutter Jetpack是上下滑动的,如果左右滑动打开的话会导致滑动不顺畅。
  _buildBody() {
    return Expanded(
      child: PageView.builder(
        controller: _pageController,
        itemCount: 2,
        scrollDirection: Axis.horizontal,
        physics: NeverScrollableScrollPhysics(),
        onPageChanged: (index) {
          _tabController.animateTo(index);
        },
        itemBuilder: (BuildContext context, int index) {
          if (index == 0) return PageFlutterJetPack();
          if (index == 1) return PageAndroidJetPack();
          return Container();
        },
      ),
    );
  }

Flutter Jetpack UI 实现

PageFlutterJetPack页面代码如下:


先整体看下,build函数构建一个Row横向的布局,并用Expanded等分,以3:1的方式分配如图所示

ResponsiveWidget.isLargeScreen或者ResponsiveWidget.isMediumScreen屏幕时显示Tags部分,小屏幕挪到了比例为3的部分的最下面。
继续往下实现:

首先用SingleChildScrollView实现上下可滚动,再用Container实现一个内边距,紧接着用Column实现纵向排版,跟堆积木一样,先构建内容的头_buildHead,再构建组件库的标题_buildComponentsTitle,接着就是组件的内容_buildComponentsContent,依次实现四个,最后在小屏幕的时候将tags挪到最下面, ResponsiveWidget.isSmallScreen(context) ? _buildTags()就是这样,有个小细节就是在SingleChildScrollView中使用GridView的时候,应为都是可滚动的,并且都是可以无限延伸的,所以需要确定GridView的高度,这样才能保证UI绘制的正确性,所以需要通过GridView的属性shrinkWrap和physics来让UI绘制正常,shrinkWrap设置为true实现子View全部绘制出来,这样缺少缓存,一定程度上浪费了内存,physics设置为NeverScrollableScrollPhysics关闭滚动。
还有个小的细节,为了适配不同屏幕大小这里,给GridView的列数做了动态配置,这样就实现了不同屏幕自动适配不同列的UI。

最下面是_buildFooter,这里放了备案号,这是网站必须的

整体页面已经完成,具体请转github代码查看完整实现,

ToDo

  • 示例部准备下期实现,跳转至详情页面,并展示用例。源码已经完成点击即可跳转至github。
  • Tags 部分下期实现,这部分也需要新的UI展现,标签的功能类似与搜索,提供更快捷的方式查找想要的功能。
  • 留言功能设计,在你们使用过程中肯定会有不同的建议,有了这个功能就能知道你们的心声,所以这也是我们需要的实现的一个功能。
  • 优秀的项目推荐,有很多优秀的项目等待着我们去发现,我一个人的能力有限,如果有更多的人来推荐,会不断丰富我们的Jetpack内容。
  • 博客,这里考虑到有很多优秀的大佬,写过相关技术博客,帮你寻找最优秀的资源。功能设计如下图新增按钮。

Go on

不知道你有没有觉得,flutter的web表现不是很好,尽管页面设计的足够简单,但还是会有滑动不顺畅的表现,特别是在android手机上的表现,但相信在flutter web 正式版到来的时候能有很大的改善。我们期待吧。

结束

网站jetpack.net.cn,欢迎常来,也希望能在你学习Flutter的道路上提供一丢丢的帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容