如果你是一位前端开发工程师,对“跨平台”一词应该不会感到陌生。像常见的前端框架:比如React、Vue、Angular,它们可以做网页端,也可以做移动端,但很少能做到跨PC、Mac端,也就是我们熟知的Windows、Linux以及macOS上的应用程序。即使有,受限于JS的性能瓶颈,当有大量的科学计算需求时,则会略显疲态。

有没有一个理想的UI框架能够通杀它们所有呢?答案是——Flutter。

Flutter的性能优势

做为一个通用的跨平台的UI框架,Flutter在性能方面的突出表现是非常引人夺目的。拿Android举例,一个安卓的原生APP在绘图的时候,要先调用Android框架的Java代码,然后再调用skia(C/C++)绘图引擎代码,最后生成的CPU或者gpu的指令,在设备上完成绘图。而Flutter的APP在绘图的时候,是先调用Flutter框架的Dart代码,然后直接调用skia(C/C++)代码。所以只要Flutter框架Dart代码的效率可以媲美原生框架的Java代码的时候,那么Flutter的性能就可以媲美原生APP。

而如React Native,它首先要调用框架本身的JavaScript代码,然后再调用Android框架的Java代码,然后调用skia,这比原生的App运行过程多出了一个步骤,所以它的这个性能肯定是不及原生的。

国内知名的“闲鱼”技术团队对于Flutter在性能上逼近原生App的解释如下:

1.预先(AOT)编译,运行时直接执行Native(arm)代码;

2.必需的同Native通信(channel)是C++层次,性能好;

3.其线程模型中Dart代码执行(在UI TaskRunner),图片下载(IO TaskRunner),真正的渲染(GPU TaskRunner),同平台的通信等(Platform TaskRunner即Native概念下的主线程)是互相隔离的。透过将耗时的逻辑放入IO TaskRunner或新开Isolate(会在Dart线程池中执行);GPU TaskRunner可以将帧数据提交给GPU时UI TaskRunner已在准备下一帧数据这种流水线的机制提高了渲染速度;

4.Flutter层面针对布局等的优化:布局计算时单次树走动即可完成;Relayout Boundary机制:如果Child 的size是固定的,那么不会因为Child的Relayout导致Parent ReLayout;Repaint Boundry机制:如果树的某个子树如果同树的其他部分不同频地重绘,那么RenderRepaintBoundary可以改善性能。

5.Skia团队针对Flutter的优化。

6.框架的布局优化对上层开发透明。

如果你有一定的前端开发经验,特别是移动端的开发经验,或者深入探究过Flutter,上述内容应该不难理解。

如今,使用Flutter开发移动端App的教程铺天盖地,我来手把手教你如何使用Flutter搞定PC、Mac端开发,从此彻底打通前端跨平台。

PC端实战

1. 准备工作

首先我们要确保Flutter开发环境准备就绪。有关搭建开发环境的步骤,可参阅:

https://flutter.cn/docs/get-started/install

此处不再赘述,我们重点关注下面的操作:

到今天为止,在Stable分支上的Flutter SDK可以设置启用PC端开发的能力,但实际上是无法使用的。因此,我们需要将其切换到master分支上。切换的方法是在命令行窗口执行下面的语句:

flutter channel master

或许也可以直接git方式切换,但我没有尝试,感兴趣的朋友可以自行尝试。

在回显切换成功的提示后,记得执行

flutter upgrade

升级到最新的SDK(包含Dart)版本。

另外,如果你使用的是Windows的话,还需要安装Visual Studio开发软件,并安装Desktop development with C++的Workload(中文名为:工作负载)。如果是macOS,则无需安装Visual Studio。

2. 启用PC端开发支持

在命令行执行

flutter config --enable-windows-desktop

稍等几秒后即可完成。控制台将如下输出:

Setting "enable-windows-desktop" value to "true".

You may need to restart any open editors for them to read new settings.

成功启用后,执行

flutter devices

列出已连接的调试设备列表,首次执行可能会花费一些时间下载必要的开发工具包。随后,可以看到如下类似的输出结果:

1 connected device:

Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.18363.900]

其他操作系统环境类似。

另外,我们也可以随时执行

flutter config

查看目前的配置。还可以随时还原为默认设定。

Settings:

enable-windows-desktop: true

3. 创建项目

这一步无需多言,在相应的目录下执行

flutter create [项目名]

即可。

4. 迁移项目

对于之前没有启用PC端开发支持的工程,或者需要迁移到PC、Mac端的工程,需要在项目根目录下执行

flutter create .

(注意最后的点)

5. 运行程序

这一步无需多言,进入项目根目录,然后执行

flutter run

即可看到运行结果。

好了,接下来就是实现具体业务的环节了。

希望各位读者有所收获,祝工作顺利!

大前端时代搞定PC/Mac端开发,我有绝招的更多相关文章

  1. 2018年末--积极拥抱h5.转载 大前端时代来临,我们何去何从?

    1.大前端时代是什么? 大前端时代是WEB统一的时代,利用html5或者6甚至7,不但可以开发传统的网站,做炫酷的网页动态效果,更可以采用BS架构应用程序.开发手机端web应用.移动端Native应用 ...

  2. 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...

  3. 大话大前端时代(一) —— Vue 与 iOS 的组件化

    序 今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开发人员既写前端又写 Java 的 Velocity 模板而得来,不过现在大前端的范围已 ...

  4. Web大前端时代之:HTML5+CSS3入门系列

    准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...

  5. 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...

  6. 01.Web大前端时代之:HTML5+CSS3入门系列~初识HTML5

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 文档申明 <!--文档类型申明,html代表是ht ...

  7. 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...

  8. 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 2.功能元素 1.hgroup 对网页或区段(secti ...

  9. 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...

随机推荐

  1. 说出 Servlet 的生命周期,并说出 Servlet 和 CGI 的区别。

    Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派 遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当 ...

  2. (二)JPA实体类主键生成策略

    在JPA中,配置实体类的主键的生成策略使用 @GeneratedValue @Id @Column(name = "id") @GeneratedValue(strategy = ...

  3. fopen函数中的mode参数

    fopen FILE * fopen ( const char * filename, const char * mode ); 其中,参数mode可取以下值: "r"read: ...

  4. TensorFlow从0到1之TensorFlow实现反向传播算法(21)

    反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,它用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过程: 正向传播:输入被馈送到网络,信 ...

  5. 域名注册诈骗邮件We are an agency engaging in registering brand name and domain names

    最近收到了一封自称是某公司的邮件,说有人要注册我已经申请的域名,需要我回复确认,看邮件发件人是个人邮箱,通篇没有提到公司,也不是什么正规机构,大概率就是诈骗邮件了. 为了完全确认这封诈骗邮件,我登陆了 ...

  6. JSR133提案-修复Java内存模型

    目录 1. 什么是内存模型? 2. JSR 133是关于什么的? 3. 再谈指令重排序 4.同步都做了什么? 5. final字段在旧的内存模型中为什么可以改变? 6."初始化安全" ...

  7. 浅谈RegExp 对象的方法

    JavaScript RegExp 对象有 3 个方法:test().exec() 和 compile().(1) test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 tr ...

  8. SMB扫描-Server Message Block 协议、nmap

    版本 操作系统 SMB1 Windows 200.xp.2003 SMB2 Windows Vista SP1.2008 SMB2.1 Windows 7/2008 R2 SMB3 Windows 8 ...

  9. 深入理解RocketMQ(九)---实战(代码)

    一.批量发送消息 即多条消息放入List,一次发送,从而减少网络传输,提高效率 DefaultMQProducer producer = new DefaultMQProducer("bat ...

  10. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...