Flutter Web网站之Jetpack成型

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

往期

上期回顾

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

本期内容

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

  • 完成Jetpack UI设计以及实现

分包处理

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

image.png

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

Jetpack UI

大屏UI

image.png

中屏UI

image.png

小屏幕UI

image.png

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页面代码如下:

image.png

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

image.png

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

继续往下实现:

image.png

首先用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。

image.png

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

image.png

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

ToDo

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

image.png

Go on

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

结束

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

目录
相关文章
|
2月前
|
Web App开发 前端开发 JavaScript
Web开发者必收藏的10个实用网站,你还没收藏吗?
将这些网站收藏起来,定期访问,使它们成为您日常工作的一部分,助您在快速发展的 Web 开发领域保持领先。
130 2
Web开发者必收藏的10个实用网站,你还没收藏吗?
|
1月前
|
人工智能 搜索推荐 PHP
PHP在Web开发中的璀璨星辰:构建动态网站的幕后英雄###
【10月更文挑战第25天】 本文将带您穿越至PHP的宇宙,揭示其作为Web开发常青树的奥秘。通过生动实例与深入解析,展现PHP如何以简便、高效、灵活的姿态,赋能开发者打造动态交互式网站,同时不忘探讨其在新时代技术浪潮中面临的挑战与机遇,激发对技术创新与应用的无限思考。 ###
38 1
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
99 0
|
4月前
|
存储 前端开发 搜索推荐
Web前端网站(三)- 记事本
【8月更文挑战第8天】多种颜色搭配的动态粒子背景特效(粒子会随着鼠标的移动进行吸附,好看又好玩),左右摆动的文字特效,并且使用localStorage进行数据的持久化存储,使记事本的内容可以长期的保存在浏览器中,功能包括添加留言、显示留言、删除留言。每一行代码都有详细注释~~~大家可以尽情创作
73 5
Web前端网站(三)- 记事本
|
4月前
|
前端开发 搜索推荐 JavaScript
Web前端网站(四)- 音乐播放器
【8月更文挑战第9天】页面整体色调背景采用柔和渐变的方式呈现,与主页面的“毒药水式”色彩搭配形成了强烈的对比;周边花瓣缓缓飘落到水面之上形成涟漪。整体给人一种温馨、浪漫的感觉,还可以通过中间的3个按钮来控制音乐的切换和播放效果。每一行代码都有详细注释~~~大家可以尽情创作
52 2
Web前端网站(四)- 音乐播放器
|
4月前
|
Dart 前端开发 Java
|
4月前
|
前端开发 安全 JavaScript
PHP与现代Web开发:探索PHP在构建动态网站中的角色和优势
【8月更文挑战第29天】 在数字时代的浪潮下,PHP以其独特的灵活性、易用性以及强大的社区支持,持续成为Web开发领域的重要力量。本文将深入探讨PHP如何适应现代Web开发的需求,通过具体示例揭示PHP的实际应用,并分析其在面对新兴技术挑战时的应对策略。我们将一探究竟,PHP如何在众多编程语言中脱颖而出,成为许多开发者和企业的首选。
|
4月前
|
前端开发 JavaScript Android开发
Flutter 调用本地 web
Flutter 调用本地 web
48 0
|
6月前
|
监控 Serverless 持续交付
阿里云云效产品使用问题之如何让流水线支持构建 flutter web 应用到 OSS
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
6月前
|
存储 Apache 文件存储
在Apache环境下为Web网站增设访问控制:实战指南
在Apache服务器上保护网站资源涉及启用访问控制模块(`mod_authz_core`和`mod_auth_basic`),在`.htaccess`或`httpd.conf`中设定权限,如限制对特定目录的访问。创建`.htpasswd`文件存储用户名和密码,并使用`htpasswd`工具管理用户。完成配置后重启Apache服务,访问受限目录时需提供有效的用户名和密码。对于高安全性需求,可考虑更复杂的认证方法。【6月更文挑战第20天】
417 4