flutter套件,flutter 组件

跨平台技术;H5和Flutter谁是未来?

前言

在成都网站设计、网站建设、外贸网站建设中从网站色彩、结构布局、栏目设置、关键词群组等细微处着手,突出企业的产品/服务/品牌,帮助企业锁定精准用户,提高在线咨询和转化,使成都网站营销成为有效果、有回报的无锡营销推广。成都创新互联专业成都网站建设10多年了,客户满意度97.8%,欢迎成都创新互联客户联系。

为什么跨平台是发展趋势?

同一个应用,各个“端”独立开发,不仅开发周期长,而且人员成本高。同时,作为技术人员,也不应该满足于这种重复、低能的工作状态。在这样的形势下,跨平台的技术方案也受到越来越多人和企业的关注。

本篇文章我将从原理、优缺点等方面为大家分享跨平台技术

一. H5

说到跨平台,没人不知道H5。不管是在Mac、Windows、Linux、iOS、Android还是其他平台,只要给一个浏览器,连“月球”上它都能跑。

1.浏览器架构

下面,我们来看看让H5如此横行霸道的浏览器的架构:

浏览器由以上7个部分组成,而“渲染引擎”是性能优化的重中之重,一起了解其中的渲染原理。

2.渲染引擎原理

不同的浏览器内核不同,渲染过程会不太一样,但主要流程还是一致的。

分为下面6步骤:

从以上6步,我们可以总结渲染优化的要点:

以上就是浏览器端的内容。但H5作为跨平台技术的载体,是如何与不同平台的App进行交互的呢?这时候JSBridge就该出场了。

3.JSBridge原理

JSBridge,顾名思义,是JS和Native之间的桥梁,用来进行JS和Native之间的通信。

通信分为以下两个维度:

那么App内加载H5的过程是什么样的呢?

4.App打开H5过程

打开H5分为4个阶段:

这四步,对应的过程如上图所以,我们可以针对性的做性能优化。

5.优缺点分析

下面,我们进行H5的优缺点分析:

优点

缺点

虽然H5目前还存在不足,但随着PWA、WebAssembly等技术的进步,相信H5在未来能够得到越来也好的发展。

二.小程序

2018年是微信小程序飞速发展的一年,19年,各大厂商快速跟进,已经有了很大的影响力。下面,我们以微信小程序为例,分析小程序的技术架构。

小程序跟H5一样,也是基于Webview实现。但它包含View视图层、App Service逻辑层两部分,分别独立运行在各自的WebView线程中。

1.View

可以理解为h5的页面,提供UI渲染。由WAWebview.js来提供底层的功能,具体如下:

每个窗口都有一个独立的WebView进程,因此微信限制不能打开超过5个层级的页面来保障用户体验。

2. App Service

提供逻辑处理、数据请求、接口调用。由WAService.js来提供底层的功能,具体如下:

运行环境:

仅有一个WebView进程

3.View App Service通信

视图层和逻辑层通过系统层的JSBridage进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层将触发的事件通知到逻辑层进行业务处理。

4. 优缺点分析

优点

缺点

既然WebView性能不佳,那有没有更好的方案呢?下面我们看看React Native。

三.React Native

RN的理念是在不同平台上编写基于React的代码,实现Learn once, write anywhere。

Virtual DOM在内存中,可以通过不同的渲染引擎生成不同平台下的UI,JS和Native之间通过Bridge通信

1.React Native 工作原理

在 React 框架中,JSX 源码通过 React 框架最终渲染到了浏览器的真实 DOM 中,而在 React Native 框架中,JSX 源码通过 React Native 框架编译后,与Native原生的UI组件进行映射,用原生代替DOM元素来渲染,在UI渲染上非常接近Native App。

2.React Native 与Native平台通信

3.优缺点分析

优点

缺点

4.RN展望

虽然RN还存在不足,但RN新版本已经做了如下改进,并且RN团队也在积极准备大版本重构,能否成为开发者们所信赖的跨平台方案,让我们拭目以待。

既然React Native在渲染方面还摆脱不了原生,那有没有一种方案是直接操控GPU,自制引擎渲染呢,我们终于迎来了Flutter!

四.Flutter

Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图形绘制相关的接口,可以在最大程度上保证不同平台、不同设备的体验一致性,逻辑处理使用支持AOT的Dart语言,执行效率也比JavaScript高得多。

1.Flutter架构原理

2.Dart优势

很多人会好奇,为什么Flutter要用Dart,而不是用JavaScript开发,这里列下Dart的优势

3.优缺点分析

优点

缺点

Android网络核心

Http 报文格式:状态行、请求头(响应头)、请求正文(响应正文)

状态行:http版本,地址、请求方式,空格划分

请求头(响应头):数据编码格式信息,cookie信息

空白行

请求正文:如果是get方法则没有,post则有

