ionic 修改组件默认样式_开源Magpie:组件库详解

24ec797d63485e32cc970d905dc7b9ae.png

开源项目专题系列(八)1.开源项目名称:magpie_fly2.github地址:

https://github.com/wuba/magpie_fly

3.简介:magpie_fly 是58集体出品组件库,统一管理日常开发中的基础组件及高阶组件,并提供了相对友好的方式介绍组件的具体使用方式。旨在降低日常开发中对组件的查找和学习成本,实现技术组件的统一,提升开发效率。全文大纲如下:
  • 背景
  • 简介
  • 整体效果展示
  • 特点与优势
  • 实现方式
  • 现有组件list
  • 后期规划
  • 作者介绍

背景

相信很多公司都已经在研究flutter,甚至已经把flutter运用到了自己的项目中,它的流畅性,热加载以及其丰富,高效的UI表现力相信很多人都有体会。
在开始magpie项目之前,为了更多的了解flutter,我们首先用安居客的有料界面做了尝试,但是在开发有料界面的时候,我们遇到了一些问题:661e6e50b97f9eadcf6c9122625bea61.png

从上面的图中可以看出,我们在现实开发中难免会遇到以下的问题:

  1. flutter提供的组件不满足我们的开发需求,我们需要自己封装或者使用第三方组件满足我们的开发需求。

  2. 在不同平台上搜到很多相似组件的不同实现方式,难以抉择。

  3. 需要本地运行才能看见组件的真正样式,因为作者介绍的效果图跟实际效果可能有偏差。

  4. 需要把demo down下来之后,才能找到组件效果实现的具体代码。

  5. 没有符合我们集团内部统一风格的整套UI样式。

  6. 写UI的同学重复造轮子。比如一个button的创建,一个imageView的使用。

magpie_fly要做什么:

88247c4c9e65390b9232e2418e9420f5.png
  1. 我们希望统一组件管理,以最友好的方式去介绍组件,降低组件的查找和学习成本。所以我们需要一个组件库,当然这个组件库是开放的,我们希望更多的开发者将自己的组件贡献到组件库中。

  2. 同一个集团下就应该要考虑体验一致性的问题,所以我们希望像material-ui和fusion.design一样,用flutter实现一整套统一UI风格的组件。

  3. 聚集现有最优的高阶组件。

  4. 我们希望通过设计图就能生成出对应的UI代码,这样不但能解决UI图跟实际开发效果不一致性的问题,同时能降低设计与开发的沟通成本,解放了开发同学重复写UI代码的担子。

目前我们只做了第一点,剩下三个方面将是我们组件库后期开发的重点。

整体效果展示

dc21b86f987042939f6fe52e8f0e46e9.png
  • 58公众号:动态显示58最新技术文章,方便向外界宣传58技术

  • widget:库中管理的所有组件列表,便于开发者进行查找

  • 组件详情:组件介绍界面,markdown+效果+代码的显示方式

  • 使用文档:详细的描述了用源码的方式跑magpie_fly App的具体方法

  • 贡献流程:详细的描述了我们应该怎么样去把自己写好的组件接入到组件库中

特点与优势

1、特点

  •   集合所有日常开发中常用组件,统一管理
  •   文档、组件效果和代码同时显示
  •   支持快速接入新的widget

2、优势

与Flutter-Go对比57a5f85cb714bc44724436dd3a0517a6.png

实现方式

1、组件详情页

 1.1 方案选择

  • 文档+图片

通常情况下,都会想到用文本的方式去介绍一个组件的使用方式,如果想要显示组件的样式,基本都是通过嵌入图片或者gif的方式去显示一个组件的具体效果,这样做的弊端是,如果我修改了组件的样式,就算只改了一点点,我们都需要重新截图或者录gif动图。很显然这是很麻烦的。

f6192913a6f8fe1613477a43a428ba24.png
  • 专门用widget实现一个完整的详情页

