往期
上期回顾
上期我们做了一个能兼容不同屏幕大小的主页,来适配Web、Android等平台。主要用到了MediaQuery来动态获取屏幕的宽度,来动态适配UI。
本期内容
好消息,我申请的域名jetpack.net.cn已经下来了,这次的目标就是让网站正式成型,完善网站的内容。
- 完成Jetpack UI设计以及实现
分包处理
随着代码量的增加,业务的复杂,逐渐导致项目维护困难,简单的做一下分包处理,提高维护的效率,现在项目较小,分包处理方式如下
- data 创建基础的Bean对象,和处理数据的来源
- pages 创建各个界面的包
- styles 颜色以及文本样式等主题配置管理
- util 工具
- widgets 自定义widgets
这个分包只适合初期,有一个很凸显的问题就是如果page页面越来越多后,页面不太好区分,特别是需要抽离某个页面的时候可能不太好处理依赖,这样我们就引入模块化的概念,将一组业务的相关依赖放到一起,这样就可以轻松的做的抽离。有些人喜欢从一开始就设计的很完美,我的经验告诉我,一切先从简设计,保证满足业务的同时,尽量的做到更简单,决定业务成败的是产品,而不是技术,技术只是打辅助,打得好才能赢的更漂亮。同意的留言扣1,哈哈😄
Jetpack UI
大屏UI
中屏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的道路上提供一丢丢的帮助。