Http 是基于tcp的应用层协议,只是一份协议,其实还是靠tcp传输,1.0版本无法复用,1.1版本修复了这个问题,keep-alive发送请求后保存一段时间,这样可以复用

缺点:1.每次都需要重新建立连接

2.所有传输得内容都是明文,无法验证对方得身份,保证数据安全性

3.header里携带得内容过大,在一定程度上增加了传输得成本

Https: Http+SSL+TCP(应用层、安全层、传输层)

Https请求流程:

第一步:客户端和服务端确认加密算法和协议。其实挺复杂的,会分为以下2部分

1.客户端会将自身支持的秘钥算法套件(Cipher Suite)发送给服务器

2.服务器根据自身支持的秘钥算法套件,选择双发都支持的加密算法套件,并告知客户端。

Cipher Suite的名字里包含了四部分信息:

a.密钥交换算法:用于决定客户端与服务器之间在握手的过程中如何认证,用到的算法包括RSA,ECDH,PSK等

b.加密算法:用于加密消息流,该名称后通常会带有两个数字,分别表示密钥的长度和初始向量的长度,比如DES 56/56, RC2 56/128, RC4               128/128, AES 128/128, AES 256/256

c.报文认证信息码(MAC)算法:用于创建报文摘要,确保消息的完整性(没有被篡改),算法包括MD5,SHA等。

d.PRF(伪随机数函数):用于生成“master secret”。

例如:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

免费的数字证书签发机构:Let's Encrypt

SPDY:(HTTP、SPDY、SSL、TCP)

1.多路复用TCP通道,降低HTTP的高延时

2.允许请求设置优先级

3.header数据压缩

4.基于SSL的安全传输

Http2.0:

Http3.0:采用了UDP传输

Android历届大厂面试真题及答案

Android从零开始到精通

Android架构师成长视频

某机构全套最新视频

Tcp ip协议全套书籍

NDK开发书本

Android10大开源框架刨析视频

阿里Android面试题集及答案

Flutter快速入门

Java 最新Springboot2.0与spring boot1.5学习视频

还要需要iOS、或者是Java其他视频的可以私聊我

链接:

提取码:brx9

复制这段内容后打开百度网盘手机App,操作更方便哦

getx的controller是怎么销毁的

getx可以做到通过页面的退出自动控制controller的销毁,那么他是怎么做到的呢

当我们使用getx的路由套件时,可以看到,他的每个跳转方法都使用了自定义的 GetPageRoute 。

在 GetPageRoute 中对于此次的问题,我们需要关注的是两个方法

嗯,这里给传了一个 reference 给了 Get.reference ,这个 reference 看一下是什么玩意。。

dispose ,route退出流程里调用的方法。在这里面Get做了两件事,我们主要关注第一件事, removeDependencyByRoute() 参数是上面的页面标识。

这个方法里,我们可以看到调用了 GetInstance 的 delete 方法,这个方法就是销毁controller的方法,但是为什么呢?为啥传一个页面标识就能删除到对应的controller呢。我们接着看

我们都知道我们在使用getx的controller时,一定会有两个操作,一个是 Get.put() ,一个是 Get.find() 让我们一个一个的看一下

Get.put 的本质其实是将我们传入的实例,根据类 S 和 tag 创建一个 key ,然后以key和实例作为键值对存入了全局的map中(此处是简单理解,看也看得出来不是直接传实例了)

Get.find 方法很简单的只是通过类 S 和 tag 去全局map中找一个实例返回出去, 但是 返回之前,还做了一步操作,即 _initDependencies 。

看到没,就在下面Get.reference,之前在GetPageRoute的页面构建之前赋值了最近的页面,然后在此处用来做routesKey的value和前面的controller的key值进行绑定。

这也是得益于flutter是个单线程模型,才能这样无脑的通过这种方式传值。其实getx中有不少让人觉得神奇的地方都是利用了单线程的优势,比如Obx的自动刷新,也是在Obx的build方法和Rx的value的get方法之间通过一个全局指针来进行传值。

本地安装多个Flutter SDK版本埋的一个坑

将Flutter module 嵌入到原生做混合开发时,遇到一个奇怪现象,模拟器能正常跑起来,但一运行到真机,进入到flutter模块就直接白屏。

通过查看控制台打印的log,发现了如下错误信息:

搜索最后一条信息 Could not launch engine with configuration 时看到网上给出了对应的答案:

尝试了对应的方案,无果。

接着搜索第一条信息 Can't load Kernel binary: Invalid SDK hash ,总算是找到了对我有用的答案:

问题的根源就是在于我本地存在多个Flutter SDK版本,当时同一个项目需要切换不同版本时,进行对应的套件安装估计出了问题,所以就导致我在运行项目时无法正常显示。


当前文章:flutter套件,flutter 组件
网页地址:http://ybzwz.com/article/dseijjg.html