开发者针对不同的组件自己去用widget实现一套自己的组件详情页,但是我们这是一个组件库,就希望统一详情页样式和风格,所以让开发者自己实现自己的详情页是不可取的,并且开发者自己全部开发一个详情页,其实消耗的精力也是比较大的。

  • 文档+组件效果+代码

我们希望在给开发者介绍组件的同时,开发者能对组件进行操作,增加开发者对组件的理解,并且能直接看见实现该组件效果的对应代码,方便开发者学习的同时,还能一键复制到自己的工程中直接使用。这样大大降低了开发者的学习成本,从而提高开发效率。于是我们借鉴了material-ui的思想,实现了一套markdown + widget效果(可以交互) + 代码的方案。

1.2 方案文档+组件效果+代码显示实现方式

我们先来看下效果:

92b6d34318f4abeae2cd3e2be84c4e3d.png

可以看出,我们中间嵌入的组件是可以手动进行操作的,而该组件是由下面的代码渲染出来的。那我们是怎么样实现这样的效果的呢?

虽然详情页看起来是由三部分组成,实际上开发者只需要编写markdown文档,并且在文档中添加我们规定的代码,我们通过解析特定markdown文档的方式得到这样的效果。

我们来看下需要嵌入组件的markdown的格式:

908c625d4d10cf30f99cf2c1bcca486a.png

框出来的地方,就是我们需要在.md中对应位置嵌入组件时的固定嵌入代码。我们会在解析markdown的时候,专门对嵌入的代码进行处理。

参数详解:

demo:需要引入的样式的代码路径
code:默认true,是否要展示widget对应的代码
jump:默认false,在当前页面展示效果+对应代码;true则替换为占位符,跳到二级页面展示

我们拿到demo的value值,从config.dart中得到对应的demo实例,也就是自己组件的widget,而正常的文档通过第三方库flutter_markdown转换成对应的flutter原生widget。于是整个markdown文档就全部转换成了多个widget组合的列表,然后放到ListView中进行显示。

那我们是怎么样把渲染组件的代码嵌入到markdown中的呢?
再来看下我们嵌入的代码:

{{"demo": "lib/demo/horizonal_scroll/HorizontalScrollDefault.dart", "code": true}}

这样,我们就只需要修改代码,效果和对应的代码都会同步展示出来。

另外,如果展示的效果是全屏的,只需要加个"jump":true的参数,特殊代码就会解析成一个占位符,点击跳转到二级页面展示效果,点击右上角菜单即可查看对应的代码。

代码关键字高亮展示,方便阅读,支持代码折叠、复制功能。

66214afa4171bc2c3eb7973b0aec6b36.png

2、快速接入组件

既然是组件库,就支持不断的往库中新增组件,为了让开发者接入组件的时候更加简单方便,我们提供了接入脚本,脚本会根据输入的组件信息,会自动在example/lib/demo文件创建一个组件模版,接入方只需要修改自己组件相关的信息,就能在界面中进行显示。

  • 具体设计

a6f62189023703386b4dc71d1c749396.png

参数详解:

.md文件:组件详细描述markdown文件,其中可插入组件效果的特定代码块,需开发者自行编辑
.dart文件:对应组件的效果实现文件,需提供组件的开发者自行实现相应效果
.page.json:根据执行脚本自动生成的组件信息文件,供ListData读取显示在列表页中,不需要开发者操作

脚本主要做了两件个事情:

  1. 在example/lib/demo中生成对应组件的文件夹

    0efa836eaea27472bee42b44f56daade.png
  2. 自动在ListDatas中加入需要在list中显示的组件

    c016447b0a67820f598a813d1fc1ab7b.png

然后在assets中配置自己的文件夹路径

- lib/demo/test_wdiget/

并且需要在util/config.dart中配置自己的demo数据

'lib/demo/test_widget/test_widget': () => TestWidget(),

至此就完成了一个简单的接入工作,运行工程,会在列表页看见加入的demo。

现有组件list

我们从安居客有料中提取了多个高阶组件,下面我们来介绍下这些组件。

1. video:视频Feed流滚动探测播放插件

我们经常会遇到这样的需求,当视频滑动到列表的某一个位置时,视频自动播放。甚至列表存在视频和其他帖子参差的数据,这个时候我们就需要去动态的检测可视范围内符合条件的视频数据,该组件就是在feed流中探测视频控件进行操作的插件。

使用方式:

  1.1 使用ScrollDetectListener包裹ListView,ListView为业务相关的视频流帖子。

  1.2 视频帖子使用MetaConsumer包裹;

2. pinned_sliver: 混合嵌套列列表中的吸顶安全区解决⽅方案

在Flutter中使用AppBarLayout和SliverPersistentHeader都可以做出基本的吸顶效果。AppBarLayout内部使用的也是SliverPersistentHeader,可以把它理解为一个Framework定制好的状态栏控件,支持较多设置属性,包括吸顶和float等。

当吸顶遇到刘海屏时,事情就会变得有些复杂,一般来说我们希望:

  2.1 在没有吸顶前,尽可能多的利用屏幕,也就是需要使用沉浸式;

  2.2 当吸顶的时,吸顶块需要在刘海之下,也就是空出安全区;

而flutter本身的组件是不支持吸顶前后UI样式不一样的情况,该组件就是为了解决这种情况诞生的。

60972d0528b92463c4d1e99799f30af5.png

3. bannder_round: 一个支持多种形式的高性能轮播组件

滚播组件算是在日常开发中很常见的一种组件了,该组件支持默认滚播图片和自定义滚播item样式,可设置定时滚动等功能。

4. horizonal_scroll: 带尾部加载更多样式的横滑scrollview

在日常开发中,经常会遇到右滑加载更多的需求,但是flutter提供的Scrollview是不提供底部加载更多效果的。为了减少开发时间,提供了一个带阻尼回弹效果的横向加载更多组件,底部加载更多可用自定义组件,也可用组件内提供的默认样式和显示文字的样式。

8e07a7d6dd85698c0cb7f94ba33d964f.png

5. draggable_btn: 一个跟随手指全屏拖动的按钮

DraggableBtn是一个跟随手指全屏拖动的组件,当手指按住时放大,随着手指移动,放开恢复原来大小,停留在手指弹起的位置。

可适用于悬浮广告位和debug时调试的悬浮按钮。

6. popup_window: 一个任意位置,箭头跟踪View的弹层效果组件,可指定上下左右方向,弹出对应方向的弹层,一般适用于弹出。

后期规划

e40823d4cdbc4d57655ca4a2e1434750.png希望更多开发者能积极的参与到我们的组件库中,我们会不断丰富我们的内容,使magpie_fly成为日常开发中必不可少的工具之一。作者介绍

吴丹,58同城二手车技术部-iOS高级开发工程师,主要负责58同城App的二手车相关研发工作。金修博,58同城商业智能中心-iOS高级开发工程师,主要负责美事App的相关研发工作。李义新,58安居客二手房经纪人Android高级开发工程师,主要负责移动经纪人App的相关研发工作。Live58对外技术沙龙第五期

Flutter专场——Flutter在58的应用实践系列话题

系列2已准备就绪

本周日晚7:00准时开幕d8bfd2b95acde1a8e3991a0b59b1e284.png扫码添加“58技术小秘书”微信 : jishu-58添加小秘书微信后由小秘书拉您进项目交流群

END

阅读推荐

1. 详解站点压测利器——nGrinder
2. 开源|Magpie:混合开发工程化框架
3. Go服务在容器内CPU使用率异常问题排查手记
4. 开源|Magpie:平台工具链开发实践5. 开源|Magpie:58跨平台技术应用及Flutter实践概览8df649d7fa4092229b0f6b214d64edfc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力

历史上是在金银版分了精灵的特攻物攻,在宝石版分了技能的特攻物攻,让很多精灵和技能得以重生。口袋之旅采用的是第二世代的精灵加第三世代的技能分类,于是特攻手也成为了一个需要挑选的部分,本文继续为你缩小挑选范围。特攻种族值…

使用ftl生成word

背景:根据word模板下载word。word里面需要填充数据,格式是固定的。首先在word中给数据起个变量名称 需要更换的数据改成${变量名!},必须是英文的,加感叹号是为了防止null,如果数据是null,文档下载下来后会直…

什么叫做项目孵化_蓝莓孵化营12进5争夺战,项目人绽放自我不留遗憾

国内首档互联网职业竞技励志节目《蓝莓孵化营》,今晚22点在浙江卫视播出第十一期。本期节目中,第三事业群的12组项目人将为最终的5张终极考核入场券展开争夺。这一次,他们比拼的是以“2020”为主题的短视频,每一组项目人都拼尽了自…

七台河计算机网络工程专业,网络工程本科专业介绍

网络工程本科专业介绍网络工程专业是教育部第二类特色专业,比较热门,竞争力较大,考生报考此专业的时候要慎重。网络工程本科就业前景本专业的就业前景不错,学生可从事各级各类企事业单位的企业办公自动化处理、计算机安装与维护、…

Java实体类不要使用基本类型_为何封装javabean时,成员变量一律都不用基本类型

Java实体类不要使用基本类型 记录一下,在项目中因为基本类型,所产生的bug 包装类:8种基本类型的包装类 应用场景:数据库建立实体映射多用包装类 这两句话是重点:就是建立实体类禁止使用基本数据量类型!…

一开机就提示脱机工作_「华为手机维修自学教程」华为手机的开机触发电路 华为维修技巧...

谈谈华为的开机触发电路华为这段时间的新闻不少,大家应该都有说了解。华为的强大意味着华为手机的维修市场越来越大。从事维修的朋友们你们准备好了吗?今天给大家说一说,华为手机的开机触发电路。修苹果手机的朋友大家都知道,电源…

html怎么保存曲奇,自制曲奇饼能保存多久 这些存放方法你懂吗

来源:站酷作者:Wandzilak虽然市场上的饼干种类很多,而且吃起来也感觉十分香,但是这些食品一般添加了比较多的防腐剂膨松剂,多吃度身体健康不是很好。因此很多人都喜欢自己在家里制作饼干,其中曲奇饼干就是很多人都喜欢制作的饼干之…

SpringBoot 整合mybatis-plus 高级功能及用法详解

springboot 整合mybatis-plus 高级功能及用法详解 学习并使用mybatis-plus的一些高级功能的用法例如&#xff1a; AR模式、 乐观锁 、逻辑删除 、自动填充、数据保护等功能 为了方便演示&#xff0c;咱们还是新建一个全新的项目 引入mp依赖 <dependency><groupId>…

8除以2表示什么意思_八字中劫财,比肩分别表示什么意思

◆◆比劫与其他十神的生克关系◆◆食伤&#xff1a;比劫生食伤财星&#xff1a;比劫克财星官星&#xff1a;官星克比劫印星&#xff1a;印星生比劫◆◆比劫帮身◆◆八字术语&#xff0c;比肩劫财均可助日干之力&#xff0c;如甲见甲(比)、乙(劫)、寅(禄)、卯(刃)之类&#xff0…

江苏省计算机一级考试基础知识,江苏省计算机一级考试大纲及复习指南

江苏省计算机一级考试大纲及复习指南江苏省计算机等级考试大纲(一级)计算机信息技术考试要求(试用)及使用说明1&#xff0e;掌握计算机信息处理与应用的基础知识。2&#xff0e;能比较熟练地使用六个常用的软件(IE、Outlook Express,Word,Excel,PowerPoint,和FrontPage)3掌握Ac…

MyBatis-plus 自动填充MetaObjectHandler不生效问题

背景 在项目中经常遇到一些数据需要自动填充&#xff0c;填充方法都是同一种规则&#xff0c;例如创建时间等。 1 自动填充方法配置 1.1 实体类添加注解 1.2 在handler包下实现元对象处理器接口 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import o…

html拖拽模态框,可拖拽的谷歌样式纯javascript模态窗口插件

draggable-google-modal是一款可拖拽的谷歌样式纯javascript模态窗口插件。该模态窗口插件使用纯js编写&#xff0c;模态窗口可以任意进行拖动&#xff0c;并且模态窗口可以全屏放大&#xff0c;或左右对齐占据半边屏幕。使用方法使用该模态窗口插件需要引入draggabilly.pkgd.j…

centos7修改网卡顺序_CentOS7网卡名称的修改

生产环境中&#xff0c;托管于机房的服务器经常会进行割接操作&#xff0c;为了能让网卡更容易让运维人员和机房识别&#xff0c;避免因为弄错网线或找错网卡导致业务中断&#xff0c;在服务器上架前就应该对所有网卡按照 eth0、eth1 的方式来命名&#xff0c;并按照网卡的物理…

new Gson().toJson日期转特定格式日期实体

Google的Gson功能非常强大&#xff01; 格式化日期我们只需要这样创建就好了 Student stu new Student();stu.setName("张三");stu.setBirthDay(new Date());如果张三的生日是日期型的话&#xff0c;直接实体转json的话&#xff0c; new Gson().toJson(stu);日期…

计算机考试internet应用好考吗,2015年职称计算机考试XP好考还是internet应用好考...

WindowsXP和Internet的相似考点Windows XP模块和Internet模块是两个常考模块&#xff0c;2010年7月以来&#xff0c;国家职考题库发生了较大的变动&#xff0c;之前我们已经从题目上总结出了两个的模块的类似点&#xff0c;现在从大纲上总结两个模块的相似考点。一&#xff1a;…

博途变量类型_PLC数据类型(UDT)

UDT类型是一种由多个不同数据类型元素组成的数据结构&#xff0c;元素可以是基本数据类型&#xff0c;也可以是STRUCT、数组等复杂数据类型以及其它UDT等。UDT类型嵌套UDT类型的深度限制为 8 级。UDT类型可以在DB、OB/FC/FB接口区处使用。从TIA 博途 V13SP1 开始&#xff0c;S7…

Mybatis-Plus条件参数查询手册

【引言】 使用mybatis-plus框架的基础上&#xff0c;直接使用其中的条件参数进行查询还是很方便的。但每次使用到像大于、不等于这样一些不常用条件时&#xff0c;都需要现查&#xff0c;所以记录在这篇博客里&#xff0c;当作一个自己的查询手册。 【手册】 查询方式说明se…

只考计算机知识吗,计算机二级只考一门吗?计算机二级考什么?

计算机二级只考一门吗&#xff1f;计算机二级只需要考一门。合格就可以获得国家二级计算机证。基础知识和操作题是一起考的&#xff0c;国家二级计算机考试是无纸化考试。另外&#xff0c;基础知识都是选择题&#xff0c;操作题包括主要的办公软件的操作以及高级应用。相对于电…

java 最快平衡几个值_Java 集合框架面试问题集锦

Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题。很好地理解集合框架&#xff0c;可以帮助你理解和利用Java的一些高级特性。下面是面试Java核心技术的一些很实用的问题。Q&#xff1a;最常见的数据结构有哪些&#xff0c;在哪些场景下应用它们&#xff1f…

mybatis-plus 如何判断参数是否为空并作为查询条件

判断参数是否为空并作为查询条件 Overridepublic Page<DemandEntity> selectByDepartmentDisplay(DemandEntity demandEntity) {EntityWrapper<DemandEntity> wrapper new EntityWrapper<DemandEntity>();wrapper.eq(!StringUtils.isNullOrEmpty(demandEnt…